概述
谷歌05年初發布性能優化典范,是的開發者學會如何去識別、診斷、解決安卓應用開發中所存在的性能問題。首當其沖的便是渲染的性能優化。
渲染機制
一般原生app開發時,自定義view時,因為布局的層次過多,導致不必要的繪制,,或者因為onDraw等方法中有耗時的操作從而使的界面卡頓。
一般來說,安卓系統美16ms會發出一個信號,觸發對ui進行渲染,所以一旦操作超過了16ms酒會發生卡頓的現象。其主要原因就是系統發出信號時,ui無法進行渲染,還在進行別的操作,那么就會導致丟幀的現象。在網上看了看,16ms的原因就是意味1000/60 hz,相當于60fps,人眼感知的一般無法超過60fps。
所以,總的來說,安卓界面的卡頓原因就在于沒有必要的布局、invalidations失效以及Overdraw重新繪制屏幕。
主要是通過:
- 通過Hierarchy Viewer去檢測渲染效率,去除不必要的嵌套
- 通過Show GPU Overdraw去檢測Overdraw,最終可以通過移除不必要的背景以及使用canvas.clipRect解決大多數問題。
Overdraw檢測
安卓4.2里面,開發者選項菜單有Debug GPU Overdraw,或者以上的話在屏幕左下角會有一個計數展示屏幕overdraw的程度。
另一種方式則是在Debug GPU overdraw菜單里選擇“Show Overdraw areas”選項。選擇之后,會在app的不同區域覆蓋不同的顏色來表示overdraw的次數。比較屏幕上這些不同的顏色,可以快速方便的定位overdraw問題:
白色:沒有overdraw 藍色:1x overdraw(屏幕繪制了2次) 綠色:2x overdraw 淺紅色:3x overdraw 深紅色:4x或者更多overdraw
總結通過減少view的數量活著去除重復繪制的view,app的渲染會更快。
Overdraw處理方案
移除不要的background
在正常的開發中,可以移除不必要的background,以減少繪制的程度。
如設置了主布局文件的背景顏色,就可以移除listview以及listview的items中的一些background。
以及當我們在layout中設置了背景色,activity的view中的背景就沒有必要了,可以調用getWindow().setBackgroundDrawable(null);設置。
使用clipRect
當我們繪制了多個view的時候,如果每一個view并不需要完全繪制在屏幕上時,我們就可以在onDraw方法中使用canvas.clipRect(0, 0, 0,0);方法
Hierarchy Viewer
安卓sdk中包含著歌工具,在android studio中tools下面的android下的android device monitor就能看到。Hierarchy Viewer可以很方便可視化的查看屏幕上套嵌view結構,是查看你的view結構的實用工具。