キー入力に応じてさまざまなものを描画する単純なOpenGLテストアプリをCで作成しています。(Mesa 8.0.4、Mesa-EGLおよびGLFW、NVIDIA GTX650を搭載したPC上のUbuntu 12.04LTSで試した)。ドローは非常にシンプル/高速です(回転三角形タイプのもの)。私のテストコードは、フレームレートを意図的に制限するものではなく、次のようになっています。
while (true)
{
draw();
swap_buffers();
}
私はこれを非常に注意深く計時しており、1つのeglSwapBuffers()
(またはglfwSwapBuffers
、同じもの)呼び出しから次の呼び出しまでの時間は〜16.6ミリ秒であることがわかりました。eglSwapBuffers()
描画されたものは非常に単純ですが、呼び出し後から次の呼び出しの直前までの時間は、それより少しだけ短くなります。スワップバッファの呼び出しにかかる時間は1ミリ秒未満です。
ただし、アプリがキーの押下に応じて描画内容を変更してから実際に画面に表示されるまでの時間は、> 150ms(約8〜9フレーム)です。これは、画面とキーボードを60 fpsでカメラで記録して測定されます。
したがって、質問:
スワップバッファーの呼び出しと実際に画面に表示される呼び出しの間の描画はどこにバッファーされますか?なぜ遅れるの?アプリが常に画面の前に多くのフレームを描画しているようです。
OpenGLアプリケーションは、画面にすぐに描画するために何ができますか?(つまり、バッファリングなし、描画が完了するまでブロックするだけです。高スループットは必要ありません。低遅延が必要です)
上記の即時抽選をできるだけ早く行うためにアプリケーションは何ができますか?
アプリケーションは現在、実際に画面上にあるものをどのようにして知ることができますか?(または、現在のバッファリング遅延はどのくらいの長さ/何フレームですか?)