glFlush()
通話との実際的な違いを区別するのが困難ですglFinish()
。
ドキュメントには、 はバッファリングされたすべての操作を OpenGL にプッシュしglFlush()
、glFinish()
すべての操作が実行されることを保証できると書かれていますが、違いは、 はglFlush()
直ちに戻るのに対し、 はglFinish()
すべての操作が完了するまでブロックすることです。
定義を読んで、それを使用すると、glFlush()
OpenGL が実行できる以上の操作が送信されるという問題に直面するだろうと考えました。そこで、試しに を に交換してみたところ、glFinish()
なんとglFlush()
、私のプログラムは (私が知る限り) まったく同じように動作しました。フレーム レート、リソース使用量、すべてが同じでした。
そこで、2 つの呼び出しに大きな違いがあるのか、それとも私のコードでは実行に違いがないのか、またはどちらを使用するべきか疑問に思っています。また、OpenGL には、バッファリングされたglIsDone()
すべてのコマンドがglFlush()
完了しているかどうかを確認するような呼び出しがあると考えました (そのため、OpenGL に操作が実行可能よりも速く送信されません)。しかし、そのような関数は見つかりませんでした。
私のコードは典型的なゲーム ループです。
while (running) {
process_stuff();
render_stuff();
}
ベストアンサー1
これらのコマンドはOpenGLの初期の頃から存在していることに注意してください。glFlushは以前のOpenGLコマンドが限られた時間内に完了する必要がある(OpenGL 2.1 仕様、245 ページ)。フロント バッファに直接描画すると、OpenGL ドライバがあまり遅延せずに描画を開始できるようになります。各オブジェクトの後に glFlush を呼び出すと、画面にオブジェクトが次々に表示される複雑なシーンを考えることができます。ただし、ダブル バッファリングを使用する場合、バッファを交換するまで変更が表示されないために、glFlush は実質的にまったく効果がありません。
gl終了以前に発行されたコマンドのすべての効果が完全に実現されるまで戻りません。これは、最後のピクセルがすべて描画され、OpenGL が何もすることがなくなるまで、プログラムの実行がここで待機することを意味します。フロント バッファーに直接レンダリングする場合は、オペレーティング システム コールを使用してスクリーンショットを撮る前に、glFinish を呼び出します。強制的に完了させた変更が表示されないため、ダブル バッファリングではあまり役に立ちません。
したがって、ダブルバッファリングを使用する場合は、glFlushもglFinishもおそらく必要ありません。SwapBuffersはOpenGL呼び出しを暗黙的に正しいバッファに向けます。最初にglFlushを呼び出す必要はありません. OpenGLドライバに負荷をかけることを気にしないでください。glFlushはコマンドが多すぎても詰まることはありません。この呼び出しが返される保証はありません。すぐに(それが何を意味するかは関係ありません)、コマンドの処理に必要な時間がかかる可能性があります。