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

根据我自己的经验,第一种方法是不够的。我的笔记本电脑显示器无法实现60的确切帧速率-而是具有多种设置,以fps约为59.9和60.1。第二种方法为我提供了一个精确的浮点值,无需直接使用VSync,即可用于实现VSync的效果。

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

最佳答案

遵循我们的评论,有效地VSYNC导致了阻塞……但更准确地说,当交换链中充满了需要交换的后缓冲区时,它会阻塞。三重缓冲可用于减少VSYNC实现中的阻塞,但是WGL和GLX都没有公开控制交换链中后备缓冲区的数量,因此您必须修改驱动程序设置才能在OpenGL上下文中启用它。

在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 (...)

    关于c++ - 在没有DirectX的Windows上获得精确的屏幕刷新率?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19899059/

    10-12 20:40