概念
過度繪制是指系統(tǒng)在渲染單個(gè)幀的過程中在屏幕上繪制某個(gè)像素。例如有若干個(gè)界面卡片堆疊在一起跟压,每張卡片都會遮蓋其下面一張卡片的部分內(nèi)容。但是违霞,系統(tǒng)仍然需要繪制堆疊中的卡片被遮蓋的部分。這是因?yàn)槎询B的卡片是根據(jù)畫家算法(即從后到前的順序)來渲染的瞬场。按照這種順序买鸽,系統(tǒng)可以將適當(dāng)?shù)耐该鞫然旌蠎?yīng)用于陰影之類的半透明對象。
GPU 過度繪制調(diào)試工具
開啟開發(fā)者模式——>硬件加速渲染——>開啟調(diào)試 GPU 過度繪制贯被。Android 將如下方式為界面著色眼五,以確定過度繪制的次數(shù):
- 真彩色:沒有過度繪制
- 藍(lán)色:過度繪制 1 次
- 綠色:過度繪制 2 次
- 粉色:過度繪制 3 次
- 紅色:過度繪制 4 次或者更多次。
減少過度繪制的方法
-
移除布局中不需要的背景
默認(rèn)情況下刃榨,布局沒有背景弹砚,這表示布局本身不會直接去喧嚷任何內(nèi)容双仍。但是枢希,當(dāng)布局具有背景時(shí),其可能會導(dǎo)致過度繪制朱沃。移除不必要的背景可以快速提高渲染性能苞轿。不必要的背景可能永遠(yuǎn)不可見,因?yàn)樗鼤粦?yīng)用在該視圖上繪制的任何其它內(nèi)容完全覆蓋逗物。例如搬卒,當(dāng)系統(tǒng)在父View 上繪制子 View 時(shí),可能會完全覆蓋父 View 的背景翎卓∑跹可以將 Window 背景設(shè)為應(yīng)用的主背景顏色,并且不為其上面的任何容器定義背景值失暴。 -
使視圖層次結(jié)構(gòu)扁平化
復(fù)雜的布局可能導(dǎo)致 View 的層級結(jié)構(gòu)過深坯门,從而可能導(dǎo)致重疊的頁面過多,出現(xiàn)了過度繪制的情況逗扒,可以通過優(yōu)化布局來減少重疊頁面古戴,從而提高性能。 -
降低透明度
在屏幕上渲染透明像素矩肩,即所謂的透明度渲染现恼,使導(dǎo)致過度繪制的重要因素。在普遍的過度繪制中黍檩,系統(tǒng)會在已繪制的現(xiàn)有像素上繪制不透明的像素叉袍,從而將其完全遮蓋,與此不同的是刽酱,透明對象需要先繪制現(xiàn)有的像素喳逛,以便達(dá)到正確的效果。諸如透明動(dòng)畫肛跌、淡出和陰影之類的視覺效果都會涉及到某種透明度艺配,因此有可能會導(dǎo)致嚴(yán)重的過度繪制察郁。可以通過減少要渲染的透明對象的數(shù)量转唉,改善這些情況下的過度繪制皮钠。例如,要獲得灰色文本赠法,可在 TextView 中繪制黑色文本麦轰,再為其設(shè)置半透明的透明度值,如下:
textView.setTextColor(Color.parseColor("#000000"));
textView.setAlpha(0.6f);
textView.setText("灰色文本");
但是砖织,可以簡單地通過用灰色繪制文本來獲得同樣的效果款侵,而且能夠大幅提升性能,如下:
textView.setTextColor(Color.parseColor("#99000000"));
textView.setText("灰色文本");