Platform SDK: DirectX

自動テクスチャ管理

テクスチャ管理とは、要するに、ある時点においてどのテクスチャがレンダリングに必要であるかを判断し、それらのテクスチャをビデオ メモリに確実にロードする処理である。ほかのアルゴリズムと同様、テクスチャ管理スキームもその複雑さはさまざまであるが、どのようなアプローチでテクスチャ管理を行う場合であっても、以下に示すタスクが重要である。

従来は、Direct3D アプリケーション自体でテクスチャ管理を行う必要があった。DirectX 6.0 の Direct3D 直接モードで導入された、システムによるテクスチャ管理により、Direct3D ではテクスチャ管理が効率的かつインテリジェントに行われ、テクスチャはパフォーマンス最適化のために確実にロードされる (Direct3D が管理するテクスチャ サーフェスを "管理下のテクスチャ" と呼ぶこともある)。

テクスチャ マネージャは、least-recently-used (LRU) アルゴリズムを用いて、削除する必要があるテクスチャを判断する。このアルゴリズムでは、テクスチャの最終使用時を示すタイムスタンプを利用してテクスチャを追跡する。メモリから削除するテクスチャが 2 つある場合、テクスチャの優先度に基づいてテクスチャが削除される。2 つのテクスチャの優先度が同じ場合は、最終使用時が新しい方のテクスチャが削除される。ただし、2 つのテクスチャでタイムスタンプが同じ場合は、優先度の低いテクスチャが先に削除される。

[C++]

テクスチャ サーフェスを作成するとき、その自動テクスチャ管理を要求する。C++ アプリケーションで管理下のテクスチャを取得するには、関連する DDSCAPS2 構造体の dwCaps2 メンバに DDSCAPS2_TEXTUREMANAGE または DDSCAPS2_D3DTEXTUREMANAGE フラグを含むテクスチャ サーフェスを作成するだけでよい。ただし、テクスチャの作成場所を指定することはできない。管理下のテクスチャを作成するときには、DDSCAPS_SYSTEMMEMORY または DDSCAPS_VIDEOMEMORY フラグは使用できない。管理下のテクスチャを作成した後、IDirect3DDevice7::SetTexture メソッドを呼び出して、その管理下のテクスチャをレンダリング デバイスのテクスチャ カスケードのステージに設定できる。

テクスチャ サーフェスに対して IDirectDrawSurface7::SetPriority メソッドを呼び出して、管理下のテクスチャに優先度を割り当てることができる。

[Visual Basic]

テクスチャを作成するときに、そのテクスチャの自動テクスチャ管理を要求する。Visual Basic から管理下のテクスチャを取得するには、関連する DDSCAPS2 型の lCaps2 メンバに DDSCAPS2_TEXTUREMANAGE または DDSCAPS2_D3DTEXTUREMANAGE フラグを含むテクスチャ サーフェスを作成する。ただし、テクスチャの作成場所を指定することはできない。管理下のテクスチャを作成するときには、DDSCAPS_SYSTEMMEMORY または DDSCAPS_VIDEOMEMORY フラグは使用できない。管理下のテクスチャを作成した後、Direct3DDevice7.SetTexture メソッドを呼び出して、その管理下のテクスチャをレンダリング デバイスのテクスチャ カスケードのステージに設定できる。

テクスチャ サーフェスに対して DirectDrawSurface7.SetPriority メソッドを呼び出して、管理下のテクスチャに優先度を割り当てることができる。

Direct3D では、必要に応じてテクスチャをビデオ メモリに自動的にダウンロードできる (システムは、非ローカル ビデオ メモリやその他の要素が使用可能であるかどうかによって、管理下のテクスチャをローカルまたは非ローカル ビデオ メモリにキャッシュする。管理下のテクスチャがキャッシュされる場所は、アプリケーションに通知されない。自動テクスチャ管理を利用する際に、この情報は必要ない)。アプリケーションで使用するテクスチャがビデオ メモリに収まらないほどある場合、Direct3D はビデオ メモリから古いテクスチャを削除して、新しいテクスチャ用の領域を確保する。削除したテクスチャを再度使用する場合、システムはオリジナル システム メモリ テクスチャ サーフェスを使用して、テクスチャをビデオ メモリ キャッシュに再ロードする。テクスチャの再ロードは、アプリケーションのパフォーマンスにわずかではあるが影響を与え、パフォーマンスの低下は避けられない。

テクスチャ サーフェスをブリットまたはロックすることで、テクスチャのオリジナル システム メモリ コピーを動的に変更できる。"汚れた" サーフェスが検出された場合 (ブリットの完了後、またはサーフェスのロック解除時)、テクスチャ マネージャはテクスチャのビデオ メモリ コピーを自動的に更新する。このときのパフォーマンスは、削除されたテクスチャを再ロードする場合と同様である。

[C++]

ゲームで新しいレベルに移る際、アプリケーションでビデオ メモリからすべての管理下のテクスチャをフラッシュしなければならないときがある。IDirect3D7::EvictManagedTextures メソッドを呼び出して、すべての管理下のテクスチャを削除するよう明示的に要求できる。このメソッドを呼び出すと、キャッシュされているローカルまたは非ローカル ビデオ メモリ テクスチャが Direct3D によって破棄されるが、オリジナル システム メモリ コピーはそのまま残る。

[Visual Basic]

ゲームで新しいレベルに移る際、アプリケーションでビデオ メモリからすべての管理下のテクスチャをフラッシュしなければならないときがある。Direct3D7.EvictManagedTextures メソッドを呼び出して、すべての管理下のテクスチャを削除するよう明示的に要求できる。このメソッドを呼び出すと、キャッシュされているローカルまたは非ローカル ビデオ メモリ テクスチャが Direct3D によって破棄されるが、オリジナル システム メモリ コピーはそのまま残る。