Platform SDK: DirectX |
トランスフォームやライティングなどの頂点処理のパフォーマンスは、頂点バッファのメモリ内での位置座標と、使用されるレンダリング デバイスの種類に大きく依存する。頂点バッファを作成すると、アプリケーションはその頂点バッファへのメモリ アロケーションを制御できる。頂点バッファの記述に D3DVBCAPS_SYSTEMMEMORY 能力フラグが設定されているときは、システム メモリに頂点バッファが作成される。この能力フラグを使用しない場合は、頂点バッファ用のメモリの最良の割り当て場所をデバイス ドライバが決定し、このようにして決定されたメモリのことを多くの場合 "ドライバ最適化" メモリと呼ぶ。ドライバ最適化メモリとしては、ローカル ビデオ メモリ、非ローカル ビデオ メモリ、またはシステム メモリが指定される。
IDirect3DDevice7::DrawPrimitiveVB、IDirect3DDevice7::DrawIndexedPrimitiveVB、または IDirect3DVertexBuffer7::ProcessVertices メソッドを呼び出すと、Direct3D は頂点処理を適用する。これらの頂点処理には、トランスフォーム、ライティングなどがある。これらの呼び出しのパフォーマンスは、メモリ内でのバッファの位置座標、およびその位置座標が特定の種類のデバイス (ハードウェアまたはソフトウェア) に対して最適なものであるかどうかによって異なる。
Direct3DDevice7.DrawPrimitiveVB、Direct3DDevice7.DrawIndexedPrimitiveVB、または Direct3DVertexBuffer7.ProcessVertices メソッドを呼び出すと、Direct3D は頂点処理を適用する。これらの頂点処理には、トランスフォーム、ライティングなどがある。これらの呼び出しのパフォーマンスは、メモリ内でのバッファの位置座標、およびその位置座標が特定の種類のデバイス (ハードウェアまたはソフトウェア) に対して最適なものであるかどうかによって異なる。
頂点バッファがシステム メモリにあるか、ドライバ最適化メモリにあるかを調べる必要があるのは、テクスチャの場合と同じ理由からである。テクスチャの場合、ハードウェア ラスタ化には、ドライバ最適化メモリに割り当てられたテクスチャが最適で、ソフトウェア ラスタ化には、システム メモリに割り当てられたテクスチャが最適である。同様に、ハードウェアにおける頂点処理 (トランスフォームやライティングなど) に最適なのは、ドライバ最適化メモリに割り当てられた頂点バッファで、ソフトウェアでの頂点処理に最適なのは、システム メモリに割り当てられた頂点バッファである。
注 : ProcessVertices メソッドによる頂点処理は、常にソフトウェアで実行する必要があるため、転送元頂点バッファは常にシステム メモリに割り当てられる必要がある。アプリケーションで転送先頂点バッファを直接ロックして読み出さない限り、また、ProcessVertices (頂点バッファ レンダリング メソッドが呼び出されたとき、頂点バッファからの読み取りを要求する) の呼び出しでクリッピングが要求される場合には、転送先頂点バッファはドライバ最適化メモリに割り当てることができる。
アプリケーションが独自の頂点処理を実行する (および、トランスフォーム済みで、ライティングが適用され、クリッピングされた頂点を頂点バッファ レンダリング メソッドに渡す) 場合、アプリケーションはドライバ最適化メモリに割り当てられた頂点バッファに頂点を直接書き込むことができる。この方法により、以降の冗長なコピー処理を防止する。ただし、ドライバ最適化メモリからホストによって実行される読み取り処理は、非常に処理速度が遅いことがあるため、アプリケーションが頂点バッファからデータを読み返す場合には、この方法はうまく機能しない。したがって、アプリケーションで処理中に読み取り、またはバッファへのデータ書き込みを不規則に実行する必要がある場合は、システム メモリに頂点バッファを割り当てるとよい。
Direct3D 頂点処理機能を使用する場合 (未トランスフォームの頂点を頂点バッファ レンダリング メソッドに渡して)、デバイスの種類に応じてハードウェアまたはソフトウェアのいずれかで処理が実行できる。デバイスが TnLHAL デバイス (IID_IDirect3DTnLHALDevice) の場合、頂点処理はハードウェアで行われるため、最高のパフォーマンスを得るにはドライバ最適化メモリに頂点バッファを作成する。デバイスが HAL デバイス (IID_IDirect3DHALDevice) の場合、頂点処理はソフトウェアで行われるため、システム メモリに頂点バッファを作成する。RGB デバイス (IID_IDirect3DRGBDevice) でレンダリングする場合は、すべての頂点バッファをシステム メモリに割り当てる。
次の C++ コードは、頂点バッファを作成および処理するときに適用するロジックをまとめたものである。
if (ソフトウェアのラスタ化) システム メモリの頂点バッファを使用する。(D3DVBCAPS_SYSTEMMEMORY) else if (アプリケーションの頂点処理) if (アプリケーションで読み取りおよび不規則な書き込みを行わない) ドライバ最適化メモリの頂点バッファを使用する。 else システム メモリの頂点バッファを使用する。(D3DVBCAPS_SYSTEMMEMORY) else // Direct3D の頂点処理。 if (TnLHAL デバイス) ドライバ最適化メモリの頂点バッファを使用する。 else if (HAL デバイス) システム メモリの頂点バッファを使用する。(D3DVBCAPS_SYSTEMMEMORY)
次の Visual Basic コードは、頂点バッファを作成および処理するときに適用するロジックをまとめたものである。
If (ソフトウェアのラスタ化) Then システム メモリの頂点バッファを使用する。(D3DVBCAPS_SYSTEMMEMORY) Else If (アプリケーションの頂点処理) Then If (アプリケーションで読み取りおよび不規則な書き込みを行わない) Then ドライバ最適化メモリの頂点バッファを使用する。 Else システム メモリの頂点バッファを使用する。(D3DVBCAPS_SYSTEMMEMORY) Else // Direct3D の頂点処理。 If (TnLHAL デバイス) Then ドライバ最適化メモリの頂点バッファを使用する。 Else If (HAL デバイス) システム メモリの頂点バッファを使用する。(D3DVBCAPS_SYSTEMMEMORY) End If