Share via


デバイス タイプと頂点処理の要件 (Direct3D 9)

変換やライティングなどの頂点処理のパフォーマンスは、メモリー内で頂点バッファーが配置される場所と使用されているレンダリング デバイスのタイプに大きく依存します。アプリケーションは、頂点バッファーの作成時にメモリーの割り当てを制御します。D3DPOOL_SYSTEMMEM メモリー フラグが設定されている場合、頂点バッファーはシステム メモリーに作成されます。D3DPOOL_DEFAULT メモリー フラグが使用されている場合は、デバイス ドライバーが頂点バッファー用メモリーの割り当てに最適な場所を決定します。このようなメモリーはドライバー最適化メモリーとも呼ばれます。ドライバー最適化メモリーには、ローカル ビデオ メモリー、非ローカル ビデオ メモリー、またはシステム メモリーが指定されます。

IDirect3DDevice9::CreateVertexBuffer で D3DUSAGE_SOFTWAREPROCESSING 定数を設定すると、頂点バッファー データに対するソフトウェア頂点処理が有効になります。混合モード時のソフトウェア頂点処理にはこのフラグが必要です。このフラグはハードウェア頂点処理モードには使用できません。ソフトウェア頂点処理で使用される頂点バッファーには、次のものがあります。

頂点バッファーのメモリーの場所をシステムにするかドライバー最適化にするかを決定する理由は、テクスチャーの場合と同じです。変換やライティングなどの頂点処理をハードウェアで行う場合は、頂点バッファーがドライバー最適化メモリーに割り当てられている場合に最も優れたパフォーマンスを得られます。一方、ソフトウェア頂点処理は頂点バッファーがシステム メモリーに割り当てられている場合に最もパフォーマンスが良くなります。テクスチャーの場合は、ハードウェアによるラスター化はテクスチャーがドライバー最適化メモリーに割り当てられているときに最もパフォーマンスが良くなり、ソフトウェアによるラスター化はシステム メモリー内のテクスチャーで最もパフォーマンスが良くなります。

Microsoft Direct3D 9 は、IDirect3DDevice9::ProcessVertices メソッドで、プリミティブをレンダリングしない、頂点のスタンドアロン処理をサポートします。このスタンドアロン頂点処理は、常にホスト プロセッサー上のソフトウェアで実行されます。このため、IDirect3DDevice9::SetStreamSource でソース セットとして使用される頂点バッファーは、D3DUSAGE_SOFTWAREPROCESSING フラグを使用して作成する必要があります。IDirect3DDevice9::ProcessVertices で提供される機能は、ソフトウェア頂点処理を使用している場合の IDirect3DDevice9::DrawPrimitive および IDirect3DDevice9::DrawIndexedPrimitive メソッドの機能と同じです。

アプリケーションが独自の頂点処理を実行し、変換済み、ライティング済み、およびクリップ済みの頂点をレンダリング メソッドに渡す場合、アプリケーションはドライバー最適化メモリーに割り当てられた頂点バッファーに直接頂点を書き込むことができます。このテクニックにより、その後の冗長なコピー処理が防止されます。アプリケーションが頂点バッファーから再びデータを読み取る場合は、ホストによって実行されるドライバー最適化メモリーからの読み取り処理が非常に遅くなる場合があるため、このテクニックはそれほど効果的ではないことに注意してください。このため、アプリケーションにおいて、処理中のデータの読み取りやバッファーへのデータの書き込みを不規則に実行する必要がある場合は、システム メモリーの頂点バッファーを選択するほうが効果的です。

Direct3D の頂点処理機能を使用する (未変換の頂点を頂点バッファー レンダリング メソッドに渡す) 場合は、デバイス タイプとデバイス作成フラグに応じてハードウェアまたはソフトウェアで処理が発生します。ほぼすべてのケースで最適なパフォーマンスを得るには、頂点バッファーを D3DPOOL_DEFAULT に割り当てることを推奨します。デバイスがハードウェア頂点処理を使用している場合は、D3DUSAGE_DYNAMIC および D3DUSAGE_WRITEONLY フラグに基づいて実行可能な追加の最適化処理が多数あります。これらのフラグの使用方法の詳細については、「IDirect3DDevice9::CreateVertexBuffer」を参照してください。