多くのクワッド、VBOにもかかわらず十分なfpsではない
-
27-10-2019 - |
質問
時間があり、VBOについて読んだことがあります。それが、私が得たものです:
http://img64.imageshack.us/img64/5733/fps8.jpg
わかりました、以前よりずっと良くなりました。リリース時にコンパイルされます。私はVBO(おそらくすべてがOKの場合)とglDrawArraysを使用して描画します。
これが描画コードです。最適化の方法を教えてください。地形が欲しかった...ええと、数千FPS、それは本当ですか? ジェネラコディセタグプレ
それで私はそれで何ができるのでしょうか? (上記のコードはメインの描画機能です)
編集
これを移動しました:
ジェネラコディセタグプレ
私の主な機能に。おそらく改善はありません。
edit2
さて、それが記憶を食べていることもわかります。数秒ごとにプログラムのメモリ使用量がますます増加しています...何が問題なのですか?削除しないものは?
edit3
わかりました、ありがとうございます。いくつかのコードを描画関数の外に移動しました...はるかに多くのfps!
どうもありがとう!
http://img197.imageshack.us/img197/5193/fpsfinal.jpg
これは640x640ブロック(つまり40倍大きい)マップで、650'000クワッド(約70倍)であり、それでも約170fpsです。すごい !そして、メモリリークはありません。もう一度ありがとう!
解決
DrawVBO関数には次のもののみを含める必要があります: ジェネラコディセタグプレ
残りの部分は、起動時(または地形が変化したときに)に1回だけ呼び出される別の関数に移動する必要があります。
他のヒント
すべてのバッファをリロードして、すべてのフレームで再び解放しますか?それをやめると、フレームレートが上がります。
作成したVBOを削除することはないため、現在のコードでは最終的にVBO識別子が不足することに注意してください。
拡張機能のリンクは間違いなくフレームごとに行う必要はありません。
目立つ点がいくつかあります:
描画関数では、ジオメトリデータにメモリを割り当てています ジェネラコディセタグプレ
メモリ割り当ては非常にコストのかかる操作です。これは、一度だけ実行する必要があるものの1つです。 OpenGLは「初期化」されることを意図していません– しかし、OpenGLに渡すデータ構造はそうです!
ここでは、新しく割り当てられたバッファをOpenGLに、フレームごとに何度もコピーしています。これは、何をすべきかとは正反対です。 ジェネラコディセタグプレ
VBOの全体的な考え方は、データを1回だけロードし、OpenGLにコピーしてから、再度再割り当てしないことです。これはOpenGLの初期化ではなく、データの初期化であり、完全に合理的なものであることに注意してください。変数にm_pVertices
とm_pTexCoords
という名前を付けて、それらがクラスメンバー変数であることを示しているようです。その場合、解決策は簡単です。初期化コード全体をローダー関数に移動します。また、裸のC ++配列の代わりに、std::vector
を使用することを強くお勧めします。
では、これを修正しましょう: ジェネラコディセタグプレ
補足:// Generate And Bind The Vertex Buffer
や// Set The Vertex Pointer To The Vertex Buffer
のようなコメントはあまり役に立ちません。これらのコメントは、とにかくコードから何を読み取ることができるかを冗長に伝えています。
コメントをコードに追加する必要がありますが、内部の仕組みがすぐには理解できない場合や、何かを修正するために何らかのハッキングを行う必要があり、このハッキングによって他の人や自分が数か月で困惑する場合があります。