Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >软件绘制 & 硬件加速绘制 【DisplayList & RenderNode】

软件绘制 & 硬件加速绘制 【DisplayList & RenderNode】

作者头像
小柔
发布于 2022-10-09 04:39:45
发布于 2022-10-09 04:39:45
1.5K00
代码可运行
举报
文章被收录于专栏:小柔博客园小柔博客园
运行总次数:0
代码可运行

theme: condensed-night-purple

前几篇文章讲解DisplayList和RenderNode的时候一笔带过,之后查找资料梳理了一篇文章

Android4.0以后,系统默认开启硬件加速来渲染视图

异同点

共同点

两者都是从SF获取一块内存,绘制都是在APP端,绘制好后都是通知SF去进行合成图层

真正的区别

真正的区别:绘制是通过CPU还是GPU完成的视图绘制

对应区别在代码中的体现是ViewRootImpl中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void draw(boolean fullRedrawNeeded) {
...
if (!dirty.isEmpty() || mIsAnimating || accessibilityFocusDirty) {
    //是否使用硬件加速 在前面setView的时候已经创建好了mAttachInfo.mHardwareRenderer
    if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
            dirty.setEmpty();
            mBlockResizeBuffer = false;
              //硬件加速绘制  使用HardwareRenderer进行绘制
            mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this);
     } else {
             //软件绘制
            if (!drawSoftware(surface, mAttachInfo, xOffset, yOffset, scalingRequired, dirty)) {
                return;
            }

如果开启了硬件加速则调用mHardwareRenderer.draw绘制;

没有开启则只是调用drawSoftware方法

软件绘制:

drawSoftware:利用Surface的lockCanvas向SF申请一块匿名共享内存,并获取一个普通的SkiaCanvas之后方便使用Skia库图形绘制,onDraw中对这个Canvas的操作就是对那块匿名共享内存的操作,使用之前的Skia图形库进行渲染接着SF之后去这块内存中拿到图层数据进行合成。

大致线路:

  • 获取匿名共享内存 canvas = mSurface.lockCanvas(dirty);
  • 对共享内存进行操作,之后通过Ski mView.draw(canvas);
  • 通知SurfaceFlinger进行合成图层Layer surface.unlockCanvasAndPost(canvas);

软件绘制的Skia图形库渲染是CPU工作完成;8.0之后,Skia间接调用OpenGl,OpenGL间接操作GPU可降低CPU压力

硬件加速绘制:

  • 构建阶段:确定需要绘制的脏区域及如何绘制(绘制指令如何保存)
  • 绘制阶段,单独渲染线程,取出保存的绘制指令转换为OpenGl指令
  • 通过swapBuffer让GPU绘制
  • 向SF发起合成的操作

构建阶段

大致流程:

  • 递归遍历所有视图获取视图绘制操作,每个绘制的操作都是一个DrawOP

比如drawText,DrawLine会被抽象成drawTextOp,DrawLineOp

  • 而View是一个RenderNode节点存储着当前View和子View的DrawOp,递归所有视图获取所有RenderNode的DrawOp,也叫DisplayList;通知RenderThread渲染

具体流程:

  • 在View的构造方法中会创建RenderNode,硬件加速中用来标识这个View
  • RenderNode进行调用canvas的操作时,会申请一个DisplayListCanvas并把具体的操作缓存到里面,也叫这个View的DrawOp树

如果是ViewGroup则递归调用子View来缓存子View的DrawOp树

  • 接着将View缓存中的DrawOp树同步到RenderNode中,递归所有View执行这个操作,那么就可以知道当前根视图树的所有绘制操作也叫DisplayList
  • 向RenderThread发送一个执行DrawFrameTask的任务进行渲染(RenderThread是一个单例线程)

绘制阶段:

构建完所有的DrawOp后,交给RenderThrea去处理,区别来了:软件绘制是在主线程,硬件加速是在单独的RenderThread中去完成绘制的

摘一个网上的图:

大致流程

  • DrawOp树合并
  • 绘制特殊Layer:调用GPU进行绘制,GPU向共享内存写内容
  • 将填充好的rawBuffer提交给SF合成

获取共享内存

DrawOp树最后是缓存在了DisplayList中,不像软件绘制是直接将绘制数据同步到匿名共享内存中。

获取时机

performTraversals中提前获取共享内存,不像软件绘制那样等到performDraw再lockCanvas获取。

多个Surface的情况渲染线程先渲染哪个呢?

通过EGL Api获取一个EGLSurface封装原Surface的绘图数据,并设定为当前渲染窗口绑定到RenderThread中,RenderThread就会渲染绑定的Surface。

后续操作

  • 进行DrawOp的合并

这里感觉像是和离屏渲染那个差不多,合并绘制纹理阴影之类的,因为画家算法是从远到近绘制的,绘制完之后如果之后的图层会影响之前的图层是无法进行操作的,所以礼品渲染将这块需要稍后可能会处理的图层单独放到一个离屏缓冲区中之后再添加。

  • 特殊Layer的绘制 ;

Layer就是Surface,比如SurfaceView和TextureView

  • 使用OPENGL绘制后通知SurfaceFliger进行Layer图层的合成操作

OpenGl利用GPU操作渲染数据,并将数据同步给SF

绘制流程

参考文章

深度好文:理解Android硬件加速原理

理解Android硬件加速原理的小白文

android硬件加速

GPU渲染简介

GPU和CPU的渲染和渲染管道出图原理

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
软件绘制 & 硬件加速绘制 【DisplayList & RenderNode】
两者都是从SF获取一块内存,绘制都是在APP端,绘制好后都是通知SF去进行合成图层
北洋
2023/09/18
7140
理解Android硬件加速原理的小白文
硬件加速,直观上说就是依赖GPU实现图形绘制加速,软硬件加速的区别主要是图形的绘制究竟是GPU来处理还是CPU,如果是GPU,就认为是硬件加速绘制,反之,软件绘制。在Android中也是如此,不过相对于普通的软件绘制,硬件加速还做了其他方面优化,不仅仅限定在绘制方面,绘制之前,在如何构建绘制区域上,硬件加速也做出了很大优化,因此硬件加速特性可以从下面两部分来分析:
看书的小蜗牛
2018/06/29
2K0
理解Android硬件加速原理的小白文
从零开始仿写一个抖音App——Android绘制机制以及Surface家族源码全解析
本文首发于微信公众号——世界上有意思的事,搬运转载请注明出处,否则将追究版权责任。微信号:a1018998632,交流qq群:859640274
何时夕
2019/03/04
3.2K0
从零开始仿写一个抖音App——Android绘制机制以及Surface家族源码全解析
硬件渲染源码分析流程详解
硬件渲染中采用AttachInfo的mThreadRenderer.draw方法传入view,attachinfo和ViewRootImpl开始硬件渲染。
小柔
2022/10/09
1.3K0
Android硬件加速(二)-RenderThread与OpenGL GPU渲染
Android4.0之后,系统默认开启硬件加速来渲染视图,之前,理解Android硬件加速的小白文简单的讲述了硬件加速的简单模型,不过主要针对前半阶段,并没怎么说是如何使用OpenGL、GPU处理数据的,OpenGL主要处理的任务有Surface的composition及图形图像的渲染,本篇文章简单说一下后半部分的模型,这部分对于理解View渲染也有不少帮助,也能更好的帮助理解GPU渲染玄学曲线。
看书的小蜗牛
2018/08/16
10.7K0
Android硬件加速(二)-RenderThread与OpenGL GPU渲染
硬件加速:RenderThread处理DrawOp树
接收SF上抛的Vsync信号,通过监听DisplayEventReceiver的BitTube来回调编舞者的doFrame方法
小柔
2022/10/09
6900
硬件加速:RenderThread处理DrawOp树
Android硬件加速介绍与实现
概述 在手机客户端尤其是Android应用的开发过程中,我们经常会接触到“硬件加速”这个词。由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解很少,也不清楚了解底层原理的意义,因此常会有一些误解,如硬件加速是不是通过特殊算法实现页面渲染加速,或是通过硬件提高CPU/GPU运算速率实现渲染加速。 本文尝试从底层硬件原理,一直到上层代码实现,对硬件加速技术进行简单介绍,其中上层实现基于Android 6.0。 硬件加速对App开发的意义 对于App开发者,简单了解硬件加速原理及上层
xiangzhihong
2018/01/26
1.6K0
Android硬件加速原理和简介
原理:使用PNG图片(BitmaoDrable)解码PNG图片生成Bitmap,传到底层,有GPU渲染图片解码,消耗CPU运算资源,Bitmap占内存大,绘制慢。
Demo_Yang
2018/10/15
1.6K0
Vsync信号和View绘制流程的关系
vsync可以由底层HardWare提供经由Display发送,当底层Hardware不能提供时也会发送vsync信号到Display。vsync屏蔽了底层Hal,使得没有Vsync的硬件也可以使用。
北洋
2022/05/06
4280
硬件加速绘制基础知识
OPENGL 是统一不同厂商GPU绘制的接口,通过GPU的计算得到一张图片(内存中的一块Buffer保存着信息)
小柔
2022/10/09
6640
hwui介绍与分析
hwui全称**HardwareAcceleratedRenderingEngineforUI,**hwui是一个基于GPU加速的2D图形引擎。HWUI的目标是提供高效、稳定、高质量的2D图形渲染能力,为Android系统的UI体验提供技术支持。
用户1907613
2023/09/17
2.5K0
hwui介绍与分析
【Android UI】Canvas 画布 ⑥ ( Canvas 绘图源码分析 | ViewRootImpl#draw 方法源码 | ViewRootImpl#drawSoftware 方法源码 )
Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ;
韩曙亮
2023/03/30
6150
[030]王小二图解Android-UI绘制篇【文字版】
本文只是视频王小二图解Android【007】UI绘制篇的提纲和整理,建议配合视频学习
王小二
2020/06/08
1.2K0
[030]王小二图解Android-UI绘制篇【文字版】
软件绘制源码流程分析
lock方法中 首先声明NativeWindowBuffer对象,然后调用dequeBuffe获取到ANativeWindwoBuffer对象接着请求SF真正创建GraphBuffer对象并返回NativeWindowBuffer
小柔
2022/10/09
5110
View的绘制-draw流程详解
根据 measure 测量出的宽高,layout 布局的位置,渲染整个 View 树,将界面呈现出来。
用户5546570
2019/06/06
1.4K0
View的绘制-draw流程详解
使用 GPU 渲染模式分析工具进行分析
其实就是处理输入事件开始到结束的时间,如果竖条中此颜色高度过高代表输入事件应放到其他线程去做
小柔
2022/10/09
1.4K0
使用 GPU 渲染模式分析工具进行分析
Android 绘制原理浅析【干货】
对于Android开发,在面试的时候,经常会被问到,说一说View的绘制流程?我也经常问面试者,View的绘制流程.
Rouse
2019/08/06
1.5K1
SurfaceView 与 TextureView 详解
Surface 就是“表面”的意思,可以简单理解为内存中的一段绘图缓冲区。在SDK的文档中,对Surface的描述是这样的:“Handle onto a raw buffer that is being managed by the screen compositor”,翻译成中文就是“由屏幕显示内容合成器(screen compositor)所管理的原生缓冲器的句柄”, 这句话包括下面两个意思:
字节流动
2021/01/12
14.2K0
Android 图形架构之一 ——概述
本系列的文章,可以让你明白,一个View最终是如何显示到屏幕上的,从应用层到硬件抽象层。对分析app的卡顿,掉帧等 有很大帮助。
音视频开发进阶
2022/10/31
2.3K0
Android窗口管理分析(4):Android View绘制内存的分配、传递、使用
前文Android匿名共享内存(Ashmem)原理分析了匿名共享内存,它最主要的作用就是View视图绘制,Android视图是按照一帧一帧显示到屏幕的,而每一帧都会占用一定的存储空间,通过Ashmem机制APP与SurfaceFlinger共享绘图数据,提高图形处理性能,本文就看Android是怎么利用Ashmem分配及绘制的:
看书的小蜗牛
2018/06/29
2.5K0
推荐阅读
相关推荐
软件绘制 & 硬件加速绘制 【DisplayList & RenderNode】
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验