1. ホーム
  2. c++

[解決済み] opengl: glFlush() vs. glFinish()

2022-09-05 05:23:47

質問

を呼び出すことの実用的な違いについて困っています。 glFlush()glFinish() .

ドキュメントによると glFlush() であり glFinish() は、バッファリングされたすべての操作を OpenGL にプッシュし、それらがすべて実行されることを保証します。 glFlush() が即座に返すのに対して glFinish() は全ての処理が完了するまでブロックする。

定義を読んで、私は、もし私が glFlush() を使うなら、おそらくOpenGLが実行できる以上の操作を提出する問題にぶつかるだろうと思いました。そこで、試しに私の glFinish()glFlush() と入力すると、驚くことに、私のプログラムは (私が知る限り) まったく同じように動作しました。

2 つの呼び出しに大きな違いがあるのか、それとも私のコードでは違いはないのか、疑問に思っています。または、一方が他方に対して使用されるべき場所です。 また、OpenGL には、次のような呼び出しがあるだろうと思いました。 glIsDone() に対して、バッファリングされたコマンドがすべて実行されたかどうかをチェックします。 glFlush() のバッファリングされたコマンドがすべて完了したかどうかをチェックする必要がありますが(そうすれば、実行可能な速度よりも速くOpenGLに操作を送ることはありません)、私はそのような関数を見つけられませんでした。

私のコードは典型的なゲームループです。

while (running) {
    process_stuff();
    render_stuff();
}

どのように解決するのですか?

これらのコマンドはOpenGLの初期から存在していることに注意してください。 glFlushは、以前のOpenGLコマンドである は有限の時間で完了しなければならない ( OpenGL 2.1 の仕様 245ページ)。フロントバッファに直接描画する場合、これはOpenGLドライバがあまり遅延なく描画を開始することを保証するものです。各オブジェクトの後でglFlushを呼び出すとき、スクリーン上のオブジェクトの後に現れる複雑なシーンを考えることができます。しかし、ダブルバッファリングを使用する場合、バッファを交換するまで変更が見えないので、glFlushは実質的に全く効果がありません。

glFinish は、以前に発行されたコマンド [...] からのすべての効果が完全に実現されるまで戻りません。 . これは、あなたのプログラムの実行が、最後のピクセルが描画され、OpenGLがそれ以上何もすることがなくなるまで、ここで待機することを意味します。フロントバッファに直接レンダリングする場合、glFinishはスクリーンショットを撮るためにオペレーティングシステムの呼び出しを使用する前に行うべき呼び出しです。ダブルバッファリングでは、強制的に完了させた変更を見ることができないので、はるかに有用ではありません。

したがって、もしあなたがダブルバッファリングを使用するなら、おそらくglFlushもglFinishも必要ないでしょう。SwapBuffersは暗黙のうちにOpenGLの呼び出しを正しいバッファに誘導します。 は、最初にglFlushを呼び出す必要はありません。 . そして、OpenGLドライバにストレスを与えることを気にしないでください: glFlushは、あまりに多くのコマンドで窒息することはありません。この呼び出しが すぐに (そのため、コマンドを処理するのに必要な時間がかかることがあります。