在Mac OS X上,CVDisplayLink提供了一种可靠地更新屏幕以实现60 fps动画而不会撕裂的好方法。 Windows上是否有类似的界面,与OpenGL兼容?
当然可以在等待vsync时阻塞,但这不能扩展为需要同时进行动画处理的多个窗口。在Windows上,它们都会互相等待(所以每个等待vsync的窗口都会降低到30 fps),这与OS X不同。
例如视频播放器可以实现流畅的屏幕更新吗?
答案 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)在我测试它的任何硬件上都没有实现这一点。