如何在OpenGL中启用VSYNC

时间:2010-01-18 04:32:00

标签: c++ opengl vsync vertical-sync

WGL_EXT_swap_control扩展允许在Windows上执行此操作,但我无法找到任何甚至远程跨平台执行相同的操作,即同步我的缓冲区交换屏幕刷新。我的应用程序使用GLEW,所以提供的东西更可取。对Linux,Mac和Windows的跨平台支持是必要的,但如果无法设置同步,我的应用程序将不会中断(例如,用户已将其强制关闭在图形驱动程序中)。

我将接受程序代码在许多平台上使用GLEW作为有效答案。

4 个答案:

答案 0 :(得分:6)

有一个原因是找到跨平台解决方案并不容易。平台最终拥有显示(以及交换行为)。所以它必然是平台API的一部分(如果暴露)。实际上并不存在跨平台解决方案。在涉及与平台的交互时,即使是glew也有一些特定于平台的位。

现在您可以争辩说,所有平台都应该为其界面的特定位使用相同的API,但我怀疑您是否会从中获得任何吸引力。

最后,并非所有帧缓冲区都直接显示。如果您正在使用实际将帧缓冲像素混合到桌面的窗口管理系统(就像Aero在活动时那样),那么您无论如何都无法控制交换行为。

供参考,在主要平台上执行此操作的各种API:

  • wglSwapIntervalEXT
  • glXSwapIntervalSGI
  • AGLSetInteger

答案 1 :(得分:1)

来自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   (又名垂直同步)。

答案 2 :(得分:0)

这听起来很讨厌,让你自己想一下Mac OS X上的哪个调用,但this guy似乎有某种解决方案。

答案 3 :(得分:0)

对于OS X,请查看http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSOpenGLContext_Class/Reference/Reference.html

  

NSOpenGLCPSwapInterval

     

设置或获取交换间隔。交换   interval表示为一个long。如果交换间隔设置为0   (默认值),flushBuffer方法尽快执行,   不考虑显示器的垂直刷新率。如果   swap interval设置为1,缓冲区仅在交换期间交换   显示器的垂直回扫。适用于Mac OS X v10.0和   后面。

     

在NSOpenGL.h中声明。