Android硬件加速原理和简介

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

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的绘制流程:


Android硬件加速原理和简介_第1张图片

绘制步骤:

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到屏幕上。

####欢迎关注公共号

![](https://upload-images.jianshu.io/upload_images/3258163-a5d26661ebcd43b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

你可能感兴趣的:(Android硬件加速原理和简介)