7

在 Mac OS X 上,CVDisplayLink提供了一种可靠地更新屏幕以实现 60 fps 动画而不会撕裂的好方法。Windows上是否有类似的界面,兼容OpenGL?

在等待垂直同步时当然可以阻塞,但这不适用于需要同时动画的多个窗口。在 Windows 上,它们都将相互等待(因此两个等待垂直同步的窗口将下降到 30 fps),这与 OS X 不同。

例如,视频播放器如何实现平滑的屏幕更新?

4

1 回答 1

1

Windows 的典型架构与 Mac 不同,因为您可以控制主循环而不是操作系统库 - 不需要 CVDisplayLink 等价物(当然,如果 API 更好,您不需要了解太多具体信息为达到这个)。

如果您使用的是无限旋转的循环,那么在循环结束时等待 vsync 就可以了。如果您有多个窗口,您需要相应地安排您的渲染,以便您的“主更新循环”在所有渲染提交后等待 vsync 结束。

通常我有这样的事情:

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

    WaitForVsync();
}

这允许 CPU 更新工作(下一帧)与 GPU 渲染工作一起发生......

如果驱动程序将此作为其默认行为,SwapBuffers( HDC ) 将等待 vsync,否则有一个用于设置 vsync 的 wgl 扩展 - wglSwapIntervalEXT( int ):

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

我一直实现“非垂直同步”的方式是通过渲染单个缓冲而不调用 SwapBuffers ......因为 wglSwapIntervalEXT( 0 ) 在我测试过的任何硬件上都没有实现这一点。

于 2012-12-11T18:36:45.320 回答