2

我知道在 Windows 上获得屏幕刷新率的两种方法。第一个是简单的EnumDisplaySettings函数,它填充一个包含以 fps 为单位的舍入屏幕刷新率值的结构。第二个是使用 DirectX,在初始化期间,您可以选择通过将分子和分母相除来检索刷新率。

根据我自己的经验,第一种方法是不够的。我的笔记本电脑显示器无法达到 60 的精确帧速率 - 相反,它有多种设置,以 fps 为单位分别在 59.9 和 60.1 左右。第二种方法给了我一个精确的浮点值,可以用来实现垂直同步的效果,而不需要直接使用垂直同步。

我之所以这样问是因为 OpenGL 中缺乏可靠的 VSync,而且我不想在启动时依赖额外的图形 API 仅将其用于一个小功能。还有其他方法吗?

4

1 回答 1

1

跟进我们的评论,实际上 VSYNC 会导致阻塞......但更准确地说,它会在交换链充满需要交换的后台缓冲区时阻塞。三重缓冲可用于减少 VSYNC 实现中的阻塞,但 WGL 和 GLX 都不公开对交换链中后备缓冲区数量的任意控制,因此您必须修改驱动程序设置以在 OpenGL 上下文中启用它。

在 OpenGL 中,GL 本身不处理缓冲区交换或 VSYNC,正如我在前面的评论中指出的那样,您必须使用特定于平台的窗口系统层(例如 WGL、GLX、AGL/CGL、EGL)来设置称为交换间隔

  • 将交换间隔设置为 1 将启用 VSYNC
  • 将交换间隔设置为 0 将禁用 VSYNC

  • 将交换间隔设置为 -1 将在较新的驱动程序上启用自适应 VSYNC

    支持取决于是否存在:

    WGL_EXT_swap_control_tear(视窗)

    或者

    GLX_EXT_swap_control_tear(任何使用 X11 的平台,例如 Linux)

自适应 VSYNC 是一项有趣的新功能,如果您的应用程序超过显示器的刷新率,它会阻止,但当您低于刷新率时允许撕裂。这与正常行为相反,其中低于刷新率的任何内容都会被限制为刷新率的某个较低因子。


无论如何,由于您在此示例中使用的是 Windows,因此您需要查看wglSwapIntervalEXT (...).

于 2013-11-12T01:36:14.543 回答