0

OpenGL をベース レンダラーとしてレンダリング エンジンを開発しています。レンダラーは最初は 150 fps で開始し、30 秒ほどで fps は 500 に増加します。エンジンの各部分の時間を個別に測定しましたが、速度が増加する唯一の部分は、[静的]VBO と呼び出しをバインドする drawMesh 関数です。 glDrawArrays。

結果として同じ動作をする glPush および glGet 関数についてもコメントしました。

これは、エンジンを実行するたびに発生し、カメラが動かされず、まったく同じシーンをレンダリングし続けている場合でも発生します。

これがどのように起こっているのか誰にも分かりますか?

4

2 に答える 2

1

問題

この問題は、作成後にVBOがバッファーにマップされることで発生します。モデルクラスはこれを1回実行して、境界を更新します。パーティクルの場合は、必要なデータでバッファを更新します。

ビデオカード(または少なくともGeforce GTS 450を搭載している場合)は、特にバッファのマッピングにGL_READ_WRITE_ARBフラグを使用する場合、VBOのマッピングを解除した直後にデータをビデオカードにコピーし直さないようです。データをVRAMにコピーして戻す前に、データを数秒間外部RAMに保持します。

ソリューション

GL_READ_ONLY_ARBフラグを使用して、データの読み取りのみを想定しているデータをマップすることにより、バッファーはほぼ直接VRAMにコピーされます。ただし、私の場合、メッシュの会話中に境界を計算し、そのような目的でVBOが作成されたら、データにまったくアクセスしない方がはるかに効率的です。

于 2013-02-06T16:22:29.873 に答える
0

シェーダーが最初に使用される前にジャストインタイムでコンパイルされるためかもしれません。

GL_ARB_get_program_binaryを見てください

また、初期化フェーズでシェーダーをロードするときに、シェーダーを使用して三角形をレンダリングしてみてください(おそらくこれは画面外で実行できます)。

于 2013-02-04T17:09:16.240 に答える