Android优化笔记(二)——渲染篇(优化)

UI过度绘制

过度绘制是指屏幕上的某个像素点在同一帧的时间内绘制了多次。

1.调试GPU过度绘制选项

检测过度绘制可以借助开发者选项里自带的调试GPU过度绘制选项。
image

1.原色 – 没有被过度绘制 – 绘制了一次。
2.蓝色 – 1次过度绘制 – 绘制了两次。
3.绿色 – 2次过度绘制 – 绘制了三次。
4.粉色 – 3次过度绘制 – 绘制了四次。
5.红色 – 4次过度绘制 – 绘制了五次。

原则上大片的蓝色还是可以接受的,中等大小的绿色区域是可以接受的但你应该尝试优化、减少它们,小范围粉色可以接受,而红色则是错误的,应该修复它们。

2.Tracer for OpenGL ES

另一个检测工具是Tracer for OpenGL ES,Tracer for OpenGL ES(http://developer.android.com/tools/help/gltracer.html)是Android SDK中新增加的开发工具,可逐帧(准确得说是逐函数)记录app用OpenGL ES的绘制过程。它提供了每个OpenGL函数调用的消耗时间,所以很多时候用来作performance分析。

在DDMS里通过Tracer for OpenGL ES生成一份gltrace文件,打开该文件后,点到glDrawArrays命令(蓝色)就可以观察绘制过程,通过观察绘制过程,我们就能知道在绘制区域里发生的过度绘制现象了。

3.常见过度绘制优化

(1)去掉window的默认背景,DecorView的background此时对我们来说是无用的,但是它会产生一次Overdraw,带来绘制性能损耗。去掉window的背景可以在onCreate()中setContentView()之后调用
getWindow().setBackgroundDrawable(null);
(2)去掉不必要的背景,有时候为了方便会先给Layout设置一个整体的背景,再给子View设置背景,这里也会造成重叠。
(3)在自定义View的onDraw中,如果涉及到重叠的绘制view时,可以考虑利用局部绘制避免过度绘制。canvas.clipRect()方法,只会显示被裁剪的区域,之外的区域将不会显示。并且可以使用canvas.quickreject()来判断是否没和某个矩形相交。在自定义View中,如果有叠加的部分,可以用clipRect来裁剪要显示的区域。
(4)从设计上去优化此问题,简单易用才是好的。


布局问题

不合理的布局也会影响UI的渲染性能,例如布局的无用嵌套,布局的选择不合理等。

1.Hierarchy Viewer

Hierarchy Viewer可以很方便可视化的查看屏幕上套嵌view结构,是查看你的View结构的实用工具。这个工具包含在DDMS中。
在Window窗口页选择要查看的组件就能看到层级关系,在快捷工具栏中点击Obtain layout times for tree rooted at selected node就可以查看某个View的耗时。

2.Lint工具检查代码

Lint是Android Studio自带的代码检查工具(Ecilpse也有),通过静态检测代码的方式查看代码中存在的问题,Android Studio从菜单栏选择Analyze→Inspect Code来启用。性能相关的重点关注performance选项下的条目,几个重要的如下:
这里写图片描述
(1)Layout has too many views:太多控件,超过80个。
(2)Layout hierarchy is too deep:层级太深,超过10层。
(3)Obsolete layout params:Layout中有无用的参数。
(4)Useless leaf layout:layout不包含子View,可以删除。
(5)Useless parent layout:View的父亲没有用,应该移除。

3.常见布局问题优化

(1)减少层级,合理使用RelativeLayout和LinearLayout。但是要注意RelativeLayout会对子View进行两次measure(LinearLayout中有weight属性时也会进行两次测量),如果布局层级不是很深要注意取舍。层级相同时使用LinearLayout,层级较深时使用RelativeLayout优化。
(2)合理使用merge标签消除层级,注意的是merge标签只能用在布局XML文件的根元素,也得为其指定一个ViewGroup。
(3)使用ViewStub来隐藏不显示的Layout,而不是设置成View.GONE。
(4)使用标签来实现布局复用。
(5)少用wrap_content,wrap_content会增加布局measure时的计算成本,已知宽高固定时,不用wrap_content。


Thanks

https://www.jianshu.com/p/9e095bacf44a

猜你喜欢

转载自blog.csdn.net/u012027644/article/details/80499832