索引
Android中的布局渲染,一般來(lái)說(shuō)是系統(tǒng)解析應(yīng)用的布局文件,到界面顯示出來(lái)的。這其中包含CPU和GPU的工作步驟,Android系統(tǒng)保持著每秒60幀的繪制,也就是當(dāng)我們應(yīng)用的繪制速度小于每秒60幀時(shí),用戶就可能感覺(jué)到卡頓,所以為了避免應(yīng)用的卡頓,也就需要知道布局文件從解析到繪制經(jīng)歷了哪些步驟
目錄
- Android布局渲染流程
- 常見(jiàn)的布局渲染優(yōu)化手段
1 Android布局渲染流程
1.1 CPU和GPU
CPU的可以做的任務(wù)包括:邏輯運(yùn)算,內(nèi)存管理,顯示操作
GPU
- 黃色的 Control 為控制器,用于協(xié)調(diào)控制整個(gè) CPU 的運(yùn)行,包括取出指令、控制其他模塊的運(yùn)行等;
- 綠色的 ALU ( Arithmetic Logic Unit )是算術(shù)邏輯單元,用于進(jìn)行數(shù)學(xué)、邏輯運(yùn)算;
- 橙色的 Cache 和 DRAM 分別為緩存和 RAM ,用于存儲(chǔ)信息。
從結(jié)構(gòu)圖可以看出, CPU 的控制器較為復(fù)雜,而 ALU 數(shù)量較少。因此 CPU 擅長(zhǎng)各種復(fù)雜
的邏輯運(yùn)算,但不擅長(zhǎng)數(shù)學(xué)尤其是浮點(diǎn)運(yùn)算
1.2 從xml到顯示的過(guò)程
- xml文件中寫的View,通過(guò)LayoutInflater加載到內(nèi)存中,成為View對(duì)象
- View對(duì)象中包含各種屬性信息,經(jīng)過(guò)cpu是計(jì)算,處理成多維的向量圖形
-
矢量圖經(jīng)過(guò)GPU的柵格化,填充處理,然后再經(jīng)過(guò)GPU繪制,最后顯示到界面上
顯示過(guò)程.png
Android 系統(tǒng)每隔 16ms 發(fā)出 VSYNC 信號(hào) (1000ms/60=16.66ms) ,觸發(fā)對(duì) UI 進(jìn)行渲染, 如果每次渲染都成功這樣就能夠達(dá)到流暢的畫面所需要的 60fps ,為了能夠?qū)崿F(xiàn) 60fps ,這意味著計(jì)算渲染的大多數(shù)操作都必須在 16ms 內(nèi)完成。
2 常見(jiàn)的布局渲染優(yōu)化手段
2.1 布局渲染和優(yōu)化
總的來(lái)說(shuō),Android系統(tǒng)渲染主要可以分為2步
- CPU將UI對(duì)象轉(zhuǎn)換為一系列多邊形和紋理
- 傳遞數(shù)據(jù)到GPU進(jìn)行顯示
所以如果要對(duì)布局進(jìn)行優(yōu)化,可以分別CPU和GPU入手
2.2 優(yōu)化方式
- 減少CPU中xml轉(zhuǎn)換為對(duì)象的時(shí)間(布局簡(jiǎn)單化)
- 減少GPU重復(fù)繪制的時(shí)間(避免過(guò)度繪制)
2.2.1 過(guò)度繪制
1. 去掉無(wú)用的背景
可以在系統(tǒng)設(shè)置中打開布局邊界顯示,減少布局嵌套和去掉無(wú)用背景
2. 自定義控件,操作畫布(canvas)只畫有用的區(qū)域
//先保存畫布的狀態(tài)
canvas.save();
//第一步:裁剪需要繪制的可見(jiàn)區(qū)域(對(duì)于那些不可見(jiàn)或者被覆蓋的區(qū)域,就不需要繪制)
canvas.clipRect(left,top,right,bottom);
//第二步:繪制bitmap到指定區(qū)域(在bitmap比繪制區(qū)域大時(shí),就可以實(shí)現(xiàn)只繪制可見(jiàn)區(qū)域,而不繪制不可見(jiàn)區(qū)域,避免過(guò)度繪制)
canvas.drawBitmap(bitmap,startX,startY,paint);
//還原畫布
canvas.restore();
總結(jié)
Android布局渲染優(yōu)化還是比較簡(jiǎn)單的,只要注意減少布局的嵌套,然后盡量減少布局的復(fù)雜程度,一般來(lái)說(shuō)就可以了在這個(gè)過(guò)程中,可以靈活使用merger和include布局標(biāo)簽
布局優(yōu)化原則
- 減少不必要的布局嵌套
- 使用merger避免與復(fù)用器重疊
注:此文屬作者原創(chuàng),轉(zhuǎn)載請(qǐng)標(biāo)明出處