7

Mac OS Xでは、CVDisplayLinkは、画面を確実に更新して、ティアすることなく60fpsのアニメーションを実現するための優れた方法を提供します。OpenGLと互換性のある同様のインターフェイスがWindowsにありますか?

もちろん、vsyncの待機中にブロックすることは可能ですが、これは、同時にアニメーション化する必要がある複数のウィンドウには対応していません。Windowsでは、OS Xとは異なり、すべてが互いに待機します(したがって、vsyncを待機する2つのウィンドウはそれぞれ30 fpsに低下します)。

たとえば、ビデオプレーヤーはどのようにしてスムーズな画面更新を実現しますか?

4

1 に答える 1

1

Windows の典型的なアーキテクチャは、OS ライブラリではなくメイン ループを制御できるため、Mac とは異なります。CVDisplayLink に相当するものは必要ありません (ただし、API が優れていれば、特定の情報をそれほど知る必要はありません)。これを達成するために)。

無限にスピンするループを使用している場合は、ループの最後で vsync を待っても問題ありません。複数のウィンドウがある場合は、すべてのレンダリングが送信された後、「メイン更新ループ」が vsync を待って終了するように、それに応じてレンダリングをスケジュールする必要があります。

通常、私は次のようなものを持っています:

while(!toldToQuit)
{
    Render();
    Update();

    WaitForVsync();
}

これにより、(次のフレームの) 更新のための CPU 作業が、レンダリングのための GPU 作業と並行して発生することができます...

SwapBuffers( HDC ) は、ドライバーがデフォルトの動作として vsync を持っている場合、vsync を待ちます。そうでない場合、vsync を設定するための wgl 拡張機能があります - wglSwapIntervalEXT( int ):

http://www.opengl.org/registry/specs/EXT/wgl_swap_control.txt

私が常に「非 vsyncing」を達成する方法は、単一のバッファリングをレンダリングし、SwapBuffers を呼び出さないことです... wglSwapIntervalEXT( 0 ) は、テストしたどのハードウェアでもこれを達成しないためです。

于 2012-12-11T18:36:45.320 に答える