使用永恒循环时OpenGL如何控制帧速率?

问题描述 投票:0回答:1

在OpenGL中,我们在一个永恒的循环中绘制图形,例如

while(!glfwWindowShouldClose(window))
(除非发生退出事件,否则将条件设置为 false)。 据说,在此渲染循环中,我们需要在循环的每次迭代中调用
glClear
,这会将背景从先前的渲染清除为恒定颜色。我想这表明我们需要每帧刷新帧缓冲区。因此,每个循环都是一个帧。
然而,它是由一个简单的
while(true)
控制的(我知道事实上这不是“真的”,但在某种程度上,它们具有相同的含义),没有像
waitticks
setframerate
这样的东西,这意味着帧速率可以非常非常高或非常非常低。

c++ opengl glfw
1个回答
3
投票

OpenGL 不控制帧速率。如果你的循环每秒运行 200 次,你会得到 200fps,如果你的循环每秒只运行一次,你会得到 1fps。开始/结束帧的方法也不是

glClear
,而是交换前后缓冲区的方法。这不是 OpenGL API 的一部分,而是您正在使用的窗口框架的一部分。对于glfw,它是
glfwSwapBuffers
方法。

请注意,您的刷屏率可能会受到 VSync“自动”限制。在这种情况下,

glfwSwapBuffers
方法只会在下一个 VSync 事件之后返回,其行为类似于睡眠。

一般来说,您可以为 fps 添加任何上限,并确保仅在一段时间后执行新的循环迭代。这是否是一个好主意取决于用例。对于显示 24hz 视频的视频播放器,每 1/24 秒绘制一次绝对是有意义的。

如果您尝试手动封盖,请确保使用分辨率足够好的方法。

sleep
通常不够精确,因此您可能需要阅读需要精确的线程睡眠。最大 1ms 误差

© www.soinside.com 2019 - 2024. All rights reserved.