一、UI性能分析概述
目标:在中低端手机上UI帧率平稳连贯。
1.十六毫秒准则
一般Android设备的屏幕刷新率为60帧每秒,那么一帧的时间为1/60fps = 16.6ms。
所谓的掉帧现象指的是,某一帧的等待数据时间加上绘制图像时间超过16.6ms时,这一帧会被放弃掉,不出现在频幕上,取而代之的是下一帧。
2.系统对UI的优化
- 软解时代:2.3及之前,所有绘图由CPU完成。
- 硬解时代:2.3之后,系统增加了GPU,很多绘图操作交给GPU进行渲染。
- 黄油时代:4.1之后,通过VSYNC垂直同步机制和多缓冲机制(three frame buffer)进一步提高绘制效率。
- 异步绘制时代:5.0之后,系统增加了Render Thread。通过这个线程进行异步绘制,某一帧发生延迟也不会影响下一帧的绘制。
3.编写布局准则
尽量少嵌套布局。
因为系统绘制一个ViewGroup时,会采用深度优先遍历遍历每一个子View,所以层级越深,耗费时间是指数增长的。尽量少编写测量复杂的布局。
测量复杂的布局如RelativeLayout过多子View,会导致系统需要多次测量才能确定这些View的尺寸。所以极致扁平化布局有可能得不偿失。终极目标:尽量减少View的数量。
无论对应减少测量时间以及绘制时间还有内存占用都是有帮助的!
4.一些建议
LinearLayout和RelativeLayout对比。
- LinearLayout优点在于测量方式简单,测量耗时较短,但由于功能简单,通常需要嵌套布局才能实现想要的效果。
- RelativeLayout优点在于能实现扁平化布局,缺点在于布局越复杂,测量的耗时增加不少,并且有可能需要多次测量。
- 谷歌推荐使用ConstraintLayout,它能有效减少嵌套布局和实现复杂布局。
使用Merge标签去掉多余层级。
使用ViewStub延时渲染。
二、性能检测工具
1.Hierarcy Viewer
作用:
- 查看当前界面的View树信息,以及测量,布局,绘制时间。
打开方式:
- 首先打开Android Device Monitor:SDK目录 -> tools -> monitor。
- 然后观察窗口顶栏有个带加号窗口按钮,点开发现有Hierarcy Viewer选项。
2.Trace for OpenGL ES
作用:
- 查看当前界面绘制步骤和每步的耗时。
打开方式:
- 打开的地方同上,窗口顶栏有个带加号窗口按钮,点开发现有Trace for OpenGL ES选项。
3.Systrace
作用:
- 追踪系统性能信息。
打开方式:
- 图形界面:DDMS内左侧有一栏小图标,倒数第二个图标。(将鼠标长时间停留在图标上会显示提示信息)
- 命令行:SDK目录 -> platform-tools -> systrace。在该目录下执行
python systrace.py --time=10 -o mytrace.html sched gfx view wm
抓取Graphics、view、window manager数据。
4.TraceView
作用:
- 获取单次执行最耗时方法。
- 获取执行次数最多的方法。
打开方式:
- DDMS
三、参考资料
- 《Android群英传 神兵利器》
- Android Developer网站