5

XNAで2Dゲームを作っています。描画可能なゲーム コンポーネントを使用する場合、どちらがパフォーマンスに優れていますか?

1. コンポーネントが画面に表示されていない場合はコンポーネント リストから削除し、画面に表示されている場合は追加します。

2. オフスクリーンで描画関数を実行しない場合 (「起動」ブール フィールドと、描画関数内のすべてを if ステートメントで囲むことにより)

現在、方法 2 を使用していますが、問題なく動作します。コンポーネントの描画順序が変更されないのは便利です(それらを削除して再度追加すると変更され、それを管理するためのコードがさらに必要になります)実際、コンポーネントリストにない場合は更新されないことに気付きました画面上にあるかどうかを追跡するために何か他のものが必要になります..

また、私はプロファイラーを備えた豪華なバージョンのビジュアルスタジオを持っていないので、ここで人々が自分の経験からどう思うかを尋ねています.

4

1 に答える 1

6

SpriteBatch を使用しているときに見過ごされがちな CPU パフォーマンスの概念は、スプライトをバッチ処理する方法です。また、描画可能なゲーム コンポーネントを使用しても、スプライトを効率的にバッチ処理することは容易ではありません。

基本的に、スプライトを描画する GPU は遅くなく、すべてのスプライトをバッチにまとめる CPU も遅くありません。遅い部分は、CPU が描画する必要があるものを GPU に通信する必要がある場合です (バッチ情報を送信します)。spriteBatch.Draw() を呼び出した場合、この CPU から GPU への通信は行われません。spriteBatch.End() を呼び出すと発生します。そのため、spriteBatch.End() の呼び出し頻度を減らすことで、効率化を容易に達成できます。(もちろん、これは Begin() の呼び出し頻度も少なくなることを意味します)。また、spriteSortMode.Imediate は慎重に使用してください。これは、CPU が各スプライト情報を GPU に即座に送信する (遅い) ためです。

したがって、各ゲーム コンポーネント クラスで Begin() と End() を呼び出し、多くのコンポーネントがある場合、不必要に多くの時間を費やすことになり、画面外のスプライトを心配するよりも、より優れたバッチ処理スキームを考え出す時間を節約できるでしょう。 .

余談: いずれにせよ、GPU はピクセル シェーダーからオフスクリーン スプライトを自動的に無視します。そのため、CPU でオフスクリーン スプライトをカリングしても、GPU 時間は節約されません...

于 2013-01-24T14:11:57.470 に答える