在没有DirectX的Windows上获得精确的屏幕刷新率?

时间:2013-11-11 04:52:07

标签: c++ winapi opengl directx frame-rate

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

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

我问这是因为OpenGL中缺乏可靠的VSync,我不想在启动时依赖额外的图形API来将它用于一个小功能。还有另一种方式吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

    支持取决于是否存在:

    WGL_EXT_swap_control_tear(Windows)

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

自适应VSYNC是一项有趣的新功能,可阻止您的应用程序超出显示器的刷新率,但允许在刷新率低时撕裂。这与正常行为相反,其中低于刷新率的任何东西被限制为刷新率的某个较低因子。

<小时/> 在任何情况下,由于您在此示例中使用的是Windows,因此您需要查看wglSwapIntervalEXT (...)