【问题标题】:How does openGL control framerate by eternal loop ?openGL如何通过永恒循环控制帧率?
【发布时间】:2022-01-18 15:12:22
【问题描述】:

在openGL中,我们在一个永恒的循环while(!glfwWindowShouldClose(window))中绘制图形(除非发生退出事件,将条件设置为false)。 据说在这个渲染循环中,每次执行新循环时我们都需要调用 glclear ,这“将背景从先前绘制的颜色清除为 const 颜色”。我猜这表明我们需要每次刷新帧缓冲区框架 。 因此,每个循环都是一个帧。 但是,它由一个简单的 while(true) 控制(我知道它实际上不是 'true',但在某种程度上,它们具有相同的含义),没有像 'waitticks' 或 'setframerate' 之类的东西,这意味着帧率可以非常非常高或非常非常低。

【问题讨论】:

标签: c++ opengl glfw


【解决方案1】:

OpenGL 不控制帧率。如果你的循环每秒运行 200 次,你得到 200fps,如果你的循环每秒只运行一次,你得到 1fps。开始/结束帧的方法也不是glClear,而是交换前后缓冲区的方法。这不是 OpenGL API 的一部分,而是您正在使用的窗口框架的一部分。对于 glfw,它是 glfwSwapBuffers 方法。

请注意,您的名望可能会受到VSync 的“自动”限制。在这种情况下,glfwSwapBuffers 方法只会在下一个 VSync 事件之后返回,其行为类似于睡眠。

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

如果您尝试手动设置上限,请确保使用分辨率足够高的方法。 sleep 通常不够精确,因此您可能需要阅读 Precise thread sleep needed. Max 1ms error

【讨论】:

    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多