2010-01-29 92 views
7

在我的OpenGL的书,它说这个:FPS如何计算这个?

“经常发生这样的系统上是框架太复杂 1/60秒画画,所以每一帧显示不止一次。如果,例如 ,需要1/45秒来绘制一帧,则获得每秒30帧,和 图形是空闲每帧1/30 1/45 1/90 =第二,或 三分之一时间。”

在句子中说“画一个帧需要1/45秒,你得到30帧/秒”,为什么我只能得到30帧/秒?无法做到45 fps更准确?

+0

对不起,我还不明白,请给我更多的答案,一个很好的解释!我真的不明白为什么我只能得到30帧/秒,为什么这需要2/60秒刷新!(连接匿名说),再次感谢! – drigoSkalWalker 2010-01-30 14:05:47

回答

12

图形卡通常只提前缓冲一帧。

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

这是与VSync启用 - 如果你禁用它,而不是获得30FPS帧速率和空闲卡的三分之一的时间,卡将立即开始重绘,而你会得到屏幕撕裂。

+1

+1:对于V同步参考 – 2010-01-29 00:51:38

+0

为什么这个必须等到1/30?感谢你的勇气。 – drigoSkalWalker 2010-01-29 01:10:54

+0

因为那是当下一帧被发送出去(2/60秒)。如果禁用VSync,则可避免等待,但卡片发送的图像将成为一帧的一部分,并成为另一帧的一部分。 – 2010-01-29 01:22:10

5

这是正确的。您可以获得45 fps,但系统将其降低至30 fps,以实现60Hz(每秒60次重绘)显示器的平滑帧率。

因为你需要东西60Hz的监视器上每1/60秒,并不能得出“半帧”,则必须提请以前帧。所以,如果你每秒钟60次你画出真实的画面,并且你画出前2帧,那么尽管事实上你可以管理45fps,你仍然可以得到30fps。

+0

60次/秒,不是每60秒 – 2010-01-29 00:51:46

+0

@杰弗里,啊,错字纠正了,谢谢 – 2010-01-29 00:52:50

0

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

也就是说......

小心,并非所有显示器刷新在60Hz。在70Hz显示器上60fps vs 30fps变成70fps vs 35fps。

如果你不想让你的卡在开始下一帧之前等待v-sync,但仍然避免撕裂,请使用三倍缓冲。然后,GPU在第3次显示时将渲染ping到2个缓冲区。 v-sync事件触发交换到“当前完成”后台缓冲区。这仍然不是很好,因为最终会出现一些比其他帧更频繁的帧:在1/45渲染下,帧会保持1/30秒,而下一帧会保持1/60,从而带来一些急动。

最后,随着屏幕外渲染(渲染到未显示的缓冲区)的出现,理论上驱动程序在开始下一帧之前可能不会等待v同步,如果该下一帧的早期工作框架碰巧不接触显示表面。我不认为我见过一位司机是那么聪明。