3

私が継承した DirectX 9 アプリケーション/ゲームは、動的頂点バッファーを使用します。各フレーム、それ:

  1. 頂点バッファをロックします
  2. メッシュを循環し、頂点データを一時バッファー (プログラムの開始時に動的に割り当てられる) がいっぱいになるまで書き込みます。
  3. 一時バッファの内容を頂点バッファにコピーします
  4. すべてのデータがコピーされるまで、手順 2 と 3 を繰り返します
  5. 頂点バッファのロックを解除します

私の質問は、一時バッファを持つ部分が必要ですか? 頂点データを頂点バッファーに直接書き込むべきではない理由はありますか?
公式ドキュメントでこの慣行の証拠を見つけられませんでした。また、以前のプログラマーを十分に信頼していません。

4

3 に答える 3

2

一時バッファは必要ありませんが、注意が必要です。

DirectX 動的頂点バッファーは、GPU による読み取りアクセスとCPU による書き込みアクセス用に最適化されています。書き込みアクセスの最適化は書き込み結合と呼ばれ、通常のメモリ キャッシングとは異なるメカニズムを伴います。メモリに 4/8/16 バイトのチャンクで順番に書き込むと、CPU は書き込みをまとめてバッチ処理します。

動的バッファーのロックからどのような種類のメモリを取得するかを決定するのはドライバー次第であることに注意してください。書き込み結合ではない可能性がありますが、そのように扱うことが最善の策です。

書き込み結合メモリはキャッシュされないため、そこから読み取るとパフォーマンスが低下します。

継承したゲームが一時バッファーへの読み取りと書き込みを行う場合、またはコンポーネントを順番に書き込む努力をしない場合に一時バッファーを使用する理由を説明できます。たとえば、最初に配置してからテクスチャ座標を配置します。

于 2012-07-12T20:50:30.370 に答える
2

免責事項: DirectX の頂点バッファーがどのように機能するかわかりません。ここで間違っている可能性があります。

おそらく遅くなるでしょう: GPU からのアクセスを最適化するために頂点バッファが割り当てられます。つまり、CPU から直接アクセスすると、通常の RAM にアクセスするよりもはるかに遅くなります。一方、配列全体のコピーは比較的高速に実行できるため、そのような配列をメイン メモリに準備し、一度に頂点バッファーにコピーすることをお勧めします。

于 2012-05-17T13:05:20.387 に答える
0

一時バッファは必要ありません。返されたポインタLockは、本質的に、実際にはすでに一時的なバッファです。ドライバーは、バッファーのロックを解除した後にのみ、意味のある操作を現実的に開始できます。

を使用する場合D3DLOCK_DISCARD、ドライバーは、適切なデータを使用して読み取りを行う義務を負いません。したがって、実装は完全に を返すことができますmalloc(size)

を使用しない場合D3DLOCK_DISCARD、それは別の問題です。

于 2012-07-12T21:17:59.743 に答える