Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android性能優化系列——Understanding Overdraw

Android性能優化系列——Understanding Overdraw

編輯:關於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(); // 裁剪canvas
canvas.quickReject(); // 判斷矩形區域是否相交

其他繪制優化建議

在onDraw函數裡盡量避免分配內存、創建對象,會導致頻繁的垃圾回收降低性能;
在初始化、或者動畫間隙做這些事情 減少invalidate的調用 盡可能保持layout的扁平化,盡可能少調用requestLayout(),requestLayout會導致系統遍歷整個View樹重新去measure和layout,如果layout嵌套復雜,這裡也會產生性能問題 如果布局復雜,可以考慮自定義ViewGroup來特殊處理

Reference

Android Performance Patterns: Understanding Overdraw
Android Performance Patterns: Invalidations, Layouts, and Performance

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved