android 自定义view和性能缺陷
我们从性能的角度考虑,我们在制作试图时,容易犯3中类型的错误,
首先,我可能会浪费时间绘制,那些还没改变的事物,
第二,我可能会浪费时间和带宽绘制永远不会显示的像素,因为它们被其他物体遮盖了,
第三,我可能会浪费太长时间运行绘制函数代码,
先来说绘制还没改变的事物,记住,所有的绘制开始都要调用view.invalidate code
定制view
第一条规则就是永远不要在不必要是调用作废,如果view没有任何改变,那就不必要重新绘制,
每一个像素都在2个方面付出成本,首先,当位图在内存读取的时候,第二写入帧缓冲器的时候,怎么才能避免这些浪费?
我可以通过设置剪取矩形来实现,剪取矩形是屏幕山受绘制指令的区域,剪取矩形外部的像素不动,他们不会造成任何成本,我实现这一功能的方法是用Canvas.clipRect,当你调用这个方法每一个随后的绘制指令输出,都被GPU限定在这一矩形区内,这会一直持续到下一次调用剪取矩形,现在,我们在剪取矩形看到的性能提升,基本针对的GPU不同,会有差异,在地段GPU内提升量惊人,但是如果你针对的是较高端的GPU,你可能完全察觉不到剪裁矩形的效果,
减少CPU在绘制函数上的成本,在这里几个帮助小提示,
1不要绘制任何不需要的东西,一个剪取矩形将会阻止GPU绘制屏幕外的像素,但是并不能减少GPU绘制命令的成本,有些调用确实要使用很多CPU,所以要调用Canvas.quickReject来定义当前不在屏幕上的元素,如果Canvas.qu绘制该元素ickReject返回true就不绘制该元素,而且quickReject对部分不可见的绘制元素,不会返回为true,他只是针对完全不可见的元素.
2不要使用没有硬件加速的绘制方法,https://developer.android.com/guide/topics/graphics/hardware-accel.html 他显示了所有的硬件加速,以及不在每个版本的android 的所有东西,现在,硬件家速意味着发生在GPU上,如果一个方法没有硬件加速那意味着它需要使用cpu来绘制,然后他必须将结果发送之cpu来与试图其余部分混合,相比于硬件加速,这是超级超级慢的,所以如果你想要的方式是未加速的,你可能要考虑其他方式来绘制试图了,最后,不要在绘制函数内进行配置,不要在绘制函数调用的任何代码进行配置.配置有2大代价.第一,配置并启动一个对象时,会有即可代价.之,会有垃圾收集代价,其中任意一个都会有可能导致丢帧,但是记住当你的试图动画时,绘制函数每秒会调用60次,与其他大部分代码不同绘制代码必须在ui主线程运行,所以绘制函数绑定不佳性能会导致你的应用闪避.你最多有16毫秒来绘制屏幕,实际上,一旦你把应用其他部分的开销和潜在GC暂停考虑在内,你可能已经使用一般8毫秒每一毫秒都很珍贵