09-3-2015
Android为我们提供了70多个标准View,但是自定义View能让我们的应用看起来与众不同。我们来讨论下如何提高我们的自定义View性能。
必要时才调用invalidate()
如果你的界面没有改变,不要调用invalidate()
来重绘界面。invalidate()会调用onDraw()
重绘当前View。既然不需要更新界面这样的操作就是浪费资源。
不要重复绘制
在ps中画图,我们总是将不同的元素画在不同的层中,背景层,人物层等等。人物层一般都覆盖在背景层上,背景层就会有一部分被覆盖而不可见。在ps中可以这样画图,但是程序中绘制被覆盖不可见的部分显然是多余的。
onDraw()中进行界面绘制时我们可以计算哪些是被覆盖的,哪些是可见的,我们只绘制可见的部分。避免资源的浪费。我们调用Canvas.clipRect()
来限制绘制区域,这个方法告诉GPU只在我们指定的区域绘图来避免重复绘制。
如果想查看界面哪些元素被重复绘制了,可以在开发者选项中打开Debug GPU overdraw来查看哪些地方被重复绘制了。
但是计算绘制区域也是耗时的,尤其是界面上的元素很多的时候,会导致CPU在计算绘制区域时耗费大量的时间。怎么解决这些问题呢?
- 只计算绘制屏幕内或View内的元素。看不见的元素我们没有必要去计算并绘制它。
- 不要使用不支持Hardware Acceleration的draw方法。这些方法会使用CPU来绘制界面,速度相比GPU绘制是非常非常慢的。
- 不要在onDraw()方法分配内存,因为onDraw()方法会因View界面的刷新频繁调用,导致分配大量空间导致内存抖动而平凡触发gc,影响绘制性能。