Android性能優(yōu)化典范之Understanding VSYNC

Unbeknown to most developers, there’s a simple hardware design that defines everything about how fast your application can draw things to the screen.

You may have heard the term VSYNC - VSYNC stands for vertical synchronization and it's an event that happens every time your screen starts to refresh the content it wants to show you.

Effectively, VSYNC is the product of two components Refresh Rate (how fast the hardware can refresh the screen), and Frames Per Second (how fast the GPU can draw images), and in this video +Colt McAnlis walks through each of these topics, and discusses where VSYNC (and the 16ms rendering barrier) comes from, and why it’s critical to understand if you want a silky smooth application.

基本概念

想要開(kāi)發(fā)一個(gè)高性能的應(yīng)用程序,首先你得了解他的硬件工作原理,那么最好的辦法就是去使用它,應(yīng)用程序運(yùn)行速度的快慢,很容易被人誤解為硬件進(jìn)程的控制問(wèn)題,然而這最主要的根源在于渲染性能.如果你想要提高你應(yīng)用程序的渲染性能,你就必須知道什么是VSYNC.

在了解VSYNC之前,我們需要了解兩個(gè)概念:

刷新率

刷新率代表屏幕在一秒內(nèi)刷新屏幕的次數(shù),這個(gè)值用赫茲來(lái)表示,取決于硬件的固定參數(shù). 這個(gè)值一般是60Hz,即每16.66ms刷新一次屏幕.

刷新率

幀速率

幀速率代表了GPU在一秒內(nèi)繪制操作的幀數(shù),比如30fps/60fps.在這種情況下,高點(diǎn)的幀速率總是好的.

幀速率

工作原理

刷新率和幀速率需要協(xié)同工作,才能讓你的應(yīng)用程序的內(nèi)容顯示到屏幕上,GPU會(huì)獲取圖像數(shù)據(jù)進(jìn)行繪制,然后硬件負(fù)責(zé)把內(nèi)容呈現(xiàn)到屏幕上,這將在你的應(yīng)用程序的生命周期中周而復(fù)始地發(fā)生.下面的圖中每一個(gè)豎行代表了一幀的繪制和呈現(xiàn)工作.

協(xié)同工作

不幸的是,刷新率和幀速率并不是總能夠保持相同的節(jié)奏:

  • 如果幀速率實(shí)際上比刷新率快,那么就會(huì)出現(xiàn)一些視覺(jué)上的問(wèn)題,下面的圖中可以看到,當(dāng)幀速率在100fps而刷新率只有75Hz的時(shí)候,GPU所渲染的圖像并非全都被顯示出來(lái).

    幀速率比刷新率快的情況

    舉個(gè)例子, 你拍了一張照片,然后旋轉(zhuǎn)5度再拍一張照片, 將兩種圖片的中間剪開(kāi)并拼接在一起:

    拍兩張照片

    剪貼在一起

    這兩張圖有相似之處,但是上面和下面部分有明顯的區(qū)別,這就叫Tearing(撕裂),是刷新率和幀速率不一致的結(jié)果.

    上面的原因是因?yàn)?當(dāng)你的顯卡正在使用,一個(gè)內(nèi)存區(qū)正在寫(xiě)入幀數(shù)據(jù)(用來(lái)顯示一幀的一個(gè)Buffer),從頂部開(kāi)始, 新的一幀覆蓋前一幀,并立刻輸出一行內(nèi)容. 現(xiàn)在,當(dāng)屏幕開(kāi)始刷新時(shí),實(shí)際上并不知道緩沖區(qū)是什么狀態(tài)(即不知道緩沖區(qū)中的一幀是否繪制完畢,即存在只繪制了一半的情況,另一半還是之前的那幀),因此它從GPU中抓住的幀肯可能并不是完全完整的.

    圖像撕裂

    目前Android的雙緩沖(或者三緩沖/四緩沖), 這是非常有效的,當(dāng)GPU將一幀寫(xiě)入一個(gè)被成為后緩沖的存儲(chǔ)器, 而存儲(chǔ)器中的次級(jí)區(qū)域被稱為幀緩沖,當(dāng)寫(xiě)入下一幀時(shí),它會(huì)開(kāi)始填充后緩沖,而幀緩沖保持不變,現(xiàn)在我們刷新屏幕,它將使用幀緩沖(事先已經(jīng)繪制好),而不是正在處于繪制狀態(tài)的后緩沖, 這就是VSYNC的作用.如果在屏幕刷新中,VSYNC,即垂直同步,將會(huì)在讓從后緩沖到幀緩沖的拷貝過(guò)程保持同樣的復(fù)制操作:

    Vsync

    GPU的頻率比屏幕刷新率高是正常的,因?yàn)槟愕腉PU刷新會(huì)比屏幕刷新快,在這種情況下,當(dāng)屏幕刷新成功,你的GPU將會(huì)等待VSYNC信號(hào),直到下一個(gè)VSYNC信號(hào)到來(lái)時(shí)(即屏幕刷新時(shí)),這時(shí)你的幀速率就可以達(dá)到設(shè)備的刷新率上限. 當(dāng)然這只是理想情況, 當(dāng)fps達(dá)到60的時(shí)候,GPU需要在16.66ms內(nèi)準(zhǔn)備好一幀,這對(duì)應(yīng)用程序的要求是非常高的.更不用說(shuō)100fps了...

  • 屏幕刷新率比幀速率快的情況
    如果屏幕刷新率比幀速率快,屏幕會(huì)在兩幀中顯示同一個(gè)畫(huà)面,當(dāng)這種斷斷續(xù)續(xù)的情況發(fā)生時(shí),你就遇到麻煩了.比如你的幀速率比屏幕刷新率高的時(shí)候,用戶看到的是非常流暢的畫(huà)面, 但是幀速率降下來(lái)的時(shí)候(GPU繪制太多東西的時(shí)候),用戶將會(huì)很明顯地察覺(jué)到動(dòng)畫(huà)卡住了或者掉幀,然后又恢復(fù)了流暢.這通常會(huì)被描述為閃屏, 跳幀,延遲.

    屏幕刷新率比幀速率快

    你的應(yīng)用程序應(yīng)該避免這些幀率突降的情況.以確保GPU迅速獲取數(shù)據(jù),并在屏幕再次刷新之前寫(xiě)錄內(nèi)容.

Perf Matters

keep calm, profile your code, and always remember, Perf Matters

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末枕稀,一起剝皮案震驚了整個(gè)濱河市屁使,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖悲靴,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)杠巡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雇寇,“玉大人氢拥,你說(shuō)我怎么就攤上這事∠呛睿” “怎么了嫩海?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)囚痴。 經(jīng)常有香客問(wèn)我叁怪,道長(zhǎng),這世上最難降的妖魔是什么深滚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任奕谭,我火速辦了婚禮耳璧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘展箱。我一直安慰自己,他們只是感情好蹬昌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布混驰。 她就那樣靜靜地躺著,像睡著了一般皂贩。 火紅的嫁衣襯著肌膚如雪栖榨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天明刷,我揣著相機(jī)與錄音婴栽,去河邊找鬼。 笑死辈末,一個(gè)胖子當(dāng)著我的面吹牛愚争,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挤聘,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼轰枝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了组去?” 一聲冷哼從身側(cè)響起鞍陨,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎从隆,沒(méi)想到半個(gè)月后诚撵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡键闺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年寿烟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艾杏。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡韧衣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出购桑,到底是詐尸還是另有隱情畅铭,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布勃蜘,位于F島的核電站硕噩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缭贡。R本人自食惡果不足惜炉擅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一辉懒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谍失,春花似錦眶俩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抹竹,卻和暖如春线罕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窃判。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工钞楼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袄琳。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓询件,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親唆樊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雳殊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容