我們平時在做性能優(yōu)化的時候将鸵,經(jīng)常會提到一個指標(biāo)就是頁面幀率達(dá)到60fps,但是這個判斷值60是怎么來的呢?為什么不是50或者70fps佑颇?
帶著這個問題查閱了一些網(wǎng)絡(luò)資料咨堤,并整理成下文:
人眼的感知極限不是60fps
有人說可能是人眼的感知極限就是60fps,60hz對人眼識別來說已經(jīng)具備較高的平滑度漩符,但是通過查閱百科得知85hz是人類大腦處理視頻的極限一喘,人眼無法分辨更高頻率的差異。
畫面幀率越高嗜暴,體驗越好
人眼在看畫面時凸克,畫面幀率高于每秒10-12幀的時候,就會認(rèn)為是連貫的闷沥。
一般電影的拍攝及播放幀數(shù)是每秒24幀萎战。
目前顯示性能優(yōu)化的極限是60fps
有人會說:既然你說畫面幀率越高,用戶體驗越好舆逃,那為什么頁面性能優(yōu)化做到60fps就可以了蚂维? 這是由于我們使用的設(shè)備引起的。
從機(jī)器的構(gòu)造來說路狮,生成圖像的設(shè)備(如顯卡)和顯示圖像的設(shè)備(顯示器)是分離的虫啥。
顯示器的刷新頻率是固定的
目前, 大多數(shù)顯示器根據(jù)其設(shè)定按 30Hz奄妨、 60Hz涂籽、 120Hz 或者 144Hz 的頻率進(jìn)行刷新。 而其中最常見的刷新頻率是 60 Hz砸抛。 這樣做是為了繼承以前電視機(jī)刷新頻率為 60Hz 的設(shè)定评雌。
顯卡生成圖像的頻率是變化的
顯卡內(nèi)圖片的真正提供者是GPU树枫,而這導(dǎo)致了另一個問題,由于 GPU 生成圖像的頻率與顯示器刷新的頻率是不相關(guān)的景东,那么在顯示器刷新時砂轻,GPU 沒有準(zhǔn)備好需要顯示的圖像怎么辦;或者 GPU 的渲染速度過快斤吐,顯示器來不及刷新搔涝,GPU 就已經(jīng)開始渲染下一幀圖像又該如何處理?
如果解決不了這兩個問題曲初,就會出現(xiàn)上圖中的屏幕撕裂(Screen Tearing)現(xiàn)象体谒,屏幕中一部分顯示的是上一幀的內(nèi)容杯聚,另一部分顯示的是下一幀的內(nèi)容臼婆。
我們用兩個例子來說明可能出現(xiàn)屏幕撕裂的兩種情況:
如果顯示器的刷新頻率為 75 Hz,GPU 的渲染速度為 100 Hz幌绍,那么在兩次屏幕刷新的間隔中颁褂,GPU 會渲染 4/3 個幀,后面的 1/3 幀會覆蓋已經(jīng)渲染好的幀棧傀广,最終會導(dǎo)致屏幕在 1/3 或者 2/3 的位置出現(xiàn)屏幕撕裂效果颁独;
那么 GPU 的渲染速度小于顯示器呢,比如說 50 Hz伪冰,那么在兩次屏幕刷新的間隔中誓酒,GPU 只會渲染 2/3 幀,剩下的 1/3 會來自上一幀贮聂,與上面的結(jié)果完全相同靠柑,在同樣的位置出現(xiàn)撕裂效果。
到這里吓懈,有人會說歼冰,如果顯示器的刷新頻率與 GPU 的渲染速度完全相同,應(yīng)該就會解決屏幕撕裂的問題了吧耻警?其實并不是隔嫡。顯示器從 GPU 拷貝幀的過程依然需要消耗一定的時間,如果屏幕在拷貝圖像時刷新甘穿,仍然會導(dǎo)致屏幕撕裂問題腮恩。
如何解決屏幕撕裂問題?
解決屏幕撕裂中最知名可能也是最古老的解決方案就是 V-Sync 技術(shù)温兼。
V-Sync 的原理簡單而直觀:產(chǎn)生屏幕撕裂的原因是顯卡在屏幕刷新時進(jìn)行了渲染庆揪,而 V-Sync 通過同步渲染/刷新時間的方式來解決這個問題。顯示器的刷新頻率為 60 Hz妨托,若此時開啟 V-Sync缸榛,將控制顯卡渲染速度在 60 Hz 以內(nèi)以匹配顯示器刷新頻率吝羞。這也意味著,在 V-Sync 的限制下内颗,顯卡顯示性能的極限就限制為 60 Hz 以內(nèi)钧排。
因此在屏幕的刷新頻率基本固定的情況下,我們只能控制GPU的渲染速度往60fps上靠攏均澳。