【问题标题】:FPS how calculate this?这个FPS怎么算?
【发布时间】:2010-01-29 16:13:46
【问题描述】:

在我的 OpenGL 书中,它是这样说的:

“在这样的系统上经常发生的情况是框架太复杂了 在 1/60 秒内绘制,因此每帧显示不止一次。如果,对于 例如,画一帧需要 1/45 秒,你得到 30 fps,然后 图形空闲 1/30 1/45 = 1/90 秒每帧,或三分之一 时间。”

在说“画一帧需要 1/45 秒,你得到 30 fps”这句话中,为什么我只得到 30 fps? 45 fps 不是更正确吗?

【问题讨论】:

  • 对不起,我还不明白,请给我更多的答案和一个很好的解释!我真的不明白为什么我只有 30 fps,为什么刷新需要 2/60 秒!(链接 anon 说),再次感谢!

标签: opengl frame-rate


【解决方案1】:

显卡通常只会提前一帧缓冲。

如果绘制一帧需要 1/45 秒,则在 1/60 秒标记处,将重新显示前一帧。在 1/45 标记处,下一帧完成 - 但卡没有空闲缓冲区来开始渲染下一帧,因此必须闲置到 1/30,在那里它可以发送该帧并开始工作在下一个。

这是在启用 VSync 的情况下 - 如果您禁用它,而不是获得 30FPS 帧速率和 1/3 时间的空闲卡,卡将立即开始重绘,而您将获得屏幕撕裂。

【讨论】:

  • 因为那是发送下一帧的时间(2/60 秒)。如果您禁用垂直同步,您可以避免等待,但是卡发送的图像将是一帧的一部分,也是另一帧的一部分。
【解决方案2】:

没错。您将获得 45 fps,但系统将其减慢至 30 fps,以在 60Hz(每秒 60 次重绘)监视器上实现平滑的帧速率。

因为您需要在 60Hz 的显示器上每 1/60 秒绘制 something,并且不能绘制“半帧”,所以必须绘制 something em>上一帧。因此,如果您每秒绘制 60 次真实帧,并且每 2 帧绘制一次真实帧,那么尽管您可以管理 45fps,但您将获得 30fps。

【讨论】:

  • 60 次/秒,而不是每 60 秒
【解决方案3】:

是的,正如其他人所说,这是由于您的图形在开始生成下一帧之前等待垂直同步。

也就是说……

请注意,并非所有显示器都以 60Hz 刷新。在 70Hz 显示器上,60fps 与 30fps 变为 70fps 与 35fps。

如果您不想让您的卡在开始下一帧之前等待垂直同步,但仍要避免撕裂,请使用 三重 缓冲。 GPU 然后在显示第 3 个缓冲区时将渲染渲染到 2 个缓冲区。 v-sync 事件触发交换到“当前完成”的后台缓冲区。这仍然不是很好,因为您最终会得到一些比其他帧更频繁地停留在屏幕上的帧:在您的 1/45 渲染中,一帧将停留 1/30 秒,下一帧将停留 1/60,这会产生一些抖动.

最后,随着离屏渲染(渲染到非显示缓冲区)的出现,理论上驱动程序可以在开始下一帧之前不等待垂直同步,如果下一帧的早期工作碰巧没有触摸显示表面。不过,我想我从来没有见过这么聪明的司机。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-17
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多