适用于Windows的CVDisplayLink替代方案?

时间:2012-05-14 14:03:23

标签: windows macos opengl animation vsync

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

当然可以在等待vsync时阻塞,但这不能扩展为需要同时进行动画处理的多个窗口。在Windows上,它们都会互相等待(所以每个等待vsync的窗口都会降低到30 fps),这与OS X不同。

例如视频播放器可以实现流畅的屏幕更新吗?

1 个答案:

答案 0 :(得分:1)

Windows的典型架构与Mac不同,因为您可以控制主循环而不是OS库 - 不需要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

我总是实现'而不是vsyncing'的方式是渲染单缓冲而不是调用SwapBuffers ...因为wglSwapIntervalEXT(0)在我测试它的任何硬件上都没有实现这一点。