6

ここにはいくつかの大きなパフォーマンスの問題があります

そのため、GPU側でいくつかの測定を行いたいと思います。

このスレッドを読んで、gl エラー チェックと swapBuffers() を含む描画関数の周りにこのコードを書きました (自動スワッピングは実際には無効になっています)。

        gl4.glBeginQuery(GL4.GL_TIME_ELAPSED, queryId[0]);
        {    
            draw(gl4);

            checkGlError(gl4);

            glad.swapBuffers();
        }
        gl4.glEndQuery(GL4.GL_TIME_ELAPSED);
        gl4.glGetQueryObjectiv(queryId[0], GL4.GL_QUERY_RESULT, frameGpuTime, 0);

そして、OpenGL レンダリング コマンドは非同期であると想定されているため(ドライバーは、1 つのバッチでまとめて送信する前に最大 X コマンドをバッファーに入れることができます)、私の質問は基本的に次の場合を考慮します。

  • 上記のコードは正しいです

  • 新しいフレームの開始時に、以前のすべての GL コマンド (前のフレームから) が GPU 上で送信、実行、および終了されたと仮定するのは正しいことです。

  • クエリ結果を取得するglGetQueryObjectivと、GL_QUERY_RESULTこれまでのすべての GL コマンドが終了したと思いますか? つまり、OpenGL は結果が (スレッドから) 利用可能になるまで待機しますか?

4

1 に答える 1