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