在OpenGL中,我们在一个永恒的循环中绘制图形,例如
while(!glfwWindowShouldClose(window))
(除非发生退出事件,否则将条件设置为 false)。
据说,在此渲染循环中,我们需要在循环的每次迭代中调用 glClear
,这会将背景从先前的渲染清除为恒定颜色。我想这表明我们需要每帧刷新帧缓冲区。因此,每个循环都是一个帧。while(true)
控制的(我知道事实上这不是“真的”,但在某种程度上,它们具有相同的含义),没有像 waitticks
或 setframerate
这样的东西,这意味着帧速率可以非常非常高或非常非常低。
OpenGL 不控制帧速率。如果你的循环每秒运行 200 次,你会得到 200fps,如果你的循环每秒只运行一次,你会得到 1fps。开始/结束帧的方法也不是
glClear
,而是交换前后缓冲区的方法。这不是 OpenGL API 的一部分,而是您正在使用的窗口框架的一部分。对于glfw,它是glfwSwapBuffers
方法。
请注意,您的刷屏率可能会受到 VSync“自动”限制。在这种情况下,
glfwSwapBuffers
方法只会在下一个 VSync 事件之后返回,其行为类似于睡眠。
一般来说,您可以为 fps 添加任何上限,并确保仅在一段时间后执行新的循环迭代。这是否是一个好主意取决于用例。对于显示 24hz 视频的视频播放器,每 1/24 秒绘制一次绝对是有意义的。
如果您尝试手动封盖,请确保使用分辨率足够好的方法。
sleep
通常不够精确,因此您可能需要阅读需要精确的线程睡眠。最大 1ms 误差