美文网首页Android高阶Android
Android9.0 硬件加速(一)-开篇

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

作者: Stan_Z | 来源:发表于2019-04-02 21:39 被阅读72次

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

    有段时间没有跟新文章了,最近有点忙,但是博客也不能因此停更了,打起精神,立个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的绘制速度要明显优于软件绘制。

    相关文章

      网友评论

        本文标题:Android9.0 硬件加速(一)-开篇

        本文链接:https://www.haomeiwen.com/subject/xvwnbqtx.html