標籤:android 效能最佳化
過度繪製(Overdraw)是指在一幀的時間內像素被繪製了多次;
理論上一個像素每次只繪製一次是最優的,但是由於層疊的布局導致一些像素會被多次繪製,而每次繪製都會對應到CPU的一組繪圖命令和GPU的一些操作,所以對重疊隱藏元素的重複繪製會產生額外的計算,需要盡量減少Overdraw的發生。
Android系統提供了測量Overdraw的選項,在開發人員選項-調試GPU過度繪製(Show GPU Overdraw),開啟選項就可以看到當前頁面Overdraw的狀態。
根據overdraw的次數會顯示不同的顏色來區分
- transparent = no overdraw
- blue = 1 layer
- green = 2 layers
- light-red = 3 layers
- dark red = you’re doing it wrong
最佳化方法
總的原則就是:盡量避免重疊隱藏元素的繪製
去除不需要的背景資源
- 在theme中添加
android:windowbackground="null";
- 在Activity中設定getWindow().setBackgroundDrawable(null)
這個方法要在setContentView()之後,因為getWindow().setBackground(Drawable)會講這裡的Drawable設定到DecorView的background,預設是0xff000000,而setContentView才會第一次初始化phoneWindow的DecorView;
分段設定背景
有時候為了方便會先給Layout設定一個整體的背景,再給子View設定背景,這裡也會造成重疊,如果子View寬度mach_parent,可以看到完全覆蓋了Layout的一部分,這裡就可以通過分別設定背景來減少重繪。
View onDraw()方法
自訂View繪製時避免重疊部分的繪製,可以使用
canvas.clipRect(); // 裁剪canvascanvas.quickReject(); // 判斷矩形地區是否相交
其他繪製最佳化建議
- 在onDraw函數裡盡量避免分配記憶體、建立對象,會導致頻繁的記憶體回收降低效能;
在初始化、或者動畫間隙做這些事情
- 減少invalidate的調用
- 儘可能保持layout的扁平化,儘可能少調用requestLayout(),requestLayout會導致系統遍曆整個View樹重新去measure和layout,如果layout嵌套複雜,這裡也會產生效能問題
- 如果布局複雜,可以考慮自訂ViewGroup來特殊處理
Reference
Android Performance Patterns: Understanding Overdraw
Android Performance Patterns: Invalidations, Layouts, and Performance
Android效能最佳化系列——Understanding Overdraw