フレームをスキップしたり繰り返したりすることなく、垂直同期ごとに正確に 1 つのレンダリングが実行されるように、垂直同期レンダリングを実行しようとしています。これは、Windows 7 および (将来的には) Windows 8 で動作するために必要です。
基本的にはQUADS
、元の画像のピクセルが画面上のピクセルと 1:1 で一致するように、画面に収まるシーケンスを描画することで構成されます。OpenGLでもDirectXでも、レンダリング部分は問題ありません。問題は正しい同期です。
WGL_EXT_swap_control
私は以前、描画してから呼び出して、拡張機能を使用してOpenGLを使用しようとしました
SwapBuffers(g_hDC);
glFinish();
glFlush() と一緒にこれら 2 つの命令のすべての組み合わせと順列を試しましたが、信頼できるものではありませんでした。
次に、描画してから呼び出すことにより、Direct3D 10で試しました
g_pSwapChain->Present(1, 0);
pOutput->WaitForVBlank();
ここでg_pSwapChain
とIDXGISwapChain*
はpOutput
そのIDXGIOutput*
SwapChain に関連付けられています。
OpenGL と Direct3D の両方のバージョンの結果は同じです。たとえば、60 フレームの最初のシーケンスは、本来あるべき状態で持続しません (60hz で約 1000 ミリ秒ではなく、1030 ミリ秒または 1050 ミリ秒のように持続します)。正常に動作しますが (約 1000.40ms)、時々フレームがスキップされるようです。で採寸しQueryPerformanceCounter
ます。
Direct3D で、WaitForVBlank だけのループを試行すると、1000 回の反復の継続時間は一貫して 1000.40 で、変動はほとんどありません。
したがって、ここでの問題は、呼び出された各関数がいつ戻るか、およびスワップが垂直同期中に行われたかどうか (テアリングを避けるために以前ではない) を正確に把握していないことです。
理想的には (私が間違っていなければ)、私が望むものを達成するには、1 つのレンダリングを実行し、同期が開始するまで待ち、同期中にスワップし、同期が完了するまで待ちます。OpenGLまたはDirectXでそれを行う方法は?
編集:
わずか 60x のテスト ループはWaitForVSync
、1000.30ms から 1000.50ms まで一貫してかかります。Present(1,0)
beforeを使用した同じループはWaitForVSync
、他に何もレンダリングせず、同じ時間がかかりますが、フレームを繰り返したかのように、失敗して 1017 ミリ秒かかる場合があります。レンダリングがないため、ここに何か問題があります。