次の方法で共有


自動テクスチャー管理 (Direct3D 9)

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

  • 使用可能なテクスチャー メモリーの量を追跡する。
  • レンダリングに必要なテクスチャーと不要なテクスチャーを計算する。
  • 既存のテクスチャー リソースのうちで別のテクスチャー イメージを再ロードできるもの、破棄する必要があるサーフェス、および新しいテクスチャー リソースで置き換える必要があるサーフェスを特定する。

Direct3D は、システムでサポートされているテクスチャー管理を実装します。テクスチャーは、最適なパフォーマンスになるようにロードされます。Direct3D が管理するテクスチャー リソースを管理テクスチャーと呼びます。

テクスチャー管理では、テクスチャーの最終使用時刻を示すタイムスタンプを使用してテクスチャーを追跡します。その際、"最近最も使われていないテクスチャー" のアルゴリズムを使用して、削除する必要があるテクスチャーを特定します。メモリーから削除する対象として特定されたテクスチャーが 2 つある場合は、最終的な決定手段としてテクスチャーの優先順位が使用されます。2 つのテクスチャーの優先順位が同じ場合は、最近最も使われていないテクスチャーが削除されます。ただし、2 つのテクスチャーのタイムスタンプが同じ場合は、優先順位の低いテクスチャーが最初に削除されます。

テクスチャー サーフェスの自動テクスチャー管理は、テクスチャー サーフェスを作成するときに要求します。C++ アプリケーションで管理テクスチャーを取得するには、IDirect3DDevice9::CreateTexture を呼び出してテクスチャー リソースを作成し、Pool パラメーターに D3DPOOL_MANAGED を指定します。ただし、テクスチャーを作成する場所を指定することはできません。管理テクスチャーを作成するときに、D3DPOOL_DEFAULT または D3DPOOL_SYSTEMMEM フラグを使用することはできません。管理テクスチャーを作成したら、IDirect3DDevice9::SetTexture メソッドを呼び出して、そのテクスチャーをレンダリング デバイスのテクスチャー カスケードのステージに設定することができます。

管理テクスチャーに優先順位を割り当てるには、テクスチャー サーフェスに対して IDirect3DResource9::SetPriority メソッドを呼び出します。

Direct3D では、必要に応じて、テクスチャーがビデオ メモリーに自動的にダウンロードされます。非ローカル ビデオ メモリーが使用可能かどうかなどの要素によって、管理テクスチャーはローカル ビデオ メモリーにキャッシュされることもあれば、非ローカル ビデオ メモリーにキャッシュされることもあります。管理テクスチャーがキャッシュされる場所は、アプリケーションには通知されません。自動テクスチャー管理を使用する際に、この情報は必要ありません。アプリケーションで使用するテクスチャーがビデオ メモリーに収まらない場合、Direct3D は、ビデオ メモリーから古いテクスチャーを削除して、新しいテクスチャーの領域を確保します。削除したテクスチャーを再度使用する場合は、元のシステムメモリー テクスチャー サーフェスを使用して、テクスチャーをビデオメモリー キャッシュに再ロードします。テクスチャーの再ロードは必要ですが、アプリケーションのパフォーマンスが低下します。

テクスチャー リソースを更新またはロックすることで、テクスチャーの元のシステムメモリー コピーを動的に変更することができます。ダーティー サーフェスが検出された場合 (更新の完了後やサーフェスのロック解除時)、テクスチャー管理では、テクスチャーのビデオ メモリー コピーが自動的に更新されます。このとき、削除したテクスチャーを再ロードする場合と同様にパフォーマンスが低下します。

ゲームで新しいレベルに移る際、アプリケーションでは IDirect3DDevice9::EvictManagedResources を呼び出して、ビデオ メモリーのすべての管理テクスチャーのフラッシュが必要になることがあります。

リソース管理の詳細については、「リソースの管理 (Direct3D 9)」を参照してください。