概述
谷歌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结构的实用工具。