Android效能最佳化系列——Understanding Overdraw

來源:互聯網
上載者:User

標籤: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
最佳化方法

總的原則就是:盡量避免重疊隱藏元素的繪製

  1. 去除不需要的背景資源

    • 在theme中添加 android:windowbackground="null"
    • 在Activity中設定getWindow().setBackgroundDrawable(null)
      這個方法要在setContentView()之後,因為getWindow().setBackground(Drawable)會講這裡的Drawable設定到DecorView的background,預設是0xff000000,而setContentView才會第一次初始化phoneWindow的DecorView;
  2. 分段設定背景
    有時候為了方便會先給Layout設定一個整體的背景,再給子View設定背景,這裡也會造成重疊,如果子View寬度mach_parent,可以看到完全覆蓋了Layout的一部分,這裡就可以通過分別設定背景來減少重繪。

  3. View onDraw()方法
    自訂View繪製時避免重疊部分的繪製,可以使用

canvas.clipRect(); // 裁剪canvascanvas.quickReject(); // 判斷矩形地區是否相交
其他繪製最佳化建議
  1. 在onDraw函數裡盡量避免分配記憶體、建立對象,會導致頻繁的記憶體回收降低效能;
    在初始化、或者動畫間隙做這些事情
  2. 減少invalidate的調用
  3. 儘可能保持layout的扁平化,儘可能少調用requestLayout(),requestLayout會導致系統遍曆整個View樹重新去measure和layout,如果layout嵌套複雜,這裡也會產生效能問題
  4. 如果布局複雜,可以考慮自訂ViewGroup來特殊處理
Reference

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

Android效能最佳化系列——Understanding Overdraw

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.