序言
app的性能優(yōu)化可分為 流暢,穩(wěn)定性,耗電量,流量節(jié)省 幾個大類,其中與流暢掛鉤的就是UI界面的優(yōu)化程度,在17年的開發(fā)中接觸過一些UI界面卡頓的問題,在開發(fā)代碼的過程中也應(yīng)用到一些技巧,UI優(yōu)化的文章也接觸了很多,但一直沒有做一個系統(tǒng)的歸納總結(jié)。這篇歸納總結(jié)就從比較常用的GPU-RENDERING-PROFILE 開始總結(jié).
GPU RENDERING PROFILE
Android在開發(fā)者工具選項中提供了一些列性能調(diào)優(yōu)的輔助工具,其中就包括 過度繪制顯示和GPU渲染分析(這個翻譯不知道對不對)
GPU-RENDERING-PROFILE是什么
GPU-RENDERING-PROFILE(后面簡稱GRP)可以通過在屏幕上繪制滾動的柱狀圖來顯示繪制每一幀所消耗的時間,每根柱子由不同的顏色構(gòu)成,分別代表UI繪制的不同階段,并且在柱狀圖的中間還有一根綠色的橫線代表16ms的繪制時間基準(zhǔn).GRP會統(tǒng)計并顯示app最近運行的128幀.
android是如何將view繪制到屏幕
要理解柱狀圖不同顏色的含義,就有必要先了解android繪制view到屏幕上的大致流程.
總體來說,代碼中的view控件轉(zhuǎn)化為屏幕上可見的圖像就是轉(zhuǎn)換成為屏幕上一個一個像素點的過程,這個過程叫做柵格化(rasterization).
上圖直接用了鏈接中文章中的貼圖:
http://hukai.me/android-performance-patterns/
這張圖很清晰地展示了整個柵格化的大致過程(缺少將view轉(zhuǎn)化為紋理的一步),如果加上這一步,整個過程為:
- TextView,Button等等控件通過cpu計算轉(zhuǎn)換為內(nèi)存中的polygons(多邊圖形)和texture(紋理)
- cpu通過OpenGL|ES的接口將紋理數(shù)據(jù)傳遞給GPU渲染處理,在這個過程中,由DisplayList這個結(jié)構(gòu)負(fù)責(zé)保存繪制用到的所有信息,在Displaylist無需重新創(chuàng)建或改變的情況下,GPU可以直接使用這里的數(shù)據(jù)進(jìn)行渲染.通過第二張圖我們可以看出invalidate()這個操作會導(dǎo)致displaylist的刷新和重新執(zhí)行.(這里的過程有些復(fù)雜,有篇文章講解得不錯)
http://djt.qq.com/article/view/987 - GPU將渲染圖形顯示到屏幕
為了保證不掉幀,整個所有過程加起來需要在16ms內(nèi)完成。了解了圖形顯示的大致流程,再回頭看柱狀圖的含義就容易理解了.
柱狀圖不同顏色的不同含義
color | name | meaning |
---|---|---|
墨綠色 | MiscTime/VSync Delay | 代表在連續(xù)兩幀間的時間間隔,可能是因為子線程執(zhí)行時間過長搶占了UI線程被cpu執(zhí)行的機會. |
深綠色 | Input Handing | 代表app在用戶輸入事件回調(diào)中花費的時間,這部分過高可能意味著app處理用戶輸入事件時間過長,建議將操作分流到工作線程. |
綠色 | Animation | 代表為該幀內(nèi)所有animator求值(屬性動畫中代表通過估值器計算屬性的具體值)所花費的時間.如果這部分過高,代表自定義animator性能不佳或者更新view屬性引發(fā)了某些意外操作. |
淡綠色 | Measure/Layout | 代表了onLayout和onMeasure方法消耗的總時間,這段很高代表遍歷整個view樹結(jié)構(gòu)花費了太多時間. |
深藍(lán)色 | draw | 代表創(chuàng)建更新DisplayList的時間,過高代表在onDraw中花費過多時間,可能是自定義畫圖操作太多或執(zhí)行了其它操作. |
淺藍(lán)色 | sync&upload | 向CPU傳輸Bitmap花費的時間,過高代表了加載了大量圖形. |
紅色 | command Issue | Android 2D渲染器向OpenGL發(fā)出命令繪制或重繪display lists 花費的時間,柱子的高度等于所有Display list繪制時間的總和. |
橘色 | swap buffers | 代表cpu在等待gpu完成工作,如果過高代表GPU需要完成的工作過多. |
來看下每種顏色代表的是整個顯示流程的哪一步
color | name | meaning |
---|---|---|
墨綠色 | MiscTime/VSync Delay | 代表在連續(xù)兩幀間的時間間隔,可能是因為子線程執(zhí)行時間過長搶占了UI線程被cpu執(zhí)行的機會. |
深綠色 | Input Handing | 代表app在用戶輸入事件回調(diào)中花費的時間,這部分過高可能意味著app處理用戶輸入事件時間過長,建議將操作分流到工作線程. |
綠色 | Animation | 代表為該幀內(nèi)所有animator求值(屬性動畫中代表通過估值器計算屬性的具體值)所花費的時間.如果這部分過高,代表自定義animator性能不佳或者更新view屬性引發(fā)了某些意外操作. |
淡綠色 | Measure/Layout | 代表了onLayout和onMeasure方法消耗的總時間,這段很高代表遍歷整個view樹結(jié)構(gòu)花費了太多時間. |
深藍(lán)色 | draw | 代表創(chuàng)建更新DisplayList的時間,過高代表在onDraw中花費過多時間,可能是自定義畫圖操作太多或執(zhí)行了其它操作. |
淺藍(lán)色 | sync&upload | 向CPU傳輸Bitmap花費的時間,過高代表了加載了大量圖形. |
紅色 | command Issue | Android 2D渲染器向OpenGL發(fā)出命令繪制或重繪display lists 花費的時間,柱子的高度等于所有Display list繪制時間的總和. |
橘色 | swap buffers | 代表cpu在等待gpu完成工作,如果過高代表GPU需要完成的工作過多. |
https://developer.android.com/studio/profile/inspect-gpu-rendering.html
上面的表格是對各種顏色含義的簡單的介紹,官方文檔中有更詳細(xì)的介紹,針對每一點都鋪開來講,這里暫時先不完整記錄,只先附上鏈接.
https://developer.android.com/topic/performance/rendering/profile-gpu.html
這篇總結(jié)簡單記錄了 GRP的使用和含義,over.