Android性能調優(yōu) - 繪制優(yōu)化

1.前言

  • 繪制優(yōu)化 是體現Android性能主要部分之一。
  • 本文主要通過影響、原理、檢測、優(yōu)化四個方向詮釋。
  • 文章中實例 linhaojian的Github

2.影響

  • 如果繪制處理不適當,就會導致以下影響:
    • Android 應用界面顯示速度。
    • 用戶交互時界面發(fā)生卡頓現象。

3.繪制原理

  • 簡單的理解繪制的過程,可以幫助分析產生上述影響的原因與對應的優(yōu)化思路。
  • Android應用層視圖繪制包含三大流程:測量(measure)、布局(layout)、繪制(draw)。
    繪制過程.jpg
    • 測量:確定視圖的大?。ǜ?、寬);
    • 布局:確定視圖的位置(左上角坐標);
    • 繪制:在畫布canvas上繪制視圖;
  • 在一個Android界面里的視圖類似于樹結構(父、子View),如下圖:
    視圖樹結構.jpg
  • 由此可知:一個界面就是通過遞歸的方式,完成所有視圖的測量、布局和繪制;

4.檢測方式

  • 在繪制優(yōu)化的道路上,我們可以借助工具幫助我們更快、更準確的定位性能問題。

4.1 開發(fā)者中的 "過渡繪制" 檢測

  • 開啟 "過渡繪制" 檢測,可以在屏幕上看到不同顏色區(qū)域:


    過渡繪制1.png

    過渡繪制.png
  • 根據上圖的顏色,判斷應用中是否存在過渡繪制的問題,過渡繪制是不可避免的,只可以減少,界面嵌套嚴重 或者 存在不必要的背景就非常容易導致過渡繪制,所以在布局的當中要減少嵌套與去掉必要的背景。

4.2 開發(fā)者中的 "GPU"檢測

  • 開啟 "GPU檢測",可以在屏幕上看到不同顏色的條形圖:


    gpu檢測.png
    • 綠色的橫線:警戒線,超過這條線則意味著時長超過了16m,盡量要保證垂直的彩色柱狀圖保持在綠線下面。


      gpu檢測1.png

      下面來分別介紹它們的含義:

    • Swap Buffers:表示處理的時間,和上面講到的橙色一樣。
    • Command Issue:表示執(zhí)行的時間,和上面講到的紅色一樣。
    • Sync & Upload:表示的是準備當前界面上有待繪制的圖片所耗費的時間,為了減少該段區(qū)域的執(zhí)行時間,我們可以減少屏幕上的圖片數量或者是縮小圖片的大小。
    • Draw:表示測量和繪制視圖列表所需要的時間,和上面講到的藍色一樣。
    • Measure/Layout:表示布局的onMeasure與onLayout所花費的時間,一旦時間過長,就需要仔細檢查自己的布局是不是存在嚴重的性能問題。
    • Animation:表示計算執(zhí)行動畫所需要花費的時間,包含的動畫有ObjectAnimator,ViewPropertyAnimator,Transition等。一旦這里的執(zhí)行時間過長,就需要檢查是不是使用了非官方的動畫工具或者是檢查動畫執(zhí)行的過程中是不是觸發(fā)了讀寫操作等等。
    • Input Handling:表示系統(tǒng)處理輸入事件所耗費的時間,粗略等于對事件處理方法所執(zhí)行的時間。一旦執(zhí)行時間過長,意味著在處理用戶的輸入事件的地方執(zhí)行了復雜的操作。
    • Misc Time/Vsync Delay:表示在主線程執(zhí)行了太多的任務,導致UI渲染跟不上vSync的信號而出現掉幀的情況。

5.優(yōu)化

  • 針對繪制性能問題,把優(yōu)化分為兩個部分:布局、繪制;

5.1 布局優(yōu)化

  1. 減少界面嵌套,對于負責的View可以使用Constraintlayout;
  2. 使用include復用布局;
  3. 使用merge去除多余層級;
  4. 使用ViewStub提高加載速度(按需才加載 & 顯示);
  5. 減少不必要的背景(例如:最常見list中item的背景與父控件的背景一樣,使得view繪制過渡);

5.2 繪制優(yōu)化

  1. 減少onDraw中耗時操作(如:for);
  2. 避免onDraw中創(chuàng)建對象,因為onDraw有可能會被頻繁調用,如果在此做創(chuàng)建對象操作,內存占有就越來越大,
    就有可能會多此觸發(fā)系統(tǒng)GC ,導致降低了程序的執(zhí)行效率;
  3. 針對有層疊的自定義View,可以多使用clipRect() 、 quickReject();
  4. 繪制一些bitmap時,應該只保持一次初始化,并且使用RGB565格式渲染。

6.總結

  • 到此,繪制優(yōu)化 介紹完畢。
  • 如果喜歡我的分享,可以點擊 關注 或者 ,你們支持是我分享的最大動力 。
  • linhaojian的Github

歡迎關注linhaojian_CSDN博客或者linhaojian_簡書

不定期分享關于安卓開發(fā)的干貨。


寫技術文章初心

  • 技術知識積累
  • 技術知識鞏固
  • 技術知識分享
  • 技術知識交流
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 昨天是小寶出生后,媽媽離開的第一天,也是我和妞妞獨自照顧他的第一天,感覺還不錯。就是有些太忙碌了,做飯都要親自做了...
    秋子的追尋閱讀 172評論 0 1
  • 《相思》是由彭擎政指導的一部動畫短片。講述了嘉定名士王初桐和發(fā)小六娘青梅竹馬、紅豆定情卻無緣廝守的愛情故事。 ...
    莫瑩2018閱讀 580評論 0 2
  • 43.ajax 的過程是怎樣的 創(chuàng)建XMLHttpRequest對象,也就是創(chuàng)建一個異步調用對象 創(chuàng)建一個新的HT...
    開心糖果的夏天閱讀 327評論 0 3

友情鏈接更多精彩內容