文集目錄
ps:喜歡的點贊哦 android性能跟蹤分析工具系列 - 目錄
找到一篇GPU 呈現模式中基礎概念解釋最淺顯易懂的,大家看完這篇再看下面的內容會好很多
GPU 呈現模式分析這是 android 手機自帶的工具,先來看看這個工具:
上圖中下面的紅線,綠線就是我們想要的了,先別著急,下面就會細細說來
如何使用
這個使用起來很簡單的,打開 Android 手機 設置 - 開發者選項 - GPU呈現模式分析,然后我們想分析哪個 app,哪個頁面直接打開就好了,下面直接就會我們想要的數據圖標,是不是很方便,嗯嗯,簡單的才是最好的
可以監控到哪些信息
每種分析工具為外乎監控和分析數據,GPU 呈現模式分析工具又可以獲取什么信息呢:
- 可以查看android 手機每一幀的渲染情況,每一幀的總耗時,是否超過16ms,中間綠色橫線表示16ms
- 指定計算區域的耗時情況,圖片里每種顏色代表不同的數據計算階段
這個工具其實是最好用的了,很早就出現了,而且google一直在維護,更新,增強。仔細看這個工具有點如下優勢:
- 一是數據是試試刷新的
- 二是查看效果直觀,數據直接在我們需要的頁面下面展示
- 三是數據量豐富,圖標不同顏色代表不同的任務,那個任務耗時一眼就可以查看出來,總之是這個工具是結合數據獲取/展示/分析的一個很優秀的工具
經驗豐富的程序員通過這個工具就可以大前提查看出 app 哪里跑的慢了,看顏色條就知道,結合狀況就可以有的放矢的結合其他工具去仔細查找了。
使用詳解
GPU 呈現模式分析工具最核心的就是了解每種顏色代表什么任務,android 6.0之后,改工具得到加強,顏色條變得更多,其實我們查看起來還是看原來那些任務
4.x - 5.x 版本
藍色Update
這部分代表View創建和更新DisplayList的時間,如果這部分很高,那么表示我們有很多自定義的View,或者在 View.onDraw(Canvas) 當中進行了過于復雜的操作紫色XFer
這部分在Android 4.0之后才有,表示將資源傳遞到渲染線程所花的時間紅色Execute
這部分代表Android 2D渲染器向OpenGL發送命令來繪制和重繪的時間,這些命令就是來自于前面生成的Display List,如果這部分很高,那么說明執行Display Lists中的命令花費了很多的時間黃色Process
是指將一幀圖像交給合成器(compositor)的時間,如果這部分很高,那么說明GPU當前很忙碌
我在本系列文章的理論簡介中說到了渲染一幀的過程 :
- cpu測量,布局界面上變動的視圖對象,然后繪制這些 view(onDraw方法) 生成界面一幀數據
- 然后 cpu 把這計算出的這一幀數據傳遞給 gpu,這一幀數據也叫紋理,具體的去看 OpenGL的內容
- gpu 根據cpu 傳遞過來的紋理數據,去具體的繪制出2D 圖形來
- cpu 等待 pgu 通知繪制完成,cpu 才可以去干別的事,要不 cpu 會一直等著。。。這才算是完成了一幀的渲染
我們現在再來看數據圖,從下往上看,先是藍色的 update 部分,藍色執行的內容說白了就是執行有變動 view 的 measu / layout / onDraw 方法,然后生成一幀新的紋理。然后是紫色的 XFer 部分,傳遞 cpu 剛剛計算出來的這一幀給 GPU。然后紅色的 Execute 部分是 android 的2D渲染器通知 GPU 去繪制圖形。最后黃色的 Process 部分是 CPU 等待 GPU通知繪制完成
更詳細或者英文好的可以去看官方的文檔
http://android.xsoftlab.net/tools/performance/profile-gpu-rendering/index.html
6.X
哈哈,我的手機就是6.0的,我就偷懶用最上面個的效果圖啦
這是官方給的顏色解釋
Swap Buffers:表示處理任務的時間,也可以說是CPU等待GPU完成任務的時間,線條越高,表示GPU做的事情越多;
Command Issue:表示執行任務的時間,這部分主要是Android進行2D渲染顯示列表的時間,為了將內容繪制到屏幕上,Android需要使用Open GL ES的API接口來繪制顯示列表,紅色線條越高表示需要繪制的視圖更多;
Sync & Upload:表示的是準備當前界面上有待繪制的圖片所耗費的時間,為了減少該段區域的執行時間,我們可以減少屏幕上的圖片數量或者是縮小圖片的大小;
Draw:表示測量和繪制視圖列表所需要的時間,藍色線條越高表示每一幀需要更新很多視圖,或者View的onDraw方法中做了耗時操作;
Measure/Layout:表示布局的onMeasure與onLayout所花費的時間,一旦時間過長,就需要仔細檢查自己的布局是不是存在嚴重的性能問題;
Animation:表示計算執行動畫所需要花費的時間,包含的動畫有ObjectAnimator,ViewPropertyAnimator,Transition等等。一旦這里的執行時間過長,就需要檢查是不是使用了非官方的動畫工具或者是檢查動畫執行的過程中是不是觸發了讀寫操作等等;
Input Handling:表示系統處理輸入事件所耗費的時間,粗略等于對事件處理方法所執行的時間。一旦執行時間過長,意味著在處理用戶的輸入事件的地方執行了復雜的操作;
Misc Time/Vsync Delay:表示在主線程執行了太多的任務,導致UI渲染跟不上vSync的信號而出現掉幀的情況;出現該線條的時候,可以在Log中看到這樣的日志:
6.x 中的圖中,把顏色分的更新了,頁更能表現出更多的任務來,仔細看最底下的深綠色新添加的,是我們需要仔關注的,表示 UI線程因為任務多,造成渲染界面延遲。其他的都是 4.x - 5.x 版本的東西。
分析經驗
關于紅色和黃色部分,這2部分的任務都不是在 UI 線程執行的,都是在渲染線程或是 GPU了來干的,所以紅的和黃的耗時不一定就是表示界面卡頓了,我們要根據情況區別分析:比如列表中有大量的網絡圖片需要加載顯示,因為這些網絡圖片都是使用單獨線程來加載顯示的,所以這個 UI 線程并不卡頓,但是要是我們加載大量 app 內部的 png 靜態圖片的話,那么肯定會卡的。
舉個例子,我們有100個東西需求顯示,我們在初始幀時只顯示10個,然后1S 內顯示剩下的90個,這就相當于把100個東西放寬在1S 內顯示完。要是我們要求這100個東西一定要在初始幀顯示完,那么這么大的計算和渲染量肯定會卡幀的。
所以我們在面臨有大量 app 內靜態 png 圖片顯示時,可以對 imageview 做一下延遲顯示,在頁面顯示之后,再去顯示圖片。
藍色和綠色部分是我們需要重點關注的,這是因為布局層級多,效率低,過度繪制,造成的。另外圖片量大,體積大也會造成淺藍色耗時。
深綠色也是我們關注的重點,我在上面說了,這是新增的內容,反應的是 UI 線程渲染界面出現延遲,要是發現這里耗時了,肯定是 cpu 在這個時間段干的事多了,卡了,我們可以使用 Trace View 去最終下在頁面的生命周期函數內有耗時操作。