2

まず、ゲームをプログラミングしています。現在、render関数には、2つの異なる関数への2つの呼び出しがあります。1つはテキストをレンダリングし、もう1つはスプライトをレンダリングします。

私のコンピューター(AMD Phenom(tm)II X4 955プロセッサー(4 CPU)、〜3.2GHz、4096MB RAM DDR2、NVIDIA GeForce GTX 285)では、約200スプライトをレンダリングする場合は約2200 FPS、約100FPSの場合はレンダリング速度があります。約14,500をレンダリングします。

レンダリングしている各オブジェクトの情報を格納するためにベクトルを使用しており、多くの描画呼び出しで1つのスプライトを使用しています。

C++用に完全に最適化されたVS2008リリースモード。左右が時期尚早に最適化されないと聞いたことがありますが、現時点では、それは私にとってはうまく機能していますが、特定のコンピューターではあまりうまく機能していません。

不確定な方法で、フレームごとにベクトルから物事をプッシュおよびプルしているため、配列のベクトルを変更することは想像できません。ほぼランダムに。

私はフロートとダブルを試しましたが、速度も同じです。

DirectXではなくDirectDrawとSpriteRenderメソッドを使用した場合は異なりますか?DirectDrawとDirectXの違いがわからないので、100%考えるべきではありません。

ゲームは平均的なコンピューターで問題なく動作しますが、私のゲームと比較しているのは東方です。東方は私が試した中で最も弱いコンピューターで60FPSで実行されますが、私のゲームは36〜42FPSより速く実行されません。DirectXとC++に慣れていないので、自分が間違っていることを想像することはできません。

この件に関する支援は素晴らしいものですが、残念ながら私はしばらくの間、情報を追加したり質問に答えたりすることはありません。

4

4 に答える 4

5

プロファイラーが必要です。

応答にはいくつかの優れたパフォーマンスアドバイスがありますが、それは問題ではありません。プロファイラーを使用せずにプログラムを最適化しようとすることは、コンパイラーを使用せずにプログラムを作成しようとすることに似ています。推測しないで、測定してください。

そうは言っても、グラフィックコードのプロファイリングは首の悪名高い痛みであり、(私の知る限り)それを支援する優れた無料のツールはありません。したがって、今のところ気にしないでください。通常のCPUプロファイラーから始めて、どの呼び出しが実際にすべての時間を費やしているかを調べます。

于 2010-02-17T19:53:46.637 に答える
1

アプリケーションのプロファイルを作成し、ボトルネックがCPUかGPU(または2つの間の転送バス)かを判断します。判断したら、いくつかの選択肢があります。

1)CPUの場合は、インスタンス化してドローコールの数を減らすことができます。または、ターゲットマシンがハードウェアインスタンス化をサポートしていない場合は、一種のバッチ処理を試してください。スプライトをインスタンス化またはバッチ処理するには、デフォルトのインターフェイスと同じようにQUAD(2つの三角形の向き)を使用する必要があります。

2)GPUの場合は、シェーダーが速度低下を引き起こしているかどうかを理解してください。その場合は、最適化してみてください。シェーダーでない場合は、オーバードローを減らすようにしてください。オブジェクトの一部が前面から背面への描画を使用して透明でない場合。

3)BUSの場合は、CPUと同じように実行してください。バッチ処理の場合と同様に、データを転送するために必要なロック/ロック解除の数を減らします。(インスタンス化すると、バッファをまったく更新する必要がなくなります)

それで全部です。:P

PS警告...CPUプロファイラーを使用してDirectX呼び出しをプロファイリングしようとしないでください。(ただし、nVidiaのPerfHudまたはATIのGPUPerfStudio、またはIntelのGPAを使用してください)ちょうど時間が失われ、DirectXにはコマンドバッファーがあり、現在行われた呼び出しがその時間に実行される保証はありません。ほとんどの場合、すぐに戻り、何もしません。

于 2010-02-18T08:58:46.240 に答える
1

不確定な方法で、フレームごとにベクトルから物事をプッシュおよびプルしているため、配列のベクトルを変更することは想像できません。ほぼランダムに。

ベクトルの後ろ以外の位置に物を挿入および/または削除していますか?ベクトルでは、中央からの挿入と削除にはO(n)時間がかかります。つまり、かかる時間はベクトルのサイズに比例します。

その場合は、std::list代わりに使用することを検討してください。10k以上のオブジェクトでは、実行頻度によっては、パフォーマンスの問題が発生しやすいことに注意してください。

于 2010-02-17T17:45:53.227 に答える
1

レンダリングしている各オブジェクトの情報を格納するためにベクトルを使用しており、多くの描画呼び出しで1つのスプライトを使用しています。

あなたの言っていることがよくわかりませんが、これはあなたが多くの異なる場所で本質的に同じオブジェクトを描いているように聞こえます。その場合は、DirectXインスタンス化を検索することをお勧めします。基本的な考え方は、1)描画するジオメトリ、および2)描画する場所の数を指定することです。これにより、オブジェクトを描画するたびにジオメトリを再指定する手間が省けるため、速度を大幅に向上させることができます。

于 2010-02-17T17:31:56.470 に答える