原创文章,转载注明出处,多谢合作。
有段时间没有跟新文章了,最近有点忙,但是博客也不能因此停更了,打起精神,立个flag,两周内把硬件加速总结完。
本篇文章先简单做个硬件加速的开篇,介绍一些概念。
一、硬件加速的概念
硬件加速:简单理解就是通过底层软件代码,将CPU不擅长的图形计算转换成GPU专用指令,由GPU完成。Android3.0开始支持硬件加速,Android4.0 默认启用硬件加速。
硬件加速google官方文档
注:
CPU : Central Processing Unit , 中央处理器,是计算机设备核心器件,用于执行程序代码。
GPU : Graphic Processing Unit , 图形处理器,主要用于处理图形运算,通常所说“显卡”的核心部件就是GPU。
CPU更擅长复杂逻辑控制,而GPU得益于大量ALU和并行结构设计,更擅长数学运算。
二、硬件加速与软件绘制的区别
Android应用层的绘制主要有两种:软件绘制与硬件绘制。
软件绘制:CPU主导绘制,更新UI会重绘与脏区域相交的区域。
硬件加速:GPU主导绘制,提高显示刷新速度、更新UI只重绘脏区域,但是内存和电量消耗会比软件绘制大。
对应的图形库也稍微介绍下:
Skia : CPU 绘制 2D 图形;
Open GL : GPU 绘制 2D / 3D 图形;
之后Android Q开始会使用 vulkan 来作为默认的图形库,有兴趣的可以提前了解下,这里不多赘述。
三、控制硬件加速
如果您的应用程序仅使用标准视图和Drawables,则全局打开它不应导致任何不利的绘图效果。但是,由于所有2D绘图操作都不支持硬件加速,因此打开它可能会影响某些自定义视图或绘图调用。问题通常表现为不可见的元素,异常或错误渲染的像素。为解决此问题,Android为您提供了在多个级别启用或禁用硬件加速的选项。
开发者可以在以下几个级别控制硬件加速:
Application 整个应用程序使用硬件加速
<application android:hardwareAccelerated = “true” … >
Activity 单独控制某个activity硬件加速的启动和禁止
<activity android:hardwareAccelerated="false" />
Window
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注意:现阶段你不能在Window级别对它禁用硬件加速。
View
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
注意:现阶段不能够在View级别进行硬件加速。
检查应用程序是否为硬件加速有两种方法:
View.isHardwareAccelerated()
如果返回true则可以说明这个View所在的窗口已经启用了硬件加速。
Canvas.isHardwareAccelerated()
如果返回true则说明这个Canvas已经启用了硬件加速。
最后直观比较下软件绘制和硬件加速绘制:
相同app的软件绘制与硬件绘制对比:
软件绘制:
软件绘制的一帧硬件加速绘制:
硬件加速绘制的一帧对比看,硬件加速绘制一帧UI的绘制速度要明显优于软件绘制。
网友评论