在我的OpenGL书中,它说:
“在这样的系统上经常发生的是框架太复杂了 在1/60秒内绘制,因此每帧显示不止一次。如果,为 例如,绘制一帧需要1/45秒,你得到30 fps,而且 图形空闲为每帧1/30 1/45 = 1/90秒,或三分之一 时间。“
在句子中说“画一帧需要1/45秒,你得到30帧/秒”,为什么我只得到30帧/秒? Woudl 45 fps不是更正确吗?
答案 0 :(得分:12)
显卡通常只会向前缓冲一帧。
如果绘制一帧需要1/45秒,那么在1/60秒处,前一帧将被重新显示。在1/45标记处,下一帧完成 - 但是卡没有空闲缓冲区来开始渲染下一帧,所以必须闲置到1/30,它可以发送出那帧并开始工作在下一个。
这是在启用VSync的情况下 - 如果你禁用它,而不是在1/3时间内获得30FPS帧速率和空闲卡,卡片将立即重新开始重绘,你将会屏幕撕裂。
答案 1 :(得分:5)
这是对的。您将获得45 fps,但系统正在将其降低至30 fps,以在60Hz(每秒60次重绘)监视器上实现平滑帧率。
因为需要在60Hz显示器上每1/60秒绘制某事,并且无法绘制“半帧”,您必须绘制< em>上一个框架。因此,如果您每秒60次绘制真实帧,并且每2帧绘制前者,那么您可以获得30fps,尽管您可以管理45fps。
答案 2 :(得分:0)
所以是的,正如其他人所说,这是因为你的图形在开始生成下一帧之前等待v-sync。
那说......
请注意,并非所有显示器都以60Hz刷新。在70Hz显示器上,60fps对30fps变为70fps而35fps。
如果您不希望让卡在开始下一帧之前等待v-sync,但仍然避免撕裂,请使用 triple 缓冲。然后GPU显示渲染到2个缓冲区,同时显示第3个缓冲区。 v-sync事件触发交换到“当前完成”的后台缓冲区。这仍然不是很好,因为你最终得到的一些帧比其他帧更频繁地留在屏幕上:使用1/45渲染,一帧将保持1 / 30s而下一帧将保留1/60,给出一些急动
最后,随着屏幕外渲染(渲染到非显示缓冲区)的出现,理论上可以让驱动程序在下一帧开始之前不等待v-sync,如果下一帧的早期工作碰巧没碰到显示器表面。我不认为我曾经见过司机那么聪明。