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

绘制步骤:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏州的先生

【州末小课堂】使用PyQtGraph绘制上证指数精美走势图

1871
来自专栏极客生活

数据分析Excel技能之求和

鼠标选中 B8单元格 -> 开始 -> 编辑 -> 自动求和,excel会自动感应要求和的行和列。

712
来自专栏申龙斌的程序人生

SeismicPro地震剖面显示程序

SeismicPro是我用C#写的一款地震剖面显示软件,可从标准SEGY地震数据体中抽取纵测线和横测线的二维剖面,并以波形、变面积和变密度等多种方式进行专业化显...

3199
来自专栏非著名程序员

Android自定义下拉刷新动画--仿百度外卖下拉刷新

? 好久没写博客了,小编之前一段时间一直在找工作,从天津来到了我们的大帝都,感觉还不错。好了废话不多说了,开始我们今天的主题吧。现如今的APP各式各样,同样也...

19410
来自专栏林德熙的博客

win10 uwp 毛玻璃 Compositor 创建毛玻璃win2D最简单方法

毛玻璃在UWP很简单,不会和WPF那样伤性能。 本文告诉大家,如何在 UWP 使用 win2d 做毛玻璃。

821
来自专栏极客生活

tableau绘制好看的折线图

1481
来自专栏向治洪

FLAnimatedImage -ios gif图片加载框架介绍

简介 FLAnimatedImage 是 Flipboard 团队开发的在它们 App 中渲染 GIF 图片使用的库。 后来 Flipboard 将 FLAni...

3187
来自专栏james大数据架构

TableLayout(表格布局)

表格布局模型以行列的形式管理子控件,每一行为一个TableRow的对象,当然也可以是一个View的对象。TableRow可以添加子控件,每添加一个为一列。 Ta...

2128
来自专栏禹都一只猫博客

python实现生成验证码的逻辑

1657
来自专栏青玉伏案

视错觉升级版:多个视错觉效果实现

之前发表过一篇关于视错觉的文章:《视错觉:从一个看似简单的自定义控件说起》,虽然不是用iOS开发中的Mask来实现的,但是原理和Mask原理是一样的,相当于手动...

20510

扫码关注云+社区

领取腾讯云代金券