リソースの管理 (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 リソース