1.什么是硬件加速,原理?
Canvas 绘制的工作方式是:把要绘制的内容写进一个 Bitmap,然后在之后的渲染过程中,这个 Bitmap 的像素内容被直接用于渲染到屏幕。这种绘制方式的主要计算工作在于把绘制操作转换为像素的过程(例如由一句 Canvas.drawCircle() 来获得一个具体的圆的像素信息),这个过程的计算是由 CPU 来完成的。
硬件加速开启式,Canvas 的工作方式改变了:它只是把绘制的内容转换为 GPU 的操作保存了下来,然后就把它交给 GPU,最终由 GPU 来完成实际的显示工作。
2.为什么快?
-本来由 CPU 自己来做的事,分摊给了 GPU 一部分,自然可以提高效率;
-相对于 CPU 来说,GPU 自身的设计本来就对于很多常见类型内容的计算(例如简单的圆形、简单的方形)具有优势;
-由于绘制流程的不同,硬件加速在界面内容发生重绘的时候绘制流程可以得到优化,避免了一些重复操作,从而大幅提升绘制效率。
当一个view调用invalidate之后,它一直追溯到父view全部都要invalidate,因为他们是一个整体,但是硬件加速中绘制的内容会被转换成 GPU 的操作保存下来,由于所有的绘制内容都没有变成最终的像素,所以它们之间是相互独立的,那么在界面内容发生改变的时候,只要把发生了改变的 View 调用 invalidate() 方法以更新它所对应的 GPU 操作就好,至于它的父 View 和兄弟 View,只需要保持原样。
3.有啥限制?
受到 GPU 绘制方式的限制,Canvas 的有些方法在硬件加速开启式会失效或无法正常工作。
4.View Layer 离屏缓冲(Off-screen Buffer)
-如果你调用的绘制操作不支持硬件加速,你需要手动关闭硬件加速来绘制界面
view.setLayerType(LAYER_TYPE_SOFTWARE, null);
-离屏缓冲就是会单独启用一块地方来绘制这个 View ,而不是使用软件绘制的 Bitmap 或者通过硬件加速的 GPU
-View 在初次绘制时以及每次 invalidate() 后重绘时,需要进行两次的绘制工作(一次绘制到 Layer,一次从 Layer 绘制到显示屏),所以其实它的每次绘制的效率是被降低了的
-适用于无需调用 invalidate() 的属性做动画的时候,因为调用了invalidate以后缓存就失效了。因此View Layer 可以加速无 invalidate() 时的刷新效率,但对于需要调用 invalidate() 的刷新无法加速。
-动画开始前启动layer,结束后关闭layer
网友评论