硬件加速可以在一下四个级别开启或关闭:
Application
Activity
Window
View
硬件加速优点
开启硬件加速后,Android框架将采用新的绘制模型。基于软件的绘制模型和基于硬件的绘制模型有和不同呢?
软件
应用程序调用invalidate()更新UI的某一部分,消息将会在整个视图层中传递,计算每个需要重绘的区域(即脏区域)。然后Android系统将会重绘所有和脏区域有交集的view
比如如果应用程序调用invalidate()重绘button,而button又位于另一个view之上,即使该view没有变化,也会进行重绘。
硬件
Android系统记录绘制命令到显示列表,而不是立即执行绘制命令。
Android系统只需记录和更新标记为脏的view
为什么不能乱用
不是所有的绘图操作都支持硬件加速
如果您的程序中只是用了标准的视图和Drawable,放心大胆的开启硬件加速吧
如果应用程序受到这些影响,您可以在受影响的部分调用
为什么效率更低
1、硬件加速所做的事不仅仅是渲染,先缓存到gpu,然后再渲染到window,如果是一个纯色背景,就没有必要使用硬加速增加额外的开销。
2、对于缓存来说,存在一个缓存失效的可能性,倘若不断的失效,性能可能比软加速差很多,什么时候失效,重绘。比如一个viewgroup有三个子view不断的移动动画,这时候对这个group硬件加速,显然不行,只能对view做硬件加速,因为他们只是位置移动,而对于group,他会不断的重绘
3、硬件加速使用的是GPU内存,显然你不想看到内存泄露这件事。
两者区别:
1、一个是渲染到Bitmap,一个是渲染到GPU framebuffer上。
2、hardware可能会有一些操作不支持。
两者相同:
都是开了一个buffer,把View画到这个buffer上面去。
硬件加速不能乱用的原因:
第一,首先,视图渲染入GPU上的一个层中,然后,GPU再渲染那个层到Window,如果View的渲染十分简单(比如一个纯色),那么在初始化的时候可能增加Hardware Layer不必要的开销。
第二,对所有缓存来讲,存在一个缓存失效的可能性。动画运行时,如果某个地方调用了View.invalidate( ),那么Layer就不得不重新渲染一遍。倘若不断地失效,你的Hardware Layer实际上要比不添加任何Layer性能更差。
如果你仅在父布局ViewGroup上设置一个Layer,实际上会不断地缓存失效,因为(作为一个整体)ViewGroup会随着子View不断地改变。然而,每个单独的View,仅仅是移动罢了。这种情况下,最好的办法就是在每一个子View上设置Hardware Layer(而不是在父布局上)。
第三,Hardware Layer使用GPU内存,很明显你不想看到内存泄露。因此,你应该只在必要的时候使用Hardware Layer,比如,动画运行期间