リソースの管理 (Direct3D 9)

リソース管理は、システム メモリ ストレージからデバイスにアクセス可能なストレージにリソースが昇格され、デバイスがアクセス可能なストレージから破棄されるプロセスです。 Direct3D ランタイムには、最近使用した優先度の手法に基づく独自の管理アルゴリズムがあります。 Direct3D は、IDirect3DDevice9::BeginScene 呼び出しと IDirect3DDevice9::EndScene 呼び出しの間で、デバイスにアクセス可能なメモリ内に共存できるリソースが 1 つのフレームで使用されていることを検出すると、最近使用された優先度の手法に切り替わります。

作成時に D3DPOOL_DEFAULT フラグを使用して、特定のリソースに対して要求された使用量のセットに最も適したメモリ プールにリソースを配置するように指定します。 これは通常、ローカル ビデオ メモリと高速グラフィックス ポート (AGP) メモリの両方を含むビデオ メモリです。 既定のプール内のリソースは、デバイスの失われた状態と動作状態の間の遷移によって保持されません。 これらのリソースは、reset を呼び出す前に解放し、再作成する必要があります。

マネージド リソースを指定するには、作成時に D3DPOOL_MANAGED フラグを使用します。 マネージド リソースは、デバイスの失われた状態と運用状態の切り替えを通じて保持されます。 これらのリソースは、ビデオ メモリとシステム メモリの両方に存在します。 マネージド リソースは、レンダリング中に必要なときにビデオ メモリにコピーされます。 デバイスは IDirect3DDevice9::Reset の呼び出しで復元でき、そのようなリソースはデータで再読み込みされずに正常に機能し続けます。 ただし、デバイスを破棄して再作成する必要がある場合は、すべてのリソースを再作成する必要があります。

高頻度で変更されるリソースでは、リソース管理は推奨されません。 たとえば、シーン グラフを走査するために使用される頂点バッファーとインデックス バッファーは、ユーザーに表示されるジオメトリのみをレンダリングするすべてのフレームが、すべてのフレームを変更します。 マネージド リソースはシステム メモリに基づくため、システム メモリ内で定数の変更を更新する必要があるため、パフォーマンスが著しく低下する可能性があります。 この特定のシナリオでは、 D3DUSAGE_DYNAMIC と共 にD3DPOOL_DEFAULT を使用する必要があります。

リソース管理が推奨されない (およびランタイムで明示的に許可されない) もう 1 つの例は、 D3DUSAGE_RENDERTARGETで作成されたテクスチャの管理です。 レンダー ターゲットによって使用されるメモリがランタイムによって管理されている場合、その内容はレンダリング中にシステム メモリに常にコピーする必要があり、パフォーマンスが大幅に低下します。 このため、レンダー ターゲットは既定のプールに作成する必要があります。 レンダー ターゲットに含まれるデータの CPU アクセスが必要な場合は、IDirect3DDevice9::UpdateTexture または IDirect3DDevice9::UpdateSurface を使用して、D3DPOOL_SYSTEMMEMで作成されたリソースにデータをコピーする必要があります。

デバイスの失われた状態の詳細については、「 紛失したデバイス (Direct3D 9)」を参照してください。

Direct3D リソース