Android性能優化之佈局優化

  1. 在佈局文件中的背景遮擋的情況下,避免繪製DecorView的背景(有別於Activity的背景),減少過度繪製。
android:windowBackground屬性就是DecorView的背景
  1. 將Activity的背景放到DecorView的背景中(雖然性能優化不大,但是能把平滑的感知提供給用戶)
  2. 離屏緩衝開啓硬件層(API 14後默認開啓)
view.setLayerType(View.LAYER_TPYE_HARDWARE, null)
  1. 在動畫啓動前,開啓硬件層,在動畫結束時,立即關閉它,以釋放被佔用的顯存,以用來提高動畫性能,減少非必要計算
  2. 扁平化視圖層級
  3. 對背景圖片誰用9-patches圖片,可一定程度上減少過度繪製,因爲Android系統針對9-patches圖片做了優化。
  4. 一定情況下,用GridLayout代替LinearLayout或者RelativeLayout,一般情況下,RelativeLayout可以最大化減少佈局層級,相同的佈局效果,LinearLayout也許用了2層佈局,RelativeLayout用一層即可,但是LinearLayout效率是大於RelativeLayout的。GridLayout某些情況可以實現LinearLayout的效果。而且它由於是表格佈局,1層佈局層級實現相同的效果。
  5. 標籤重用佈局文件
  6. 標籤減少佈局冗餘,相當於直接將標籤裏的內容直接插到目標佈局中,不產生多層佈局。
  7. ViewStup延遲加載,縮短首次加載時間,減少GPU,CPU使用,減少內存分配
  8. ListView和RecyclerView使用ViewHolder模式重用View避免頻繁調用findViewById()消耗大量計算。
    ListVIew中經常會出現別名衝突的情況,如下

  1. 爲ImageView對象設置一個適當的尺寸,避免引起內存泄漏。常用手段是壓縮Bitmap。
  2. 自定義View中避免不必要的重繪(invalidate()這些)
  3. 對每個View進行適當的裁剪,只繪製可見的一部分,必要時候爲了提升用戶體驗可以緩衝即將入屏的那部分View,以避免非必要的過度繪製。
  4. xml佈局的圖形化Design窗口可以查看視圖的層級,減少視圖嵌套的深度。(開發初期階段)
  5. Monitor中的Hierarchy Viewer對分析視圖層級,調試UI界面,佈局文件,查看繪製時間有的巨大的作用(當前SDK下Monitor逐漸被Android Profiler取代,Monitor可以0在{SDK根目錄}\tools\lib\monitor-x86_64找到)
  6. Android設備開發者模式中調試GPU過度繪製,可以打開根據不同的色塊查看過度繪製的次數(注意關閉護眼模式,或者色溫調到標準)
真彩色(0次)<藍色(1次)<綠色(2次)<粉色(3次)<紅色(4次及以上)
````

18. Android設備GPU呈現模式分析,可以在設備屏幕直接查看渲染不同階段所花費的時間。以藍紫紅橙四個色段的長條顯示不同處理階段,以及他們用的時間比




<div class="se-preview-section-delimiter"></div>

藍:繪製時間,一般指onDraw,當然還有別的,
紫:準備時間
紅:處理OpenGL的時間
橙:CPU等待GPU完成工作所花費的時間

19. adb shell dumbsys命令,用於查看所有程序操作,內存使用情況,以及每個渲染操作花費的確切時間。以數值形式返回,它更像一個log。API 23之後,dumbsys的新特性framestats會在前面的基礎上列出了幀渲染過程中每個信息步驟所消費的時間。





<div class="se-preview-section-delimiter"></div>

framestats特性中的IntentedVsysnc和Vsync如果不一樣可說明幀發生了丟失(伴隨的卡頓的產生)


20. Systrace分析渲染的各種信息,graphics,input,View System,WebView,Window Manager,Activity Manager等等





<div class="se-preview-section-delimiter"></div>

Trace.beginSection(“Section Name”);
try{
//要分析的代碼
}finally{
Trace.endSection();
}
“`


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章