- 在佈局文件中的背景遮擋的情況下,避免繪製DecorView的背景(有別於Activity的背景),減少過度繪製。
android:windowBackground屬性就是DecorView的背景
- 將Activity的背景放到DecorView的背景中(雖然性能優化不大,但是能把平滑的感知提供給用戶)
- 離屏緩衝開啓硬件層(API 14後默認開啓)
view.setLayerType(View.LAYER_TPYE_HARDWARE, null)
- 在動畫啓動前,開啓硬件層,在動畫結束時,立即關閉它,以釋放被佔用的顯存,以用來提高動畫性能,減少非必要計算
- 扁平化視圖層級
- 對背景圖片誰用9-patches圖片,可一定程度上減少過度繪製,因爲Android系統針對9-patches圖片做了優化。
- 一定情況下,用GridLayout代替LinearLayout或者RelativeLayout,一般情況下,RelativeLayout可以最大化減少佈局層級,相同的佈局效果,LinearLayout也許用了2層佈局,RelativeLayout用一層即可,但是LinearLayout效率是大於RelativeLayout的。GridLayout某些情況可以實現LinearLayout的效果。而且它由於是表格佈局,1層佈局層級實現相同的效果。
- 標籤重用佈局文件
- 標籤減少佈局冗餘,相當於直接將標籤裏的內容直接插到目標佈局中,不產生多層佈局。
- ViewStup延遲加載,縮短首次加載時間,減少GPU,CPU使用,減少內存分配
- ListView和RecyclerView使用ViewHolder模式重用View避免頻繁調用findViewById()消耗大量計算。
ListVIew中經常會出現別名衝突的情況,如下
- 爲ImageView對象設置一個適當的尺寸,避免引起內存泄漏。常用手段是壓縮Bitmap。
- 自定義View中避免不必要的重繪(invalidate()這些)
- 對每個View進行適當的裁剪,只繪製可見的一部分,必要時候爲了提升用戶體驗可以緩衝即將入屏的那部分View,以避免非必要的過度繪製。
- xml佈局的圖形化Design窗口可以查看視圖的層級,減少視圖嵌套的深度。(開發初期階段)
- Monitor中的Hierarchy Viewer對分析視圖層級,調試UI界面,佈局文件,查看繪製時間有的巨大的作用(當前SDK下Monitor逐漸被Android Profiler取代,Monitor可以0在{SDK根目錄}\tools\lib\monitor-x86_64找到)
- 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();
}
“`