2010-01-29 493 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同步,如果該下一幀的早期工作框架碰巧不接觸顯示錶面。我不認爲我見過一位司機是那麼聰明。