一、卡頓現(xiàn)象
Android系統(tǒng)每隔16ms就重新繪制一次Activity,也就是說仪壮,我們的應(yīng)用必須在16ms內(nèi)完成屏幕刷新的全部邏輯操作,這樣才能達(dá)到每秒60幀湿酸,然而這個(gè)每秒幀數(shù)的參數(shù)由手機(jī)硬件所決定婿屹,現(xiàn)在大多數(shù)手機(jī)屏幕刷新率是60赫茲(赫茲是國際單位制中頻率的單位,它是每秒中的周期性變動(dòng)重復(fù)次數(shù)的計(jì)量)推溃,也就是說我們有16ms(1000ms/60次=16.66ms)的時(shí)間去完成每幀的繪制邏輯操作昂利,如果錯(cuò)過了,比如說我們花費(fèi)34ms才完成計(jì)算铁坎,那么就會(huì)出現(xiàn)我們稱之為丟幀的情況蜂奸。
安卓系統(tǒng)嘗試在屏幕上繪制新的一幀,但是這一幀還沒準(zhǔn)備好硬萍,所以畫面就不會(huì)刷新。如果用戶盯著同一張圖看了32ms而不是16ms,用戶會(huì)很容易察覺出卡頓感觉至,哪怕僅僅出現(xiàn)一次掉幀窜护,用戶都會(huì)發(fā)現(xiàn)動(dòng)畫不是很順暢,如果出現(xiàn)多次掉幀买羞,就會(huì)出現(xiàn)明顯卡頓現(xiàn)象袁勺。
二、渲染管線
Android系統(tǒng)的渲染管線分為兩個(gè)關(guān)鍵組件:CPU和GPU畜普,它們共同工作期丰,在屏幕上繪制圖片,每個(gè)組件都有自身定義的特定流程吃挑。我們必須遵守這些特定的操作規(guī)則才能達(dá)到效果钝荡。
在CPU方面,最常見的性能問題是不必要的布局和失效儒鹿,這些內(nèi)容必須在視圖層次結(jié)構(gòu)中進(jìn)行測(cè)量化撕、清除并重新創(chuàng)建。
在GPU方面约炎,最常見的問題是我們所說的過度繪制(overdraw)植阴,通常是在像素著色過程中蟹瘾,通過其他工具進(jìn)行后期著色時(shí)浪費(fèi)了GPU處理時(shí)間。
格柵化就是將例如字符串掠手、按鈕憾朴、路徑或者形狀的一些高級(jí)對(duì)象,拆分到不同的像素上在屏幕上進(jìn)行顯示喷鸽,格柵化是一個(gè)非常費(fèi)時(shí)的操作众雷。
圖像處理器(GPU顯卡的處理器),GPU使用一些指定的基礎(chǔ)指令集做祝,主要是多邊形和紋理砾省,也就是圖片,CPU在屏幕上繪制圖像前會(huì)向GPU輸入這些指令混槐,這一過程通常使用的API就是Android的OpenGL ES编兄,這就是說,在屏幕上繪制UI對(duì)象時(shí)無論是按鈕声登、路徑或者復(fù)選框狠鸳,都需要在CPU中首先轉(zhuǎn)換為多邊形或者紋理,然后再傳遞給GPU進(jìn)行格柵化悯嗓。
一個(gè)UI對(duì)象轉(zhuǎn)換為一系列多邊形和紋理的過程肯定相當(dāng)耗時(shí)件舵,從CPU上傳處理數(shù)據(jù)到GPU同樣也很耗時(shí)。所以很明顯脯厨,我們需要盡量減少對(duì)象轉(zhuǎn)換的次數(shù)铅祸,以及上傳數(shù)據(jù)的次數(shù),幸虧俄认,OpenGL ES API允許數(shù)據(jù)上傳到GPU后可以對(duì)數(shù)據(jù)進(jìn)行保存个少,當(dāng)我們下次繪制一個(gè)按鈕時(shí),只需要在GPU存儲(chǔ)器里引用它眯杏,然后告訴OpenGL如何繪制就可以了夜焦,一條經(jīng)驗(yàn)之談:渲染性能的優(yōu)化就是盡可能地上傳數(shù)據(jù)到GPU,然后盡可能長地在不修改的情況下保存數(shù)據(jù)岂贩,因?yàn)槊看紊蟼髻Y源到GPU時(shí)茫经,我們都會(huì)浪費(fèi)寶貴的處理時(shí)間。
三萎津、GPU的主要問題 -過度繪制(overdraw)
過度繪制指的是屏幕上的某個(gè)像素點(diǎn)在同一幀的時(shí)間內(nèi)被繪制了多次卸伞。
問題就在于此,因?yàn)槊看蜗袼亟?jīng)過渲染后锉屈,并不是用戶最后看到的部分荤傲,這就是在浪費(fèi)GPU的時(shí)間。目前流行的一些布局是一把雙刃劍颈渊,帶給我們漂亮視覺感受的同時(shí)遂黍,也造成過度繪制的問題终佛,為了最大限度地提高應(yīng)用程序的性能,我們必須盡量減少過度繪制雾家。
Android手機(jī)提供了查看過度繪制情況的工具铃彰,在開發(fā)者選項(xiàng)中打開
手機(jī)屏幕顯示會(huì)出現(xiàn)一些異常不用過于驚慌,Android在屏幕上使用不同顏色芯咧,標(biāo)記過度繪制的區(qū)域牙捉,如果某個(gè)像素點(diǎn)只渲染了一次,我們看到的是它原來的顏色敬飒,隨著過度繪制的增多邪铲,標(biāo)記顏色也會(huì)逐漸加深。
四无拗、Hierarchy Viewer工具
Hierarchy Viewer將幫助我們快速可視化整個(gè)UI結(jié)構(gòu)霜浴,另外,它還提供一個(gè)更好的方法蓝纲,讓我們理解這個(gè)結(jié)構(gòu)內(nèi)的獨(dú)特視圖的相對(duì)渲染性能。
開啟:
我們可能注意到每個(gè)視圖有三個(gè)獨(dú)特的圓點(diǎn)晌纫,它們可能具有不同的顏色税迷,綠色、黃色或紅色锹漱。
但是箭养,這些圓點(diǎn)的順序也具有特定的含義。最左邊的圓點(diǎn)表示渲染管道的測(cè)量階段哥牍,中間的圓點(diǎn)表示布局階段毕泌,最右邊的圓點(diǎn)表示渲染管道的繪制階段。
綠色表示這個(gè)管道階段嗅辣,這個(gè)視圖的渲染速度快于至少一半以上的其他視圖撼泛。
黃色表示它的渲染速度屬于比較慢的50%,如果我們看到紅色澡谭,意味著這是視圖層級(jí)中最慢的節(jié)點(diǎn)愿题,我們還應(yīng)該知道紅色節(jié)點(diǎn)可能是存在問題。
優(yōu)化思想:查看自己的布局蛙奖,層次是否很深以及渲染比較耗時(shí)潘酗,然后想辦法能否減少層級(jí)以及優(yōu)化每一個(gè)View的渲染時(shí)間。