简介:把某些计算工作交给专门的硬件来做,而不是和普通的计算工作一样交给 CPU 来处理
Android中:硬件加速专指把 View 中绘制的计算工作交给 GPU 来处理
(绘制的计算工作:将绘制方法中的canvas.drawXXX变成实际像素这件事)
原理
未开启:把绘制内容写进一个Bitmap,Bitmap 的像素内容被直接用于渲染到屏幕(CPU计算把绘制操作转为像素)
开启:canvas只把绘制内容转换为GPU的操作保存下来并交给GPU来完成实际的显示工作(CPU只是把绘制工作转换成GPU的操作)
加速原因:1.GPU分担工作量并且GPU本身计算常见类型内容(简单图形)具有优势
2.绘制机制的改变,提高了界面内容改变时的刷新效率(局部改变只需重绘保存的GPU操作)
关闭硬件加速:1.application/activity:android:hardwareAccelerated="false"
2.onDraw()中:view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);(该方法实际是设置View Layer的)
LAYER_TYPE_SOFTWARE :使用软件来绘制 View Layer,绘制到一个 Bitmap,并顺便关闭硬件加速
LAYER_TYPE_HARDWARE :使用 GPU 来绘制 View Layer,绘制到一个 OpenGL texture
LAYER_TYPE_NONE:关闭 View Layer
View Layer:离屏缓冲,单独启用一块地方来绘制这个 View (可能是一块单独的 Bitmap,也可能是一块 OpenGL 的纹理,简单理解为图像)
离屏缓存更好理解点,开启后绘制的最终结果会被缓存下来,只要绘制内容没变,无论CPU绘制还是GPU绘制都不用重新计算
注:1.View Layer可加速无 invalidate() 时的刷新效率,对需要invalidate的刷新无法加速
(不适用于基于自定义属性绘制的动画,适合平移旋转等view本身没有改变的场景)
2.View Layer 绘制所消耗的实际时间是比不使用 View Layer 时要高的,所以要慎重使用
限制:受到 GPU 绘制方式的限制,Canvas 的有些方法在硬件加速开启时会失效或无法正常工作
(原生自带控件都没有用到 API 版本不兼容的绘制操作,只需检查自定义控件)
支持
网友评论