遅すぎるので、xnaモデルの代わりに単一の面を描きたいです。
でも違いはわかりません
- DrawPrimitives
- DrawUserPrimitives
- DrawIndexedPrimitives
- DrawUserIndexedPrimitives
どれが最速の方法ですか?そして、インデックスは何に適していますか?
遅すぎるので、xnaモデルの代わりに単一の面を描きたいです。
でも違いはわかりません
どれが最速の方法ですか?そして、インデックスは何に適していますか?
あなたの質問に対する簡単な答えは、 " "バージョンは、呼び出されるたびに頂点データを(ドライバーとバスを介して)GPUに転送する必要があるため、CPUではUser
かなり遅いということです。
非User
バージョンは、GPUにすでに存在する頂点バッファーとインデックスバッファーを使用します(ロード時にそれらを配置します)。転送するデータがかなり少ないため、高速です。
「 」バージョンUser
と「 」バージョンは、それぞれGPUIndexed
のパフォーマンスに影響を与えます。この影響は比較的小さいです。一般的に言って、あなたはそれについて心配する必要はありません。
データがフレームごとに変更されると高速になるため、これらのUser
バージョンが存在します。非バージョンの描画関数でDynamicVertexBuffer
使用できるものもあります。バッファを希望のサイズに事前に割り当てることができる場合User
の方法よりも少し速いと思います。User
これらのIndexed
バージョンでは、インデックスバッファを使用して、頂点バッファから頂点を選択できます(したがって、描画する三角形は、頂点バッファ内の任意の位置にある頂点を選択できます)。別の方法は、頂点バッファが(に基づくPrimitiveType
)三角形の頂点のシーケンシャルリストとして単純に解釈されることです。インデックスバッファが存在する主な理由は、頂点バッファ内の重複する頂点の必要性を排除することです(これには、追加のメモリとGPUでの処理が必要になります)。
しかし...
XNAのModel
クラスは内部的にを使用しDrawIndexedPrimitives
ます。それだけでなく、それを正しく使用します(つまり、最高のパフォーマンスを得るために、単一の面を描画しませんが、一度にできるだけ多くの面を描画します)。したがって、遅いことがわかった場合、問題は他の場所にあります。
「解決策」を選択する前に、ゲームのパフォーマンスが低下している理由を診断することをお勧めします。たぶん、ここ(またはhttps://gamedev.stackexchange.com/ )の質問でそれを行うための助けを求めてください。
可能であれば、すべてを一度に行うと、インスタントドローの方が常に優れていますが、すべてのテクスチャを一度に与える必要があります。私の場合、たとえば、1つのテクスチャだけでインスタンス化されたオブジェクトを描画するのが好きです...すべての木、すべての地面、すべての建物など...