本文轉(zhuǎn)載自:Android性能優(yōu)化:繪制優(yōu)化
目錄
1.影響的性能
??繪制性能的好壞主要影響:Android應(yīng)用中的頁面顯示速度锡宋。
2.如何影響性能
??繪制影響Android性能的實(shí)質(zhì):頁面的繪制時(shí)間。1個(gè)頁面通過遞歸完成測量和繪制過程特恬。
3.優(yōu)化思路
??主要優(yōu)化方向是:
降低View.onDraw()的復(fù)雜度;
避免過度繪制(Overdraw)徐钠。
4.具體優(yōu)化方案
4.1 降低View.onDraw()的復(fù)雜度
4.1.1 onDraw()中不要?jiǎng)?chuàng)建新的局部對象
4.1.2 避免onDraw()執(zhí)行大量和耗時(shí)操作
4.2 避免過度繪制(Overdraw)
4.2.1 過度繪制的簡介
4.2.2 過度繪制的表現(xiàn)形式
??過度繪制會導(dǎo)致屏幕顯示的色塊不同(可在開發(fā)者選項(xiàng)中開啟)癌刽,具體如下:
實(shí)例說明:
4.2.3 過度繪制的優(yōu)化原則
??很多過度繪制是難以避免的,如上述實(shí)例的文字和背景導(dǎo)致的過度繪制尝丐;只能盡可能避免過度繪制:
盡可能地控制過度繪制的次數(shù)在2次(綠色)以下显拜,藍(lán)色最理想;
盡可能避免過度繪制的粉色和紅色情況爹袁;
不允許3 次以上的過度繪制(淡紅色)面積超過屏幕大小的1/4远荠。
4.2.4 優(yōu)化方案
移除默認(rèn)的Window背景;
移除控件中不必要的背景失息;
減少布局文件的層級(嵌套)譬淳;
自定義控件View優(yōu)化:使用 clipRect() 、 quickReject()盹兢。
(1)優(yōu)化方案1: 移除默認(rèn)的Window背景邻梆。
- 背景:一般應(yīng)用程序默認(rèn)繼承的主題windowBackground,如默認(rèn)的Light主題:
<style name="Theme.Light">
<item name="isLightTheme">true</item>
<item name="windowBackground">@drawable/screen_background_selector_light</item>
...
</style>
問題
??一般情況下绎秒,該默認(rèn)的Window背景基本用不上:因背景都自定義設(shè)置浦妄;若不移除,則導(dǎo)致所有界面都多1次繪制见芹。解決方案:移除默認(rèn)的Window背景剂娄。
<!-- 方式1:在應(yīng)用的主題中添加如下的一行屬性 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 或者 -->
<item name="android:windowBackground">@null</item>
<!-- 方式2:在BaseActivity的onCreate()方法中使用下面的代碼移除 -->
getWindow().setBackgroundDrawable(null);
<!-- 或者 -->
getWindow().setBackgroundDrawableResource(android.R.color.transparent);
(2)優(yōu)化方案2:移除控件中不必要的背景。
??如2個(gè)常見場景:
-
場景1:ListView與Item
??列表頁(ListView) 與其內(nèi)子控件(Item)的背景相同:白色玄呛,故可移除子控件(Item)布局中的背景阅懦。
-
場景2:ViewPager與Fragment
??對于1個(gè)ViewPager+多個(gè)Fragment組成的首頁界面,若每個(gè)Fragment都設(shè)有背景色把鉴,即ViewPager則無必要設(shè)置故黑,可移除儿咱。
關(guān)于更多場景,可使用工具Hierarchy View查看场晶,具體請看文章: 過渡繪制的使用工具:Hierarchy View
(3)優(yōu)化方案3:減少布局文件的層級(減少不必要的嵌套)混埠。
原理:減少不必要的嵌套 --> UI層級少 --> 過度繪制的可能性低。
優(yōu)化方式:使用布局標(biāo)簽<merge>并合適選擇布局類型诗轻。
具體請看文章:《Android 性能優(yōu)化--02:布局優(yōu)化》
(4)優(yōu)化方案4:自定義控件View優(yōu)化:使用 clipRect() 钳宪、 quickReject()
-
clipRect()
??作用:給Canvas設(shè)置一個(gè)裁剪區(qū)域,只有在該區(qū)域內(nèi)才會被繪制扳炬,區(qū)域之外的都不繪制吏颖。
??實(shí)例:DrawerLayout布局的左抽屜布局。
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTim)
// 僅貼出關(guān)鍵代碼
// 1\. 遍歷DrawerLayout的child view恨樟,拿到抽屜布局
for (int i = 0; i < childCount; i++) {
final View v = getChildAt(i);
if (v == child || v.getVisibility() != VISIBLE
|| !hasOpaqueBackground(v) || !isDrawerView(v)
|| v.getHeight() < height) {
continue;
}
// a. 若是左抽屜布局
// 則取抽屜布局的右邊界作為裁剪區(qū)的左邊界半醉、設(shè)置原主布局的裁剪區(qū)域,如上圖裁剪區(qū)域
if (checkDrawerViewAbsoluteGravity(v, Gravity.LEFT)) {
final int vright = v.getRight();
if (vright > clipLeft) clipLeft = vright;
// b. 若是右抽屜布局
// 則取抽屜布局的左邊界作為裁剪區(qū)的右邊界劝术、設(shè)置原主布局的裁剪區(qū)域
} else {
final int vleft = v.getLeft();
if (vleft < clipRight) clipRight = vleft;
}
}
// 2\. 通過clipRect()設(shè)置原主布局的顯示范圍: 裁剪區(qū)域缩多,使其僅在上圖中的紅框區(qū)域(即不阻礙抽屜布局的區(qū)域)顯示
// 從而避免過度繪制
canvas.clipRect(clipLeft, 0, clipRight, getHeight());
}
......
}
- quickreject()
??作用:判斷和某個(gè)矩形相交。
??具體措施:若判斷與矩形相交养晋,則可跳過相交的區(qū)域衬吆,從而減少過度繪制。
4.3 其他優(yōu)化方案
4.4 總結(jié)
5.布局調(diào)優(yōu)工具
(1)背景:盡管已經(jīng)注意到上述的優(yōu)化策略绳泉,但實(shí)際開發(fā)中難免還是會出現(xiàn)布局性能的問題逊抡。
(2)解決方案:使用布局調(diào)優(yōu)工具。
此處主要介紹常用的:hierarchy viewer零酪、Profile GPU Rendering冒嫡、Systrace。
5.1 Hierarchy Viewer
(1)簡介:Android Studio 提供的UI性能檢測工具四苇。
(2)作用:可視化獲得UI布局設(shè)計(jì)結(jié)構(gòu)和各種屬性信息灯谣,幫助我們優(yōu)化布局設(shè)計(jì)。
即:方便查看Activity布局蛔琅,各個(gè)View的屬性胎许、布局測量-布局-繪制的時(shí)間。
(3)具體使用:Hierarchy Viewer 使用指南
5.2 Profile GPU Rendering
(1)簡介:一個(gè)圖形監(jiān)測工具罗售。
(2)作用:渲染辜窑、繪制性能追蹤,能實(shí)時(shí)反應(yīng)當(dāng)前繪制的耗時(shí)寨躁。
(3)具體使用:橫軸 = 時(shí)間穆碎、縱軸 = 每幀的耗時(shí);隨著時(shí)間推移职恳,從左到右的刷新呈現(xiàn)所禀;提供一個(gè)標(biāo)準(zhǔn)的耗時(shí)方面,如果高于標(biāo)準(zhǔn)耗時(shí),就表示當(dāng)前這一幀丟失色徘。
更詳細(xì)使用請看:Profile GPU Rendering 使用指南
5.3 Systrace
(1)簡介:Android 4.1以上版本提供的性能數(shù)據(jù)采樣和分析工具恭金。
(2)作用:檢測Android系統(tǒng)各個(gè)組件隨著時(shí)間的運(yùn)行狀態(tài)并提供解決方案。
收集運(yùn)行信息褂策,從而幫助開發(fā)者更直觀地分析系統(tǒng)瓶頸横腿,改進(jìn)性能;
檢測范圍包括:Android關(guān)鍵子系統(tǒng)(如WindowManagerService 等 Framework 部分關(guān)鍵模塊)斤寂、服務(wù)耿焊、View系統(tǒng);
功能包括:跟蹤系統(tǒng)的I/O 操作遍搞、內(nèi)核工作隊(duì)列罗侯、CPU 負(fù)載等,在 UI 顯示性能分析上提供很好的數(shù)據(jù)溪猿,特別是在動畫播放不流暢歇父、渲染卡等問題上。
(3)具體使用:Systrace 使用指南