我正在用 C++ 编写 OGL / GLFW 游戏。
我的游戏始终以 60 fps 运行,没有任何屏幕撕裂。经过一些研究,似乎
glfwSwapInterval()
功能应该能够启用/禁用 V-sync 或 60fps 上限。
但是,无论我传递给函数的值是什么,帧率都保持锁定在 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 之前等待的屏幕更新次数。这可以通过 glfwSwapInterval
来完成,在将 OpenGL 上下文设置为当前上下文之后 ( glfwMakeContextCurrent
):
glfwMakeContextCurrent(wnd);
glfwSwapInterval(0);
但请注意,此解决方案是否有效,可能取决于硬件和驱动程序。
我用的是这个:
glfwSwapInterval(0); // 禁用垂直同步,因此 fps 不限于 60