Direct3D 11 でのマルチスレッドの概要

マルチスレッドは、1 つ以上のスレッドを同時に使用して作業を実行することでパフォーマンスを向上するように設計されています。

以前は、レンダリング用に 1 つのメイン スレッドを生成し、オブジェクトの作成、読み込み、処理などの準備作業を行うための 1 つ以上のスレッドを生成することで、多くの場合にこれを行っていました。 ただし、Direct3D 11 の組み込みの同期では、マルチスレッドの背後にある目標は、プロセッサが別のプロセッサを待機することなく、すべての CPU と GPU サイクルを利用することです (特に、フレーム レートに直接影響するため、GPU 待機を行いません)。 これにより、最適なフレーム レートを維持しながら、最も多くの作業量を生成できます。 API が同期を実装するため、レンダリング用の単一フレームの概念は不要になりました。

マルチスレッドには、何らかの形式の同期が必要です。 たとえば、アプリケーションで実行される複数のスレッドが 1 つのデバイス コンテキスト (ID3D11DeviceContext) にアクセスする必要がある場合、そのアプリケーションでは、重要なセクションなどの一部の同期メカニズムを使用して、そのデバイス コンテキストへのアクセスを同期する必要があります。 これは、レンダリング コマンドの処理 (通常は GPU で行われます) とレンダリング コマンドの生成 (通常は、オブジェクトの作成、データ読み込み、状態の変更、データ処理を通じて CPU で行われます) では、多くの場合、同じリソース (テクスチャ、シェーダー、パイプラインの状態など) を使用するためです。 複数のスレッド間で作業を整理するには、あるスレッドが別のスレッドによって変更されているデータを変更または読み取らないように同期する必要があります。

デバイス コンテキスト (ID3D11DeviceContext) の使用はスレッド セーフではありませんが、Direct3D 11 デバイス (ID3D11Device) の使用はスレッド セーフです。 各 ID3D11DeviceContext はシングル スレッドであるため、一度に ID3D11DeviceContext を呼び出すことができるスレッドは 1 つだけです。 複数のスレッドが 1 つの ID3D11DeviceContext にアクセスする必要がある場合は、クリティカル セクションなどの一部の同期メカニズムを使用して、その ID3D11DeviceContext へのアクセスを同期する必要があります。 ただし、 1 つの ID3D11Device にアクセスするためにクリティカル セクションまたは同期プリミティブを使用する場合、複数のスレッドは必要ありません。 そのため、アプリケーションで ID3D11Device を 使用してリソース オブジェクトを作成する場合、そのアプリケーションは同期を使用して複数のリソース オブジェクトを同時に作成する必要はありません。

マルチスレッドのサポートにより、API は 2 つの異なる機能領域に分割されます。

マルチスレッドのパフォーマンスは、ドライバーのサポートによって異なります。 方法: ドライバーのサポートを確認 すると、ドライバーのクエリと結果の意味に関する詳細情報が提供されます。

Direct3D 11 は、マルチスレッドをサポートするようにゼロから設計されています。 Direct3D 10 では、 スレッド セーフ レイヤーを使用したマルチスレッドの限定的なサポートが実装されています。 このページでは、DirectX の 2 つのバージョンの動作の違いを示します。 Direct3D バージョン間のスレッドの違い

マルチスレッドと DXGI

イミディエイト コンテキストを使用するスレッドは、一度に 1 つだけです。 ただし、アプリケーションでは、特にアプリケーションが IDXGISwapChain::P resent メソッドを呼び出す場合は、Microsoft DirectX Graphics Infrastructure (DXGI) 操作にも同じスレッドを使用する必要があります。

Note

ほとんどの DXGI インターフェイス関数と同時に即時コンテキストを使用することは無効です。 2009 年 3 月以降の DirectX SDK の場合、安全な DXGI 関数は AddRefReleaseQueryInterface のみです。

 

複数のスレッドで DXGI を使用する方法の詳細については、「 マルチスレッドに関する考慮事項」を参照してください。

マルチスレッド