在 Mac OS X 上,CVDisplayLink提供了一种可靠地更新屏幕以实现 60 fps 动画而不会撕裂的好方法。Windows上是否有类似的界面,兼容OpenGL?
在等待垂直同步时当然可以阻塞,但这不适用于需要同时动画的多个窗口。在 Windows 上,它们都将相互等待(因此两个等待垂直同步的窗口将下降到 30 fps),这与 OS X 不同。
例如,视频播放器如何实现平滑的屏幕更新?
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 ) 在我测试过的任何硬件上都没有实现这一点。