【问题标题】:Is there a way to remove 60 fps cap in GLFW?有没有办法在 GLFW 中删除 60 fps 上限?
【发布时间】:2018-10-28 23:15:40
【问题描述】:

我正在用 C++ 编写一个带有 OGL / GLFW 的游戏。

我的游戏始终以 60 fps 的速度运行,并且没有任何屏幕撕裂。经过一番研究,glfwSwapInterval() 功能似乎应该能够启用/禁用 V-sync 或 60fps 上限。

但是,无论我传递给函数的值如何,帧速率都锁定在 60 并且没有任何撕裂。我还检查了linux和nvidia面板上的合成器设置,它们没有生效。

我认为这是很常见的事情,有没有办法绕过这个 fps 上限?

【问题讨论】:

  • 您可能在您的 GPU 驱动程序中启用了 vsync hard。搜索如何与任何供应商禁用它,看看它是否解锁了帧率。
  • 10 秒的 google (GLFW vsync) 让我明白了这一点:glfw.org/docs/latest/… - 一种查询您的 GLFW 实现的方式来实现围绕撕裂支持的扩展。当您调用它时,它对这些扩展的支持是怎么说的?
  • @ricco19 我已经试过了,我的驱动程序中的 vsync 已禁用,但还是谢谢你。
  • @Yakk-AdamNevraumont 我尝试使用“GLX_EXT_swap_control”,结果为真。我认为这意味着可以使用交换控制,但那不应该是我之前尝试过的 glfwSwapInterval() 行吗?
  • glfwSwapInterval(0) 将是编程方式,除非您需要直接在驱动程序 (GPU) 控制面板中覆盖它。

标签: c++ opengl frame-rate glfw vsync


【解决方案1】:

有没有办法去除 GLFW 中的 60 fps 上限?

最简单的方法是使用单缓冲而不是双缓冲。由于在单个缓冲中始终使用相同的缓冲区,因此没有缓冲区交换,也没有“vsync”。

使用glfwWindowHint 禁用双缓冲:

glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_FALSE);
GLFWwindow *wnd = glfwCreateWindow(w, h, "OGL window", nullptr, nullptr);

注意,当您使用单缓冲时,您必须通过 (glFlush) 明确强制执行 GL 命令,而不是通过缓冲区交换 (glfwSwapBuffers)。


另一种可能性是设置从调用glfwSwapBuffers到将缓冲区交换为0之前等待的屏幕更新次数。这可以通过glfwSwapInterval完成,在使OpenGL上下文成为当前(glfwMakeContextCurrent)之后:

glfwMakeContextCurrent(wnd);
glfwSwapInterval(0);

但请注意,此解决方案是否有效,可能取决于硬件和驱动程序。

【讨论】:

  • 您确定 GL_FALSE / GLFW_FALSE。
  • @mouse 都是 0
  • 通过使用单缓冲,您不仅会撕裂,还会出现其他故障,例如半渲染场景与完全渲染版本交替,取决于驱动程序在得到实际 glFlush 之前将命令刷新到 GPU 的频率。使用像glReadPixels 这样的阻塞命令也会出现半生不熟的场景。最好渲染到 FBO,然后通过 blit 呈现完整的场景。
猜你喜欢
  • 2012-07-03
  • 1970-01-01
  • 2012-06-01
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多