3

500〜800 FPSなどのより高いフレームレートでOpenGLアプリケーション(ゲームなど)を実行するにはどうすればよいですか?

たとえば、AOE2は700FPS以上で実行されています(DirectXに関するものであることはわかっています)。ゲームループ内でバッファをクリアしてバッファを交換するだけですが、取得できるFPSは約200(最大)のみです。FPSが適切な測定ではないことは知っていますが(ハードウェアにも依存します)、OpenGLのいくつかの概念を見逃したように感じます。私はしましたか?pls誰もが私にヒントを与えることができますか?

4

4 に答える 4

3

空のディスプレイループ(GeForce 260 GTX、1920x1080)で約5.600FPSを取得しています。glClearを追加すると、4.000 FPSに下がりますが、これはまだ200をはるかに超えています...単純なグラフィックエンジン(AoE2スタイル)は、約100〜200 FPS(GeForce 8など)で実行する必要があります。マルチスレッドで完全に最適化されている場合は、おそらくもっと多くなります。

ループ内で正確に何をしているのか、どのハードウェアで実行されているのかはわかりませんが、200 FPSは、何も描画しない以外に何かをしているように聞こえます(スリープ、ゲームロジック、貪欲なフレームワーク、エアロ?)。両方のフレームバッファをコピーする必要がある場合でも、swapbuffer関数に5msかかることはありません。プロファイルを使用して、最もCPU時間が費やされている場所を確認できます(ただし、gl *関数からのタイミング結果はほとんど役に立ちません)

OpenGLで何かをしている場合(描画、テクスチャの作成など)、GL_EXT_timer_queryと呼ばれる時間を測定するための優れた拡張機能があります。

いくつかの一般的な最適化のヒント:

  • イミディエイトモード(glBegin / glEnd)を使用せず、代わりにVBOおよび/またはディスプレイリスト+頂点配列を使用してください
  • いくつかのカリング手法を使用して、ビューの外側のオブジェクトを削除します(openglはすべてのポリゴンを個別にカリングする必要があります)
  • 状態の変化を最小限に抑えてみてください。特に、バインドされたテクスチャまたは頂点バッファを変更してください。
于 2009-07-26T14:50:55.313 に答える
2

AOE 2 は、Direct3D ではなく、DirectDraw アプリケーションです。OpenGL と DirectDraw を比較する方法はありません。

また、バッファのスワップに使用している方法を確認してください。Direct3D には、flip メソッド、copy メソッド、discard メソッドがあります。最良の方法は破棄です。これは、バッファー内の以前の内容を気にせず、ドライバーがそれらを効率的に管理できるようにすることを意味します。

于 2009-07-26T12:06:13.713 に答える
0

テクスチャが小さい場合は、それらを 1 つの大きなテクスチャに結合し、テクスチャ座標を介してアドレス指定してみてください。これにより、多くの状態変更を節約できます。たとえば、テクスチャが 128x128 の場合、1 つの 512x512 テクスチャに 16 個のテクスチャを配置して、テクスチャ関連の状態の変化を 16 分の 1 に抑えることができます。

于 2009-09-07T22:17:05.610 に答える
0

あなたが見逃しているように見えることの1つは(あなたの答え/コメントから判断するので、間違っている場合は修正してください)、何をレンダリングするかを決定する必要があるということです。

たとえば、複数のレイヤーなどがあると言ったように、最初に行う必要があるのは、画面外にあるものをレンダリングしないことです (これは可能であり、時々行われます)。また、確実に見えないものはレンダリングしないでください。たとえば、最上層の一部の領域が透明でない (または塗りつぶされている) 場合は、その下のレイヤーをレンダリングしないでください。

一般的に私が言おうとしているのは、ほとんどの場合、すべてのものをレンダリングして一番上にあるものだけがレンダリングされたイメージになるようにするよりも、ロジックで目に見えないものを排除する方が良いということです。

于 2009-07-26T14:02:20.863 に答える