Android 图形系统-图解和初步探究

 Android 图形系统-图解和初步探究_猎羽的博客-CSDN博客https://blog.csdn.net/feather_wch/article/details/131486729

Android图形系统

2023-7-1

问题:如何将一帧画面显示到屏幕上?

绘制流程

Activity代码

Window的结构

绘制流程

Activity启动后,不会立即绘制,而是在下一个VSYNC到来时,触发绘制performTraversals

ViewRoot是什么?

图像绘制到屏幕完整流程

VSYNC信号

Buffer

显示屏上的内容,是从硬件帧缓冲区读取的,大致读取过程为:从Buffer的起始地址开始,从上往下,从左往右扫描整个Buffer,将内容映射到显示屏上

屏幕上的内容需要需要不断的更新,如果在同一个Buffer进行读取和写入(合成)操作,将会导致屏幕显示多帧内容。所以硬件层除了提供一个Buffer用于屏幕显示,还提供了一个Buffer用于后台的图形合成,也就是我们常说的双缓冲:

上图中包含两个缓冲区:

前缓冲区:用来显示内容到屏幕的帧缓冲区

后缓冲区:用于后台合成下一帧图形的帧缓冲区

正常渲染过程

画面撕裂

VSYNC意义

Janky Frame

1、缓存区backBuffer用于CPU/GPU图形处理 

2、缓存区TripleBuffer用于CPU/GPU图形处理 

3、缓存区frameBuffer用于显示器显示

VSYNC信号是如何产生的?

收到vsync events的汇集到了两个地方:

1. MessageQueue::vsyncCallback ==> VSYNC-sf

2. EventThread::onVSyncEvent ==> VSYNC-app & VSYNC-appSf

Surface

Surface的创建

Surface建立关系

获取画布Canvas(软解)

帧的绘制(硬解)

ThreadedRenderer 管理所有的硬件渲染对象,是ViewRootImpl进行硬件渲染的入口对象 RenderNode 和View一一对应,硬件渲染打开时,放入渲染逻辑,内部是DisplayList RenderNode会构成View树 DisplayList View通过draw函数绘制的指令,以DisplayList的形式记录下来 内部节点是DisplayListData RecordingCanvas 绘图指令的记录员 将View通过draw函数绘制的指令以DisplayList的形式记录下来 CanvasContext 渲染上下文,内部持有Pipeline PipeLine 渲染管道 如OpenGLPipeLine,SkiaOpenGLPipeLine,VulkanPipeLine DrawFrameTask 整个ThreadedRender中真正开始执行渲染的对象

SurfaceFlinger

CPU/GPU执⾏⻆⾊划分关系:

第⼀步:CPU:Measure,Layout,纹理和多边形⽣成,发送纹理和多边形到GPU

第⼆步:GPU:将CPU⽣成的纹理和多边形进⾏栅格化以及合成

驱动SurfaceFlinger合成

该环节分为两个部分:

1、请求Vsync信号

准备更新显示画面或其它UI的信息变化时,首先调用MessageQueue::invalidate方法,其中会去请求一次vsync callback;

2、等待VSYNC

VSYNC机制会默默的等到时机到来时,回调MessageQueue::vsyncCallback;然后消息队列的处理机制就会dispatchInvalidate;最后调用到SurfaceFlinger::onMessageInvalidate去具体做事。

onMessageInvalidate

-->handleMessageInvalidate

-->handlePageFlip 将需要更新的Layer放入到集合中

-->signalRefresh向消息队列发送一次消息,消息到达时会去触发onMessageRefresh

onMessageRefresh

-->handleMessageRefresh

-->present(送显) 1.prepareFrame 2.finishFrame 3.postFramebuffer

-->postComposition-->releaseBuffer

参考文章:

Android 图形图像 - 随笔分类 - 二的次方 - 博客园 (cnblogs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/2864.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习(24)——YOLO系列(3)

深度学习(24)——YOLO系列(3) 文章目录 深度学习(24)——YOLO系列(3)1. BOF(bag of freebies)2. Mosaic data augmentation3. 数据增强4. self-adversarial-training(SAT…

Mysql的SQL性能分析【借助EXPLAIN分析】

性能分析 要说sql有问题,需要拿出证据,因此需要性能分析 Mysql查询优化器(Mysql Query Optimizer) Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息&#xf…

Spring的存储与获取Bean

Spring的存储与获取Bean 🔎Spring—存储Bean配置扫描路径利用类注解进行存储添加注解存储Bean关于Id为什么需要五个类注解类注解之间的关系 利用方法注解进行存储关于Id 🔎Spring—获取Bean属性注入Set注入构造方法注入总结(Spring的注入方式? 它们之间…

An unexpected connection driver error occured

安装下载好rabbitmq,我在springboot整合mq,启动的时候报错了 An unexpected connection driver error occured 后来又报 Failed to check/redeclare auto-delete queue(s). 综合就是连接问题,端口有问题 我试过添加账户,提高权限&…

【架构】领域驱动设计(DDD)的几种典型架构介绍

文章目录 前言一、专业术语二、架构演变三、限界上下文四、领域驱动设计的四重边界五、整洁分层架构六、六边形架构七、洋葱架构总结 前言 我们生活中都听说了DDD,也了解了DDD,那么怎么将一个新项目从头开始按照DDD的过程进行划分与架构设计呢&#xff…

解决页面等比缩放问题

近些年可视化数据大屏技术早已成熟,在市场上相关技术也是五花八门;通常情况是自行开发,要不找技术比较成熟大厂定制,或者使用较成熟的低代码平台实现。 技术门槛比较低,不过在数据大屏项目实施过程中会发现&#xff0c…

深入理解深度学习——BERT派生模型:BART(Bidirectional and Auto-Regressive Transformers)

分类目录:《深入理解深度学习》总目录 UniLM和XLNet都尝试在一定程度上融合BERT的双向编码思想,以及GPT的单向编码思想,同时兼具自编码的语义理解能力和自回归的文本生成能力。由脸书公司提出的BART(Bidirectional and Auto-Regre…

CDH 之 Hive 中文乱码平定通用法则

一、乱象 1.1 中文注释乱码 hive> DESCRIBE test; OK # col_name data_type comment id string ??ID ?? pcs string ????? …

uniapp中uni-popup的用法——实例讲解

uni-pop弹出层组件,在应用中弹出一个消息提示窗口、提示框等,可以设置弹出层的位置,是中间、底部、还是顶部。 如下图效果所示:白色区域则为弹出的pop层。 一、 创建一个自定义组件: 1.项目中安装下载uni-pop插件。 2.把pop内容…

C# wpf 附加属性实现任意控件拖动调整大小

摘自这里 https://blog.csdn.net/u013113678/article/details/121719278 调试效果如下 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using Syst…

CISSP证书考试难度大吗?本文教你如何轻松拿下CISSP

主题:CISSP含金量、CISSP考试经验、CISSP备考、CISSP考试大纲 CISSP含金量高 CISSP注册信息系统安全师认证是信息安全领域被全球广泛认可的IT安全认证,一直以来被誉为业界的“金牌标准”。CISSP认证不仅是对个人信息安全专业知识的客观评估&#xff0c…

OpenCV 笔记_5

文章目录 笔记_5特征点匹配DMatch 存放匹配结果DescriptorMatcher::match 特征点描述子(一对一)匹配DescriptorMatcher::knnMatch 特征点描述子(一对多)匹配DescriptorMatcher::radiusMatch 特征点描述子(一对多&#…