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

2024-03-17 16:50

本文主要是介绍软件绘制 硬件加速绘制 【DisplayList RenderNode】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android4.0以后,系统默认开启硬件加速来渲染视图
异同点
共同点
两者都是从SF获取一块内存,绘制都是在APP端,绘制好后都是通知SF去进行合成图层
真正的区别
真正的区别:绘制是通过CPU还是GPU完成的视图绘制。
对应区别在代码中的体现是ViewRootImpl中:

private void draw(boolean fullRedrawNeeded) {
...
if (!dirty.isEmpty() || mIsAnimating || accessibilityFocusDirty) {//是否使用硬件加速 在前面setView的时候已经创建好了mAttachInfo.mHardwareRendererif (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的渲染和渲染管道出图原理
文章转载于:北洋的文章

这篇关于软件绘制 硬件加速绘制 【DisplayList RenderNode】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/819542

相关文章

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank 正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

梳理2024年,螺丝钉们爱用的3款剪辑软件

这年头,视频到处都是,就跟天上的星星一样数不清。不管你是公司里的新面孔,还是职场上的老狐狸,学会怎么剪视频,就好比找到了赢的秘诀。不管是给上司汇报工作,展示你的产品,还是自己搞点小视频记录生活,只要是剪辑得漂亮,肯定能一下子吸引大家的目光,让人记得你。咱们今天就来侃侃现在超火的三款视频剪辑工具,尤其是PR剪辑,你肯定听说过,这货在剪辑界可是大名鼎鼎,用它剪视频,既专业又麻利。 NO1. 福昕轻松

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分