c++ - 在没有 DirectX 的情况下在 Windows 上获得精确的屏幕刷新率?

标签 c++ winapi opengl directx frame-rate

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

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

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

最佳答案

根据我们的评论,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)

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


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

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

相关文章:

.net - 以编程方式查看移动数据终端(笔记本电脑/平板电脑/等)是否连接到扩展坞

delphi - 在 Windows 注册表中隐藏 key 的最佳位置?

opengl - 现代 OpenGL 中的 gl_ModelViewMatrix 和 gl_ModelViewProjectionMatrix 是什么?

linux - glreadpixels 比基于 x11 的屏幕截图慢

c++ - OpenCV 聚类词袋 K-Means

c++ - 如何在 Linux 中使用 PC 扬声器?

C++ - 将 C 字符串推送到模板堆栈

c++ - C++ Map 中结构键的比较运算符

windows - 使用 windows com 端口发送中断字节

objective-c - 不使用 Interface Builder 创建 OpenGL View