ここにはいくつかの大きなパフォーマンスの問題があります
そのため、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 は結果が (スレッドから) 利用可能になるまで待機しますか?