腦洞大開:為啥幀率達到 60 fps 就流暢?

做過顯示性能優化的同學應該常常聽到別人說顯示性能優化的目標就是達到 60 fps, 但是至于為什么是 60 fps 而不是 55 fps 或者 65 fps 就眾說紛紜了,例如知乎上的這個問題為什么安卓不把系統顯示幀數提高?

  • 為什么是60fps ? 這是因為人眼與大腦之間的協作無法感知超過60fps的畫面更新。
  • 好像眼睛能識別的幀數低于60很多,而系統到60幀依然很清晰了
  • 60fps 完全夠了

但是這些答案既沒有相關文獻引用也沒有進行因果關系的分析,用大腳趾思考一下都會感覺不怎么靠譜。

憑借鉆研到底的精神,我們一個一個地來細細探究這些問題:

首先,人眼的感知極限并不是 60 fps

我們從維基百科以及果殼中,可以查到:”有了平滑度高的60hz之后,更有極度連貫的120hz的電視推出,而超過大概85赫茲的視頻,像是畫面每更新一次只會發光幾百分之一秒的陰極射線管及等離子顯示屏,此時已經到達大腦處理視頻的極限,人眼并無法分辨與更高更新率的差異,因此使用主動式快門眼鏡的3D電視更新率達到200赫茲或以上,對人眼來說是無法看到左右視角切換的過程。“

因此,人眼的感知極限是高于 60 fps 的

其次,畫面幀率越高,體驗越好

維基百科中提到幾個重要的幀率數值:

  • 12 fps:由于人類眼睛的特殊生理結構,如果所看畫面之幀率高于每秒約10-12幀的時候,就會認為是連貫的
  • 24 fps:有聲電影的拍攝及播放幀率均為每秒24幀,對一般人而言已算可接受
  • 30 fps:早期的高動態電子游戲,幀率少于每秒30幀的話就會顯得不連貫,這是因為沒有動態模糊使流暢度降低
  • 60 fps:在實際體驗中,60幀相對于30幀有著更好的體驗
  • 85 fps:一般而言,大腦處理視頻的極限

注:如果需要了解動態模糊技術相關知識,可以查閱這里

所以,總體而言,幀率越高體驗越好。一般的電影拍攝及播放幀率均為每秒24幀,但是據稱《霍比特人:意外旅程》是第一部以每秒48幀拍攝及播放的電影,觀眾認為其逼真度得到了顯著的提示。

但是,目前顯示性能優化的極限是 60 fps

這里出現了一個悖論:既然幀率越高體驗越好,那為什么我們的顯示性能優化只需要做到 60 fps 就 OK 了?具體的原因就要從我們使用的設備說起了。

首先,我們需要明確一點:生成圖像的設備(如顯卡)與顯示圖像的設備(如顯示器)是分離的。下面我們分別進行討論:

顯示器的刷新頻率是固定的

目前, 大多數顯示器根據其設定按 30Hz、 60Hz、 120Hz 或者 144Hz 的頻率進行刷新。 而其中最常見的刷新頻率是 60 Hz。 這樣做是為了繼承以前電視機刷新頻率為 60Hz 的設定。 而 60 Hz 是美國交流電的頻率, 電視機如果匹配交流電的刷新頻率就可以有效的預防屏幕中出現滾動條,即互調失真。(這樣我想起了一個老段子:馬屁股決定航天飛機火箭助推器的寬度)

顯卡的生成圖像的頻率是變化的

因為,顯卡的生成圖像的頻率與顯示器的刷新頻率是相互獨立的。因此,就涉及到了一個配合的問題。

最理想的情況是兩者之間的頻率是相同且協同進行工作的,在這樣的理想條件下,達到了最優解。但實際中顯卡的生成圖像的頻率是變化的,如果沒有有效的技術手段進行保證,兩者之間很容易出現這樣的情況:當GPU還在渲染下一幀圖像時,顯示器卻已經開始進行繪制,這樣就會導致屏幕撕裂(Tear)。這會使得屏幕的一部分顯示的是前一幀的內容,而另一部分卻在顯示下一幀的內容。如下圖所示:

這里寫圖片描述

屏幕撕裂(Tear)的問題,早在 PC 游戲時代就被發現, 并不停的在嘗試進行解決。 其中最知名可能也是最古老的解決方案就是 V-Sync 技術。

V-Sync 的原理簡單而直觀:產生屏幕撕裂的原因是顯卡在屏幕刷新時進行了渲染,而 V-Sync 通過同步渲染/刷新時間的方式來解決這個問題。顯示器的刷新頻率為 60 Hz,若此時開啟 V-Sync,將控制顯卡渲染速度在 60 Hz 以內以匹配顯示器刷新頻率。這也意味著,在 V-Sync 的限制下,顯卡顯示性能的極限就限制為 60 Hz 以內

后話 1:將顯示性能的極限限制為 60 fps 加劇了屏幕遲滯(Lag)和卡頓(Stutter)現象

先說遲滯(Lag):
請考慮如下場景:當前顯示器頻率為 60 fps,某游戲的實時幀率固定為是 12 fps。那么在為 1/12 秒的時間內,顯示器將會刷新5次,但顯示的都是同一幀的圖像。 這時游戲的給人的感覺如同幻燈片一般,這就是遲滯(Lag)。

再說卡頓(Stutter):
前面有提到,當幀率高于 12 fps 時,人眼都會認為畫面是流暢的。但是,因為人眼能夠識別出 85 fps 以內的幀率變化,所以,當顯示器輸出畫面的幀率不停變化時,人們就會認為畫面是卡頓(Stutter)的。

正如先前討論的那樣,V-Sync 僅僅是讓顯卡在某個確定的時間開始渲染某一幀, 但這并不意味著這一幀就一定能夠及時的呈現在你的面前。 僅僅如此, 顯卡還是難以匹配顯示器的刷新頻率, 有時它能滿足要求(渲染速度超過 60 fps), 有時就不行了(渲染速度低于 60 fps)。所以在這樣的情況下,V-Sync 就帶來了新的麻煩: 當幀率低于 60 fps 時將加劇畫面的卡頓和遲滯現象, 因為顯卡一直在嘗試讓渲染時間能夠與屏幕刷新時間能夠匹配。 但開啟 V-Sync 后, 40~50 fps 的渲染頻率意味著將會使得顯示器輸出的畫面幀率從 60 fps 驟降至 30 fps。如圖所示:

這里寫圖片描述

后話 2:現代化的顯示技術可以繞過這個坑

其實,簡單分析全文我們就會發現,這一切的坑都是為了讓顯卡去適應顯示器的頻率所造成的。因此,根本的解決方案其實也很簡單,掉個頭,讓顯示器去適應顯卡的頻率。一切就迎刃而解了。

該方案的實現目前有兩種實現形式: Nvidia 提出的專利技術 G-Sync 以及 AMD 提出開放標準 FreeSync。

G-Sync

G-Sync 技術于 2013 年底被提出, 它是以顯示器的附加模塊的形式出現(于2014年初正式產品化)。 G-Sync 模塊受專利保護, 它取代了傳統顯示中的脈沖計數器(scaler)。 但 G-Sync 模塊并非真正意義上的硬件計數器, 而是將這部分工作轉交 GPU 進行控制。在未獲得更多內部實現機制的情況下, 我們只能簡單的說 G-Sync 模塊用于決定顯示器何時(或何頻率)繪制下一幀。

該方案的問題在于: 要么顯示器制造商在制造顯示器時嵌入 G-Sync 模塊, 要么用戶購買 DIY 套件并安裝于兼容的顯示器上。 但這都將產生額外的費用。 雖然該方案是有效的, 并且有助于 Nvidia 控制自身成本, 但卻顯著地提高了顯示器的價格。 此外,G-Sync 僅能在配備了高于 GTX 650 Ti 的 Nvidia GPU的PC機上工作。 這意味著使用 AMD 和 Intel 集成顯卡的人就不那么不走運了。

FreeSync

在采用 Adaptive-Sync 技術的顯示器已經發布的情況下, AMD 于 2014 年初從另一個方面推出了 FreeSync, 截至2015年初依然未有上市計劃。 FreeSync 是一個開放標準, VESA(視頻電子設備協會)于2014年4月采用 Adaptive-Sync 技術作為 DisplayPort 1.2a 的規范。

Adaptive-Sync 是 AMD 的 FreeSync 必要組成部分, 它使得顯示器可以基于GPU來改變刷新率。 而 DisplayPort 是一種通用、 開放的標準, 支持所有的現代顯卡和大多數現代顯示器。 然而, 應該指出的是, 盡管 Adaptive-Sync 是 VESA DisplayPort 1.2 及 1.3 規范的一部分, 但它是可選的而非強制性的。 這意味著并非所有基于 DisplayPort 1.3 的顯示器都會支持 Adaptive-Sync。 雖然我們非常希望能引入這樣一個十分強大的通用標準, 但即便是引入 Adaptive-Sync 都會在制造顯示器時引入的驗證和測試的額外成本。

需要明確區分的是, Adaptive-Sync 是 DisplayPort 的功能, 它允許改變顯示器的刷新頻率, FreeSync 與 AMD該項技術相偕同是為了通過 Adaptive-Sync 在顯示幀被GPU渲染出來時刷新屏幕。

后話 3:目前顯示性能的極限是 60 fps,但將來能達到更高的水平

目前, G-Sync、FreeSync 均未普及,但隨著新技術的優化及推廣,我們有理由相信顯示性能的極限將會得到提高!

參考文獻:
Why 30 / 60 fps? why not 40, 45, 50 fps?
Android Performance Patterns: Why 60fps?
G-Sync vs FreeSync: The Future of Monitors
維基百科:幀率
果殼問答:人眼能識別的幀數最高是多少?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容