WGL_EXT_swap_control 扩展允许在 Windows 上执行此操作,但我什至无法找到任何远程跨平台执行相同操作的内容,即将我的缓冲区交换与屏幕刷新同步。我的应用程序使用 GLEW,所以由它提供的东西会更好。对 Linux、Mac 和 Windows 的跨平台支持是必要的,但如果无法设置同步(例如,用户在他的图形驱动程序中强制关闭),我的应用程序不会中断。
我将接受在许多平台上使用 GLEW 执行此操作的程序代码作为有效答案。
WGL_EXT_swap_control 扩展允许在 Windows 上执行此操作,但我什至无法找到任何远程跨平台执行相同操作的内容,即将我的缓冲区交换与屏幕刷新同步。我的应用程序使用 GLEW,所以由它提供的东西会更好。对 Linux、Mac 和 Windows 的跨平台支持是必要的,但如果无法设置同步(例如,用户在他的图形驱动程序中强制关闭),我的应用程序不会中断。
我将接受在许多平台上使用 GLEW 执行此操作的程序代码作为有效答案。
找到一个跨平台的解决方案并不容易是有原因的。平台最终拥有显示(和交换行为)。所以它必然是平台 API 的一部分(如果暴露的话)。真的不可能有一个跨平台的解决方案。当涉及到与平台的交互时,甚至 glew 也有一些特定于平台的位。
现在你可以争辩说所有平台都应该为它们接口的特定部分使用相同的 API,但我怀疑你会从它们那里得到任何牵引力。
最后,并非所有帧缓冲区都直接显示。如果您碰巧使用的窗口管理系统实际上将帧缓冲区像素混合到桌面(就像 Aero 在活动时所做的那样),那么您无论如何都无法控制交换行为。
作为参考,在主要平台上执行此操作的各种 API:
从http://www.opengl.org/wiki/Swap_Interval (间接http://www.opengl.org/registry/specs/SGI/swap_control.txt):
在 Linux 中,事情要简单得多。如果
GLX_SGI_swap_control
存在于 返回的字符串中glGetString(GL_EXTENSIONS)
,则可以使用glXSwapIntervalSGI(0)
禁用 vsync 或glXSwapIntervalSGI(1)
启用 vsync(也称为垂直同步)。
NSOpenGLCPSwapInterval
设置或获取交换间隔。交换间隔表示为一长。如果交换间隔设置为 0(默认值),则 flushBuffer 方法会尽快执行,而不考虑监视器的垂直刷新率。如果交换间隔设置为 1,则仅在监视器的垂直回扫期间交换缓冲区。在 Mac OS X v10.0 及更高版本中可用。
在 NSOpenGL.h 中声明。