1. 程式人生 > >Android UI渲染總結

Android UI渲染總結

翻譯文推薦:Android UI效能優化詳解
http://mrpeak.cn/android/2016/01/11/android-performance-ui

在Android Studio下使用Hierarchy Viewer
http://www.jianshu.com/p/e9e05ce5b0c9

【轉載地址:http://blog.csdn.net/jiahui_zhu/article/details/52212412
Android UI渲染分為3個過程,分別是測量、佈局和繪製,這3個都是深度優先準則,父UI在子UI之前繪製,再按順序繪製兄弟UI。
Android每16ms發一次VSYNC訊號觸發UI渲染,只要16ms能達到一個流暢的畫面,使用者就不會感到卡頓。1000 / 16 ≈60Hz。
渲染分為CPU部分與GPU部分。CPU部分包括測量、佈局、記錄和執行。GPU部分需要完成光柵化,計算每一個畫素點的值。

Android的顯示過程包含兩個部分,分別是應用側繪製和系統側渲染;採用兩個機制,分別是程序側通訊機制和顯示重新整理機制。
繪製模型分為基於軟體的繪製模型和基於硬體加速的繪製模型。
在基於軟體的繪製模型下,CPU主導繪製,檢視按照兩個步驟繪製,分別是讓View層次結構失效,繪製View層次結構。但是會有兩個缺點,繪製了不需要重繪的區域,掩蓋了一些應用的bug。
在基於硬體加速的繪製模型中,GPU主導繪圖,按照3個步驟繪製:1)讓View層次結構失效; 2) 記錄更新列表; 3) 繪製顯示列表。
硬體加速的3個缺陷:1) 相容新,部分繪製方式不支援或者不完全支援硬體方式;
2) 記憶體消耗,OPENGL API 呼叫就會佔用8MB,而實際上會佔用更多記憶體。
3) 電量消耗,GPU耗電較多。
顯示的兩個機制,一般採用雙緩衝技術,意味著要採用兩個緩衝區,一個稱為Front Buffer, 另一個稱謂Back Buffer,UI現在Back Buffer中繪製,再和Front Buffer進行交換,最多就是三緩衝了,緩衝並不是越多越好。

引發掉幀的原因:
1)大量的重繪
2)過度繪製,在在繪製使用者看不到的物件上花太多時間
3)有一大堆重複動畫重複了一遍又一遍,消耗CPU、GPU資源
4)頻繁地觸發垃圾回收
5)ViewGroup樹太深
所有消耗資源的操作,如IO操作、網路操作、SQL操作,列表重新整理等,都應該放在後臺處理,而不是佔用UI執行緒,以保證UI的流暢性。

介面開發優化的Advice:
1. 優化佈局的結構
1)避免複雜的View層次
2)儘量避免在頂層檢視中使用RelativeLayout,儘量使用LinearLayout和FrameLayout
3)佈局層級一樣的情況下,用LinearLayout代替RelativeLayout
4)在複雜層級上,使用RelativeLay而非LinearLayout來儘量減少層級
5)不使用AbsoluteLayout
6)儘量少使用LayoutWeight
7)合理的佈局應該是寬而淺,而非窄而深
2. 優化處理邏輯
1)按需載入檢視,某些不怎麼重用的耗資源檢視,等到需要的時候再載入
2)避免在UI執行緒中進行耗時操作
3. 使用Android自帶的效能測試工具Lint進行優化

RelativeLayout與LinearLayout效能比較
1) RelativeLayout會讓子View呼叫兩次Measure()。LinearLayout在有layoutWeight是呼叫兩次onMeasure(),沒有時呼叫一次onMeasure()
2) RelativeLayout的子View如果與父View的高度不同,會引發效率問題,當佈局很複雜的時候,問題會更嚴重,因此儘量用padding代替margin
3) 在相同的層級下,用LinearLayout或者FrameLayout代替RelativeLayout
4) 在複雜佈局下,用RelativeLayout減少佈局層級