Android9.0 硬件加速(一)-开篇

原创文章,转载注明出处,多谢合作。

有段时间没有跟新文章了,最近有点忙,但是博客也不能因此停更了,打起精神,立个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的软件绘制与硬件绘制对比:

软件绘制:

《Android9.0 硬件加速(一)-开篇》 软件绘制的一帧

硬件加速绘制:

《Android9.0 硬件加速(一)-开篇》 硬件加速绘制的一帧

对比看,硬件加速绘制一帧UI的绘制速度要明显优于软件绘制。

    原文作者:ZHTo0
    原文地址: https://www.jianshu.com/p/81b7c741da71
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞