3

作成中の XNA ゲームのエンジンで衝突検出とオクルージョン カリングをテストするために、quadtree/BSP ハイブリッド プロトタイプを作成しました。

私が理解しているように、ハードウェア アクセラレーションが提供する最適化の 1 つは、頂点とインデックスのリストをカードに保存する機能です。これにより、関連付けられたジオメトリを描画するための呼び出しで、各フレームのモデル データを送信する必要がなくなります。

ジオメトリが多いレベルでは、これを XNA でどのように管理しますか? たとえば、私が OpenGL で作業していた場合、カードの内容のリストを維持し、更新が必要なものだけを送信します。ただし、XNA フレームワークの高度な抽象化レベルは、それをカプセル化して管理できないほどのレベルにあるようです。

なぜ私が間違っているのか、なぜ心配する必要がないのか教えてください。

4

1 に答える 1

2

XNA では、グラフィックス ドライバーは、指定したバッファーのプロパティに基づいて、頂点バッファーとインデックス バッファーを配置するのに最適なメモリを決定します。バッファが格納される場所に影響を与えることができる選択には、次のものがあります。

  • 動的バッファと通常バッファのどちらを使用するか

「ゲームが頻繁に頂点バッファーを変更する状況では、バッファーをインスタンス化するか、VertexBuffer クラスではなく DynamicVertexBuffer から派生させることをお勧めします。」

  • バッファを作成するときの使用パラメータ

WriteOnly "アプリケーションが頂点バッファーにのみ書き込みを行うことを示します。指定されている場合、ドライバーは効率的な書き込みとレンダリングのために最適なメモリ位置を選択します。書き込み専用の頂点バッファーから読み取ろうとすると失敗します。"

概要

バッファがどのように使用されるかについての情報があれば、グラフィックス ドライバは通常、バッファをどこに配置するかについて、ユーザよりも適切な決定を下すことができます。これは、各タイプのメモリの使用可能量と、その特定のシステムのメモリのパフォーマンス特性を認識しているためです。

注: xbox で動的な頂点とインデックス データを使用する XNA 3.1 以下の場合、DynamicVertexBuffer または DynamicIndexBuffer を使用するよりも、データをマネージド配列に格納して DrawUserPrimitives を使用する方が高速でした。

動的バッファーを使用することになった場合は、SetData を使用するときにパイプラインを停止させないように注意する必要があります。詳細については、 http://blogs.msdn.com/b/shawnhar/archive/2008/04/15/stalls-part-two-beware-of-setdata.aspxを参照してください。

于 2010-09-14T05:26:49.910 に答える