【问题标题】:How to enable VSYNC in OpenGL如何在 OpenGL 中启用 VSYNC
【发布时间】:2010-01-18 04:32:00
【问题描述】:

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

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

【问题讨论】:

  • stackoverflow.com/questions/589064/… 提出同样的问题,但没有使用 GLEW,也没有找到解决方案。
  • SDL2 提供了启用垂直同步的功能。与 GLEW 相比,SDL2 与更多平台兼容,在我看来,这是一个更好的选择。然而,在创建 OpenGL 上下文后的 SDL2 中,您可以简单地调用:SDL_GL_SetSwapInterval(1),它会完成这项工作。如果您有兴趣,请在此处查看文档:wiki.libsdl.org/SDL_GL_SetSwapInterval

标签: c++ opengl vsync vertical-sync


【解决方案1】:

找到一个跨平台的解决方案并不容易是有原因的。平台最终拥有显示(和交换行为)。所以它必然是平台 API 的一部分(如果暴露的话)。真的不可能有一个跨平台的解决方案。当涉及到与平台的交互时,甚至 glew 也有一些特定于平台的部分。

现在你可以争辩说所有平台都应该为它们接口的特定部分使用相同的 API,但我怀疑你会从它们那里得到任何牵引力。

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

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

  • wglSwapIntervalEXT
  • glXSwapIntervalSGI
  • AGLSetInteger

【讨论】:

  • 这个。在 OpenGL 中,“跨平台”几乎总是意味着多条代码路径。 Vsync 在这种方式上并不是独一无二的。
  • 在 OSX 上,您希望将 Cocoa 与 DisplayLink 一起用于 vSync,而不是 AGL 与 carbon。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    NSOpenGLCPSwapInterval

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

    在 NSOpenGL.h 中声明。

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 1970-01-01
      • 2011-04-24
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 2012-04-20
      相关资源
      最近更新 更多