7

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

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

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

4

3 回答 3

12

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

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

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

于 2010-01-29T00:47:14.977 回答
5

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

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

于 2010-01-29T00:44:52.503 回答
0

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

那就是说...

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

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

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

于 2010-01-29T08:09:20.897 回答