過(guò)度繪制
? ? ? ? 過(guò)度繪制就是在繪制界面時(shí)万栅,對(duì)同一個(gè)像素重復(fù)繪制了多次,但是用戶能夠看到的也只有最頂層繪制的內(nèi)容,GPU過(guò)度繪制或多或少對(duì)性能有些影響。
檢測(cè)過(guò)度繪制
如何查看是否過(guò)度繪制:
設(shè)置-開(kāi)發(fā)者選項(xiàng)-調(diào)試GPU過(guò)度繪制-顯示過(guò)度繪制區(qū)域(過(guò)度渲染等蔼两,不同機(jī)器可能不同)
然后就可以看看你的應(yīng)用是否存在過(guò)度繪制的情況了。
那么如何判斷界面是否存在過(guò)度繪制呢逞度?
開(kāi)啟后额划,點(diǎn)擊我們的應(yīng)用,可以看到各種顏色的區(qū)域,其中:
最理想的是藍(lán)色,一個(gè)像素只繪制一次档泽,合格的頁(yè)面繪制是白色俊戳、藍(lán)色為主揖赴,綠色以上區(qū)域不能超過(guò)整個(gè)的三分之一,顏色越淺越好抑胎。
項(xiàng)目實(shí)踐
用工具對(duì)我項(xiàng)目測(cè)試了下燥滑,大部分頁(yè)面都存在過(guò)渡繪制的情況;列舉兩個(gè)
UI界面粉紅色居多圆恤,大部分都是綠色突倍,我希望達(dá)到的目標(biāo)去除粉紅色腔稀,可以有綠色盆昙,大部分是藍(lán)色。最后是這樣?
優(yōu)化原則
一些過(guò)度繪制是無(wú)法避免的焊虏,比如之前說(shuō)的文字和背景導(dǎo)致的過(guò)度繪制淡喜,這種是無(wú)法避免的。
應(yīng)用界面中诵闭,應(yīng)該盡可能地將過(guò)度繪制控制為 2 次(綠色)及其以下炼团,原色和藍(lán)色是最理想的。
粉色和紅色應(yīng)該盡可能避免疏尿,在實(shí)際項(xiàng)目中避免不了時(shí)瘟芝,應(yīng)該盡可能減少粉色和紅色區(qū)域。
不允許存在面積超過(guò)屏幕 1/4 區(qū)域的 3 次(淡紅色區(qū)域)及其以上過(guò)度繪制褥琐。
優(yōu)化方法
1.移除默認(rèn)的 Window 背景
一般應(yīng)用默認(rèn)繼承的主題都會(huì)有一個(gè)默認(rèn)的?windowBackground?锌俱,比如默認(rèn)的 Light 主題
或者在代碼中設(shè)置 getWidow.setBackgroundDrawable(null);
2.移除不必要的背景
移除XML布局文件中非必需的Background
3.減少布局嵌套的層級(jí)
盡量減少視圖的深度,來(lái)減少視圖樹(shù)的遍歷過(guò)程
使用ConstraintLayout代替LinearLayout
4.ViewStub(延遲化加載)
主要的應(yīng)用場(chǎng)景就比如說(shuō)新聞App敌呈,打開(kāi)某個(gè)界面贸宏,如果有網(wǎng)絡(luò)就展示內(nèi)容,沒(méi)有網(wǎng)絡(luò)就會(huì)提示出網(wǎng)絡(luò)連接出錯(cuò)磕洪,這個(gè)出錯(cuò)提示就是ViewStub吭练,在正確的條件下才會(huì)顯示出內(nèi)容。
5.include(引入布局)
當(dāng)不同的界面有相同的UI元素的時(shí)候我們可以使用include標(biāo)簽析显,不過(guò)引入的布局還可能會(huì)被嵌套在LinearLayout,RelativeLayout里面鲫咽。所以引入merge標(biāo)簽。
6.merge
在引入布局文件里面谷异,最外層可以用merge替代LinearLayout,RelativeLayout浑侥,這樣把子UI元素直接銜接在include位置。