1.前言
-
繪制優化
是體現Android性能主要部分之一。 - 本文主要通過影響、原理、檢測、優化四個方向詮釋。
- 文章中實例 linhaojian的Github
2.影響
- 如果繪制處理不適當,就會導致以下影響:
- Android 應用界面顯示速度。
- 用戶交互時界面發生卡頓現象。
3.繪制原理
- 簡單的理解繪制的過程,可以幫助分析產生上述影響的原因與對應的優化思路。
-
Android
應用層視圖繪制包含三大流程:測量(measure)、布局(layout)、繪制(draw)。
繪制過程.jpg- 測量:確定視圖的大小(高、寬);
- 布局:確定視圖的位置(左上角坐標);
- 繪制:在畫布canvas上繪制視圖;
- 在一個
Android
界面里的視圖類似于樹結構(父、子View),如下圖:
視圖樹結構.jpg - 由此可知:一個界面就是通過遞歸的方式,完成所有視圖的測量、布局和繪制;
4.檢測方式
- 在繪制優化的道路上,我們可以借助工具幫助我們更快、更準確的定位性能問題。
4.1 開發者中的 "過渡繪制" 檢測
-
開啟 "過渡繪制" 檢測,可以在屏幕上看到不同顏色區域:
過渡繪制1.png
過渡繪制.png - 根據上圖的顏色,判斷應用中是否存在過渡繪制的問題,過渡繪制是不可避免的,只可以減少,界面嵌套嚴重 或者 存在不必要的背景就非常容易導致過渡繪制,所以在布局的當中要減少嵌套與去掉必要的背景。
4.2 開發者中的 "GPU"檢測
-
開啟 "GPU檢測",可以在屏幕上看到不同顏色的條形圖:
gpu檢測.png-
綠色的橫線:警戒線,超過這條線則意味著時長超過了16m,盡量要保證垂直的彩色柱狀圖保持在綠線下面。
gpu檢測1.png
下面來分別介紹它們的含義:
- Swap Buffers:表示處理的時間,和上面講到的橙色一樣。
- Command Issue:表示執行的時間,和上面講到的紅色一樣。
- Sync & Upload:表示的是準備當前界面上有待繪制的圖片所耗費的時間,為了減少該段區域的執行時間,我們可以減少屏幕上的圖片數量或者是縮小圖片的大小。
- Draw:表示測量和繪制視圖列表所需要的時間,和上面講到的藍色一樣。
- Measure/Layout:表示布局的onMeasure與onLayout所花費的時間,一旦時間過長,就需要仔細檢查自己的布局是不是存在嚴重的性能問題。
- Animation:表示計算執行動畫所需要花費的時間,包含的動畫有ObjectAnimator,ViewPropertyAnimator,Transition等。一旦這里的執行時間過長,就需要檢查是不是使用了非官方的動畫工具或者是檢查動畫執行的過程中是不是觸發了讀寫操作等等。
- Input Handling:表示系統處理輸入事件所耗費的時間,粗略等于對事件處理方法所執行的時間。一旦執行時間過長,意味著在處理用戶的輸入事件的地方執行了復雜的操作。
- Misc Time/Vsync Delay:表示在主線程執行了太多的任務,導致UI渲染跟不上vSync的信號而出現掉幀的情況。
-
5.優化
- 針對繪制性能問題,把優化分為兩個部分:布局、繪制;
5.1 布局優化
- 減少界面嵌套,對于負責的View可以使用Constraintlayout;
- 使用include復用布局;
- 使用merge去除多余層級;
- 使用ViewStub提高加載速度(按需才加載 & 顯示);
- 減少不必要的背景(例如:最常見list中item的背景與父控件的背景一樣,使得view繪制過渡);
5.2 繪制優化
- 減少onDraw中耗時操作(如:for);
- 避免onDraw中創建對象,因為onDraw有可能會被頻繁調用,如果在此做創建對象操作,內存占有就越來越大,
就有可能會多此觸發系統GC ,導致降低了程序的執行效率; - 針對有層疊的自定義View,可以多使用clipRect() 、 quickReject();
- 繪制一些bitmap時,應該只保持一次初始化,并且使用RGB565格式渲染。
6.總結
- 到此,
繪制優化
介紹完畢。 - 如果喜歡我的分享,可以點擊 關注 或者 贊,你們支持是我分享的最大動力 。
- linhaojian的Github
歡迎關注linhaojian_CSDN博客或者linhaojian_簡書!
不定期分享關于安卓開發的干貨。
寫技術文章初心
- 技術知識積累
- 技術知識鞏固
- 技術知識分享
- 技術知識交流