Android硬件加速原理和简介

作者: Demo_Yang | 来源:发表于2017-03-09 15:41 被阅读132次

    例:实现一个圆角矩形通常有两个方案:

    1.使用PNG图片

    原理:使用PNG图片(BitmaoDrable)解码PNG图片生成Bitmap,传到底层,有GPU渲染图片解码,消耗CPU运算资源,Bitmap占内存大,绘制慢。

    2.使用代码(XML或者Java)实现

    绘制使用XMl或者Java代码实现(ShapeDrawable)直接将shape信息传到底层,由GPU渲染消耗CPU资源少,占内存少,绘制快。

    3.CPU和GPU结构对比

    CPU:中央处理器,是计算机设备核心器件,用于执行程序代码

    GPU:图形处理器,主要用于处理图形运算,通常所说的“显卡”的核心部件就是GPU

    4.硬件加速原理:就是通过底层软件代码,将CPU不擅长的图形运算转换成GPU专用指令,由GPU完成


    Android中的硬件加速

    大多数界面都是利用常规的View来构建的。

    DisplayList

    DisplayList是一个基本绘制元素,包含元素原始的属性(位置、尺寸、角度、透明度等)对应的Canvas的draw xxx()方法。

    信息的传递流程:

    Canvas(Java API)——》OpenGL(C/C++)——》驱动程序——》GPU

    在Android4.1及以上版本,DisplayList支持属性,如果View的属性发生变化(比如Scala,Apla,Tranlate)只需把属性更新给GPU,不需要生成新的DisplayList。

    RenderNode

    一个RenderNode包含若干个DisPlayList通常一个RenderNode对应一个View,包含View自身及其子View的所有DisPlayList。

    Android的绘制流程:

    绘制步骤:

    1.从ViewRootImpl.perform Traversals到phoneWindow DecraView.drawchild 是每次遍历,VIew树的固定流程。首先根据标志位判断是否需要重新布局并执行布局。然后进行Canvas的创建等操作开始绘制

    ①如果硬件加速不支持或者被关闭,则使用软件绘制,生成的Canvas即Canvas.class的对象

    ②如果支持硬件加速,则生成的是DisplayList Canvas.class 对象

    ③两者的isHardwarve Accelerated()的方法返回的值分别是false,true,View根据这个值判断硬件是否加速

    2.VIew中的draw (cavas,parent,drawingTime)——draw——onDraw——dispatchDraw——drawchild这条递归路径(简称Draw路径)调用了Canvas.draw xxx()方法,在软件渲染时用于实际绘制,在硬件加速时,用于构建Displaylist。

    3.View中的updateDisplayListIfDirty——dispatchGet——playList——recreatechildDisplayList这条递归路基(简称DisplayList路径)仅在硬件加速时会经过用于在遍历VIew树绘制的过程中更新DisplayList属性,并快速跳过不需要重建DisplayList的View。

    4.在硬件加速情况下,draw流程执行结束后DisplayList的构建完成,然后通过ThreadedRender.nSyAndDrawFrame()利用GPU绘制DisplayList到屏幕上。

    相关文章

      网友评论

        本文标题:Android硬件加速原理和简介

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