2012-03-04 13 views
1

これは、XNAのSpriteBatchesに関するパフォーマンスに関する質問です。 XNAで描画を開始するには、spritebatch.Begin()を使用する必要があります。これは、使用されるシェーダのように、たくさんのものを指定する方法です。スプライトによって異なるシェーダが使用される可能性があるため、問題が発生します。私はいくつかのチュートリアルを見ました。開始と終了はすべての単一オブジェクトの描画呼び出しで使用されました。私はすべてのスプライトが独自のシェーダを使用できるようにしたいので、これをしたいと思います。パフォーマンスの問題を引き起こさずにこれを行うにはどうすればよいですか?SpriteBatch.BeginおよびSpriteBatch.End

答えて

3

各スプライトに独自のシェーダを使用させる場合、おそらくそれらのシェーダの一部が同じシェーダを共有します。可能な限り最大限のパフォーマンスを得るために、それらのスプライトが同じバッチに入っていることを確認してください。

(これは、シェーダによって、あなたのオブジェクトを並べ替え、およびバッチを変更するときを検出するためにいくつかのかなり醜いか、かなり複雑なコードを必要とするかもしれません。あなたはちょうどそれと一緒に暮らす必要があります。)

SpriteBatchの背後にある考え方はそれということです文字通りスプライトを一緒にバッチしてからGPUに送ります。 begin/endブロック内のテクスチャを変更するか、または新しいbegin/endブロックを開始するには、新しいバッチが必要です。

1フレームあたり数百回のバッチがあります。

詳細については、ゲーム開発サイトのthis answerとおそらくthis answerを参照してください。

+0

ありがとうございますが、パフォーマンスヒットなしにフレームあたり100バッチを実行できるとお伝えしていますか? – user1152717

+0

基本的にはyesです。バッチはフリーではありません - それぞれCPU時間を使います。バッチ制限は、CPU時間がなくなり、FPSがFPSターゲットの下に落ちて補償する前に、各フレームにどれくらいのバッチを割り当てることができるかを表現する方法に過ぎません。 「数百」はゲームの典型的な制限です。 –