4

私はプラットフォーマーゲームを作成しようとしています。さまざまなスプライトブロックを取り、それらをつなぎ合わせてレベルを描画しています。これには、フレームごとに画面上に多数のスプライトを描画する必要があります。優れたコンピューターは、すべてのスプライトの描画を問題なく処理できますが、古いコンピューターのパフォーマンスに影響を及ぼし始めます。これは大きなゲームではないので、ほとんどすべてのコンピューターで実行できるようにしたいと思います。現在、次のDirectX関数を使用してスプライトを描画しています。

D3DXVECTOR3 center(0.0f, 0.0f, 0.0f);

D3DXVECTOR3 position(static_cast<float>(x), static_cast<float>(y), z);

(my LPD3DXSPRITE object)->Draw((sprite texture pointer), NULL, &center, &position, D3DCOLOR_ARGB(a, r, g, b));

これらの絵を画面に描くためのより効率的な方法はありますか?それほど複雑でない画像ファイル(現在は通常のpngを使用しています)を使用して処理を高速化する方法はありますか?

要約すると、DirectXでスプライトを描画するための最もパフォーマンスに優しい方法は何ですか?ありがとう!

4

2 に答える 2

4

使用しているID3DXSPRITEインターフェースは、すでにかなり効率的です。可能であれば、スプライトの開始呼び出しと終了呼び出しの間に、すべてのスプライト描画呼び出しが1つのバッチで行われるようにします。これにより、スプライトインターフェイスが最も効率的な方法で描画を配置できるようになります。

パフォーマンスを向上させるために、複数の小さなテクスチャを1つの大きなテクスチャにロードし、テクスチャ座標を使用してそれらを取り出すことができます。これにより、テクスチャを頻繁に交換する必要がなくなります。見る:

http://nexe.gamedev.net/directknowledge/default.asp?p=ID3DXSprite

テクスチャにプリロードされている限り、テクスチャに使用しているファイルタイプは重要ではありません。ゲーム/レベルがロードされているときに、それらをすべてテクスチャに一度ロードするようにしてください。それらをテクスチャにロードすると、元々どのフォーマットであったかは関係ありません。

それでも目的のパフォーマンスが得られない場合は、PIXを使用してアプリケーションのプロファイルを作成し、ボトルネックが実際にどこにあるかを見つけてください。

編集:

これは長すぎてコメントに収まらないので、この投稿を編集します。

テクスチャを交換するとは、SetTextureを使用してテクスチャステージにバインドすることを意味します。SetTextureが呼び出されるたびに、テクスチャステージの状態が変化するため、パフォーマンスがわずかに低下します。通常、この遅延はかなり小さいですが、DirectXがテクスチャをシステムメモリからビデオメモリにプルする必要がある場合は、問題になる可能性があります。

ID3DXspriteは、開始呼び出しと終了呼び出しの間にある描画を並べ替えます。つまり、SetTextureは通常、描画する順序に関係なく、テクスチャごとに1回だけ呼び出されます。

多くの場合、小さなテクスチャを大きなテクスチャにロードする価値があります。たとえば、すべての小さなテクスチャを1つの大きなテクスチャに収めることができた場合、テクスチャステージは、すべての描画でそのテクスチャにバインドされたままになります。通常、これは顕著な改善をもたらしますが、テストはそれがどれだけ役立つかを確実に知る唯一の方法です。ひどいように見えますが、大きなテクスチャを挿入して、それを組み合わせたもののふりをして、パフォーマンスの違いをテストすることができます。

于 2011-07-01T21:15:25.177 に答える
2

私はdschaefferに同意しますが、多数の異なるテクスチャを使用している場合は、それらを1つ(または少数)の大きなテクスチャにまとめて、それに応じて異なるスプライトのテクスチャ座標を調整する方がよい場合があることを付け加えたいと思います。テクスチャリング状態の変更には多くのコストがかかり、これにより古いシステムでは処理が高速化される可能性があります。

于 2011-07-01T21:43:49.300 に答える