リソースの管理 (Direct3D 9)

リソース管理は、リソースがシステム メモリー ストレージからデバイスがアクセス可能なストレージに移行され、デバイスがアクセス可能なストレージから破棄されるまでのプロセスです。Direct3D ランタイムには、最近使用されていない最も古いものが優先される方式に基づいた独自の管理アルゴリズムがあります。Direct3D は、1 つのフレーム内 (IDirect3DDevice9::BeginScene 呼び出しと IDirect3DDevice9::EndScene 呼び出しの間) でデバイスがアクセス可能なメモリーに同時に存在できる数を超えたリソースが使用されたことを検出すると、最近使用されたものが優先される方式に切り替えます。

特定のリソースで要求されている一連の使用法に最適なメモリー プールにリソースが配置されるように指定するには、リソース作成時に D3DPOOL_DEFAULT フラグを使用します。通常、これはローカル ビデオ メモリーと AGP (accelerated graphics port) メモリーを含めたビデオ メモリーです。既定のプール内にあるリソースは、デバイスが喪失状態と使用可能状態の間を移行すると失われます。このようなリソースは、リセット呼び出しの前に解放し、その後再作成する必要があります。

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

リソース管理は頻繁に変更されるリソースには推奨されません。たとえば、シーン グラフのトラバースに使用される頂点バッファーとインデックス バッファーの場合、ユーザーに表示されるジオメトリだけをレンダリングしてもすべてのフレームが変更されます。マネージ リソースはシステム メモリーに保持されるため、常時変更される内容をシステム メモリーで更新する必要があり、パフォーマンスの大幅な低下を招く場合もあります。この例の場合は、D3DPOOL_DEFAULTD3DUSAGE_DYNAMIC とともに使用する必要があります。

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

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