我正在使用OGL/GLFW和C++编写游戏。
我的游戏始终以60 fps的帧率运行,没有任何屏幕撕裂。经过一些研究,似乎glfwSwapInterval()
函数应该能够启用/禁用垂直同步或60 fps的限制。
然而,无论我传递给函数的值是什么,帧速率都保持在60,并且完全没有撕裂。我还检查了Linux上的合成器设置和Nvidia面板,它们都没有效果。
我认为这是很普遍的情况,有没有办法绕过这个fps限制?
我正在使用OGL/GLFW和C++编写游戏。
我的游戏始终以60 fps的帧率运行,没有任何屏幕撕裂。经过一些研究,似乎glfwSwapInterval()
函数应该能够启用/禁用垂直同步或60 fps的限制。
然而,无论我传递给函数的值是什么,帧速率都保持在60,并且完全没有撕裂。我还检查了Linux上的合成器设置和Nvidia面板,它们都没有效果。
我认为这是很普遍的情况,有没有办法绕过这个fps限制?
有没有办法在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);
但请注意,这个解决方案是否有效可能取决于硬件和驱动程序。
glFlush
之前刷新命令到GPU的频率。使用像glReadPixels
这样的阻塞命令也会呈现未完成的场景。最好是先渲染到FBO,然后再将其复制到屏幕上以呈现完整的场景。 - Ruslan
glfwSwapInterval(0)
是编程的方式,除非你需要直接在驱动程序(GPU)控制面板中覆盖它。 - Brett HaleglfwSwapInterval
设置为0或1或其他大于1的数字只是完全启用/禁用它,对于垂直同步目的毫无用处。然而,将其设置为0.5告诉glfw将帧速率限制加倍到屏幕刷新率的两倍(在我的情况下为120 fps),并且还禁用了垂直同步。所以我做的就是玩glfwSwapInterval()
,在0和1之间更改值。希望这能帮助后来者。 - Manu