Microsoft DirectX 8.0 (Visual Basic) |
テクスチャ管理とは、ある時点においてどのテクスチャがレンダリングに必要であるかを判断し、それらのテクスチャをビデオ メモリに確実にロードする処理である。ほかのアルゴリズムと同様、テクスチャ管理スキームもその複雑さはさまざまであるが、どのようなアプローチでテクスチャ管理を行う場合であっても、以下に示すタスクが重要である。
Microsoft® Direct3D® では、システムによるテクスチャ管理が実装されており、テクスチャはパフォーマンス最適化のために確実にロードされる。Direct3D が管理するテクスチャ リソースを管理下のテクスチャと呼ぶ。
テクスチャ マネージャは、テクスチャの最終使用時を示すタイムスタンプを利用してテクスチャを追跡する。次に、LRU (least-recently-used) アルゴリズムを用いて、削除する必要があるテクスチャを判断する。メモリから削除するテクスチャが 2 つある場合、テクスチャの優先度に基づいてテクスチャが削除される。2 つのテクスチャの優先度が同じ場合は、最終使用時が新しい方のテクスチャが削除される。ただし、2 つのテクスチャでタイムスタンプが同じ場合は、優先度の低いテクスチャが先に削除される。
テクスチャを作成するときに、そのテクスチャの自動テクスチャ管理を要求する。Microsoft® Visual Basic® アプリケーションで管理下のテクスチャを取得するには、Direct3DDevice8.CreateTexture を呼び出し、Pool パラメータに D3DPOOL_MANAGED を指定して、テクスチャ リソースを作成する。ただし、テクスチャの作成場所を指定することはできない。管理下のテクスチャを作成するときには、D3DPOOL_DEFAULT または D3DPOOL_SYSTEMMEM フラグは使用できない。管理下のテクスチャを作成した後、Direct3DDevice8.SetTexture メソッドを呼び出して、その管理下のテクスチャをレンダリング デバイスのテクスチャ カスケードのステージに設定できる。
テクスチャ サーフェスに対して Direct3DResource8.SetPriority メソッドを呼び出して、管理下のテクスチャに優先度を割り当てることができる。
Direct3D では、必要に応じてテクスチャをビデオ メモリに自動的にダウンロードできるシステムは、非ローカル ビデオ メモリやその他の要素が使用可能であるかどうかによって、管理下のテクスチャをローカルまたは非ローカル ビデオ メモリにキャッシュする。管理下のテクスチャがキャッシュされる場所は、アプリケーションに通知されない。自動テクスチャ管理を利用する際に、この情報は必要ない。アプリケーションで使用するテクスチャがビデオ メモリに収まらないほどある場合、Direct3D はビデオ メモリから古いテクスチャを削除して、新しいテクスチャ用の領域を確保する。削除したテクスチャを再度使用する場合、システムはオリジナル システムメモリ テクスチャ サーフェスを使用して、テクスチャをビデオメモリ キャッシュに再ロードする。テクスチャの再ロードが必要であるが、これを行うとアプリケーションのパフォーマンスが低下する。
テクスチャ リソースを更新またはロックすることで、テクスチャのオリジナル システム メモリ コピーを動的に変更できる。ダーティー サーフェスが検出された場合 (更新の完了後、またはサーフェスのロック解除時)、テクスチャ マネージャはテクスチャのビデオ メモリ コピーを自動的に更新する。このときのパフォーマンスは、削除されたテクスチャを再ロードする場合と同様である。
ゲームで新しいレベルに移る際、アプリケーションでビデオ メモリからすべての管理下のテクスチャをフラッシュしなければならないときがある。すべての管理下のテクスチャを削除するよう明示的に要求するには、Direct3DDevice8.ResourceManagerDiscardBytes メソッドを呼び出して、Bytes パラメータに 0 の値を指定する。このメソッドを呼び出すと、キャッシュされているローカルまたは非ローカル ビデオメモリ テクスチャが Direct3D によって破棄されるが、オリジナル システムメモリ コピーはそのまま残る。
リソース管理の詳細については、「リソースの管理」を参照すること。