有没有一种方法可以在GLFW中取消60 fps的限制?

11

我正在使用OGL/GLFW和C++编写游戏。

我的游戏始终以60 fps的帧率运行,没有任何屏幕撕裂。经过一些研究,似乎glfwSwapInterval()函数应该能够启用/禁用垂直同步或60 fps的限制。

然而,无论我传递给函数的值是什么,帧速率都保持在60,并且完全没有撕裂。我还检查了Linux上的合成器设置和Nvidia面板,它们都没有效果。

我认为这是很普遍的情况,有没有办法绕过这个fps限制?


4
你的GPU驱动程序可能启用了硬件垂直同步(vsync)。请搜索如何在任何供应商处禁用它,并查看是否可以解锁帧率。 - ricco19
1
10秒钟的谷歌搜索(GLFW vsync)带我来到了这里:http://www.glfw.org/docs/latest/group__context.html#ga87425065c011cef1ebd6aac75e059dfa -- 这是一种查询有关您GLFW实现中关于撕裂支持扩展的实现的方法。当您调用它时,它对这些扩展的支持情况有何说法? - Yakk - Adam Nevraumont
我尝试了“GLX_EXT_swap_control”,结果是true。 我认为这意味着可以使用swap control,但是之前我尝试过的不应该是glfwSwapInterval()行吗? - Manu
glfwSwapInterval(0) 是编程的方式,除非你需要直接在驱动程序(GPU)控制面板中覆盖它。 - Brett Hale
大家好,感谢你们的回答。最终我找到了解决方法。看起来将glfwSwapInterval设置为0或1或其他大于1的数字只是完全启用/禁用它,对于垂直同步目的毫无用处。然而,将其设置为0.5告诉glfw将帧速率限制加倍到屏幕刷新率的两倍(在我的情况下为120 fps),并且还禁用了垂直同步。所以我做的就是玩glfwSwapInterval(),在0和1之间更改值。希望这能帮助后来者。 - Manu
显示剩余2条评论
1个回答

17

有没有办法在GLFW中取消60 fps的帧率限制?

最简单的方法是使用单缓冲而不是双缓冲。由于单缓冲始终使用相同的缓冲区,因此没有缓冲区交换和“垂直同步”。

使用glfwWindowHint禁用双缓冲:

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

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


另一种可能性是将屏幕更新的次数设置为等待 glfwSwapBuffers 调用后进行缓冲区交换的时间为 0。这可以在将 OpenGL 上下文设置为当前上下文 (glfwMakeContextCurrent) 后通过 glfwSwapInterval 实现:

glfwMakeContextCurrent(wnd);
glfwSwapInterval(0);

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


你确定 GL_FALSE / GLFW_FALSE 吗? - mouse
@mouse 两个都是0。 - Rabbid76
通过使用单缓冲,你不仅会出现撕裂的情况,还会出现其他故障,例如半渲染场景与完全渲染版本交替出现,这取决于驱动程序在实际glFlush之前刷新命令到GPU的频率。使用像glReadPixels这样的阻塞命令也会呈现未完成的场景。最好是先渲染到FBO,然后再将其复制到屏幕上以呈现完整的场景。 - Ruslan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接