Android性能:SurfaceFlinger与BufferQueue(3)

Android性能:SurfaceFlinger与BufferQueue(3)

Android显示系统的组成可以概括为两大部分:绘制(DrawFrame)+合成(SurfaceFlinger + HWC)
绘制:Surface中空的 GraphicBuffer->CPU或者GPU通过Canvas->将数据Draw到Surface。
合成:几块有数据的Buffer->叠合成一张Buffer->显示。
BufferQueue:android系统中每一张显示的图片都是GraphicBuffer,通过BufferQueue在不同进程间流动。SurfaceFlinger是Android渲染核心进程,应用的渲染最终都会来到SurfaceFlinger进行处理,最终会把处理后的图像数据交给CPU或者GPU进行绘制。
VYSNC:控制系统绘制与合成的节奏,按什么样的间隔出帧,也就是帧率。
● VSYNC-app 是app控制绘制帧率,Choregrapher,响应VSYNC-app。
● VSYNC-sf 是SurfaceFlinger控制合成过程的帧率的
● VSYNC-app/sf 通常这两者之间不会同时开始,会有一些offset。

BufferTx

DrawFrame里queueBuffer以后BufferTx会增加,SF起来响应拿走Buffer合成时会减少; BufferTx内有可用Buffer,SF才会真正去合成。
SF主进程结束点附近有数字对应到waiting for presentFence
● presentFence: 结束点代表SF送来的这一帧被显示到了屏幕上,并signal前一帧的Fence。
● OverlayEngine: HWC的主要进程,Trigger display driver做显示动作。

VSYNC和Fence相辅相成,
VSYNC:表示什么时间开始做事(绘制/合成)
Fence: 表示什么时间事情做完了(屏幕显示)

BufferQueue 作为共享资源,连接 Surface 和 SurfaceFlinger。其中,Surface 是资源生产者,SurfaceFlinger 是资源消费者。
BufferQueue 有四个核心操作:
dequeueBuffer:向 BufferQueue 申请一块空闲缓冲区(主流最大缓冲区数量为 64 个,之前为 32 个,通常设置为 2 个或者 3 个,即黄油计划中的双缓冲和三缓冲机制),发起方为生产者(Surface)。之前已经申请过的缓冲区可以被复用,如果不符合要求(比如还没有申请过,缓冲区参数不匹配等)则需要重新申请新的缓冲区。
queueBuffer:向 BufferQueue 插入一块填充了有效数据的缓冲区,发起方为生产者(Surface)。
acquireBuffer:从 BufferQueue 摘取一块填充了有效数据的缓冲区用于合成或显示消费,发起方为消费者(SurfaceFlinger)。
releaseBuffer:将消费完毕的缓冲区释放,并送回 BufferQueue,发起方为消费者。(SurfaceFlinger)。
缓冲队列中的每一块缓冲区也有四个核心状态:
FREE:初始状态,或者已被消费者 release,持有者为 BufferQueue,只能用于 dequeue 操作,可被 Surface 访问。
DEQUEUED:表示该块缓冲区已被生产者 dequeue,持有者为 Surface,只能用于 queue 操作,可被 Surface 访问。
QUEUED:表示该块缓冲区已经被生产者 queue,持有者为 BufferQueue,只能用于 acquire 操作,可被 SurfaceFlinger 访问。
ACQUIRED:表示该块缓冲区已经被消费者 aquire,持有者为 SurfaceFlinger,只能用于 release 操作,可被 SurfaceFlinger 访问。
生产者(Surface)、BufferQueue、消费者(SurfaceFlinger)三者之间的通信过程和缓冲区状态迁移:

层次图:

交互结构:

HWComposer是 SurfaceFlinger 用于与 HWC HAL 进行交互的代理。

SurfaceFlinger 合成的流程:
1 HWC 触发 vsync 信号:vsync 信号将以回调的方式通知 SurfaceFlinger,SurfaceFlinger 收到 vsync 回调后开始执行下一帧的合成。
2 SurfaceFlinger 更新图层:SurfaceFlinger 遍历各个有效图层,从其对应的 BufferQueue 中获取最新的单元窗口绘制数据,以对图层进行更新。这一步的 BufferQueue 中的缓冲区来自于预分配内存。
3 HWC :SurfaceFlinger 更新并准备好所有图层后,将图层参数告知 HWC HAL,HWC HAL 决定哪些图层可以执行 Device合成。
4 SurfaceFlinger 执行 Client合成:如果有 HWC 不能处理的图层,SurfaceFlinger 统一将它们交给 OpenGL 执行合成,其合成的数据作为一个普通合成窗口也插入到其对应的 BufferQueue 中,同时 SurfaceFlinger 还充当该 BufferQueue 的消费者将普通合成窗口取出并作为一个新的合成图层与其它普通图层一起准备交与 HWC 进行 Device合成。这一步 BufferQueue 中的缓冲区来自于 framebuffer,也就是说 Client合成数据已经直接 post 到 framebuffer 中。
5 HWC 执行 Device合成:HWC 将其余的图层连同 Client合成图层一起进行 Device合成。
6 HWC 将合成的帧 post 到 framebuffer 显示:要将帧显示出来,最终还是要将其 post 到 framebuffer 的 frontbuffer 中,这样显示控制器(display controller)才能从 framebuffer 中读取帧数据进行扫描/最终显示。

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制(2)-CSDN博客文章浏览阅读643次,点赞11次,收藏15次。t 时长,20s,20秒的trace文件。CPU返回后,会直接将GraphicBuffer提交给SurfaceFlinger,告诉SurfaceFlinger进行合成,但是这个时候GPU可能并未完成之前的图像渲染,这时候就牵扯到一个同步,Android中,用的是Fence机制,SurfaceFlinger合成前会查询Fence,如果GPU渲染没有结束,则等待GPU渲染结束,GPU结束后,会通知SurfaceFlinger进行合成,SF合成后,提交显示,最终完成图像的渲染显示。就是 Buffer。https://blog.csdn.net/zhangphil/article/details/138628225

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制(2)-CSDN博客文章浏览阅读317次,点赞8次,收藏10次。t 时长,20s,20秒的trace文件。CPU返回后,会直接将GraphicBuffer提交给SurfaceFlinger,告诉SurfaceFlinger进行合成,但是这个时候GPU可能并未完成之前的图像渲染,这时候就牵扯到一个同步,Android中,用的是Fence机制,SurfaceFlinger合成前会查询Fence,如果GPU渲染没有结束,则等待GPU渲染结束,GPU结束后,会通知SurfaceFlinger进行合成,SF合成后,提交显示,最终完成图像的渲染显示。就是 Buffer。https://blog.csdn.net/zhangphil/article/details/138628225Android adb shell命令捕获systemtrace_android 抓trace-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏5次。Android ADB调试真机设备Android ADB(Andorid Debug Bridge),是Android开发中有用的测试和调试工具。使用Android ADB调试设备,直接在Windows的dos命令窗口输入命名adb即可,如图:为什么执行adb命令后是这样?Android ADB(Andorid Debug Bridge)调试真机设备_adb在线执行器_zhangphil的博客-CSDN博客。-t 时长,20s,20秒的trace文件。-o 保存文件路径。_android 抓tracehttps://blog.csdn.net/zhangphil/article/details/131249820卡顿丢帧分析adb shell命令-CSDN博客文章浏览阅读207次,点赞3次,收藏3次。Android ADB调试真机设备Android ADB(Andorid Debug Bridge),是Android开发中有用的测试和调试工具。使用Android ADB调试设备,直接在Windows的dos命令窗口输入命名adb即可,如图:为什么执行adb命令后是这样?Android ADB(Andorid Debug Bridge)调试真机设备_adb在线执行器_zhangphil的博客-CSDN博客。-t 时长,20s,20秒的trace文件。https://blog.csdn.net/zhangphil/article/details/137919380

Android GPU渲染屏幕绘制显示基础概念(1)-CSDN博客文章浏览阅读705次,点赞20次,收藏12次。CPU返回后,会直接将GraphicBuffer提交给SurfaceFlinger,告诉SurfaceFlinger进行合成,但是这个时候GPU可能并未完成之前的图像渲染,这时候就牵扯到一个同步,Android中,用的是Fence机制,SurfaceFlinger合成前会查询Fence,如果GPU渲染没有结束,则等待GPU渲染结束,GPU结束后,会通知SurfaceFlinger进行合成,SF合成后,提交显示,最终完成图像的渲染显示。而对SF来说,只要有合成任务,它就得再去申请VSYNC-sf。https://blog.csdn.net/zhangphil/article/details/138585120Android性能:Double Buffer双缓冲/Triple Buffer三缓冲丢帧Jank与无丢帧No Jank-CSDN博客文章浏览阅读860次,点赞6次,收藏13次。Android ADB调试真机设备Android ADB(Andorid Debug Bridge),是Android开发中有用的测试和调试工具。使用Android ADB调试设备,直接在Windows的dos命令窗口输入命名adb即可,如图:为什么执行adb命令后是这样?_android 抓trace。三Buffer轮转情况下,基本不会有这种情况的发生,渲染线程一般在 dequeueBuffer 时,都可以顺利拿到可用的 Buffer (如果 dequeueBuffer 本身耗时那就也会拉长时间)。https://blog.csdn.net/zhangphil/article/details/138213964

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

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

相关文章

前端之电力系统SVG图低代码

其实所有的图形都是由点&#xff0c;线&#xff0c;面组成的。点线面可以组成一个设备。下面就简单讲讲点线面是怎么画的吧 对于线&#xff0c;可以用path <g><path:d"M ${beginX},${beginY} L ${endX},${endY}":stroke-width"lineWidth":strok…

UStaticMesh几何数据相关(UE5.2)

UStaticMesh相关类图 UStaticMesh的数据构成 UStaticMesh的FStaticMeshSourceModel UStaticMesh的Mesh几何元数据来自于FStaticMeshSourceModel&#xff0c; 一级Lod就存在一个FStaticMeshSourceModel. FStaticMeshSourceModel几何数据大致包含以下几类: Vertex(点), VertexI…

【C++】认识C++(上)

目录 从C到C命名空间同名冲突命名空间的定义命名空间的使用 C的输入和输出缺省参数&#xff08;默认参数&#xff09; 从C到C C语言的出现是计算机科学和工程史上的一个重要里程碑&#xff0c;许多现代计算机语言都受C语言的影响。C语言是面向过程的&#xff0c;结构化和模块化…

Windows Docker 部署 Etcd 键值存储系统

一、简介 etcd 是一个由 CoreOS 团队发起的开源项目&#xff0c;它用 Go 语言实现&#xff0c;是一个分布式、高可用的键值存储系统。etcd 采用 Raft 算法&#xff0c;确保了数据的强一致性和高可用性&#xff0c;即使集群中有部分节点发生故障&#xff0c;也能保持服务的正常…

2024深圳杯数学建模C题参考论文24页+完整代码数据解题

一、问题研究 24页参考论文&#xff1a; 【编译器识别】2024深圳杯C题24页参考论文1-3小问完整解题代码https://www.jdmm.cc/file/2710545/ 为了回答这些问题&#xff0c;我们需要进行一系列的编译实验、分析编译结果&#xff0c;并构建判别函数。以下是对这些问题的初步分析…

杨校老师项目之基于单片机STC89C52的智能环境监测系统【嵌入式】

获取全套资料&#xff1a; 有偿获取&#xff1a;mryang511688 技术&#xff1a;C语言、单片机等 摘要&#xff1a; 此设计可分为三个主要部分。此中的温度和湿度的检测功能&#xff0c;通过操纵单总线型温湿度传感器DHT11以数字形式显示&#xff0c;实现了切确测得温湿度的功能…

乡村振兴的农业科技创新:加大农业科技投入,推广农业科技成果,提升农业科技创新水平,推动美丽乡村农业现代化

一、引言 随着全球化和信息化时代的到来&#xff0c;农业作为国民经济的基础&#xff0c;其现代化进程日益受到关注。在乡村振兴战略的大背景下&#xff0c;农业科技创新成为推动乡村经济转型升级、实现农业现代化的关键力量。本文旨在探讨如何通过加大农业科技投入、推广农业…

[图解]EA从数据库逆向得到分析类模型-01

1 00:00:00,840 --> 00:00:02,400 今天&#xff0c;我们来说一下 2 00:00:02,670 --> 00:00:06,320 一个最近几天不止一个同学问的问题 3 00:00:06,490 --> 00:00:11,410 就是说&#xff0c;怎样把一个数据库 4 00:00:13,740 --> 00:00:16,720 转到分析类图 5 …

项目管理-案例重点知识(整合管理)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 一、整合管理 案例重点 重点内容&#xff1a; &#xff08;1&#xff09;项目章程内容和作用 &#xff08;2&#xff09;项目管理计划…

前端 performance api使用 —— mark、measure计算vue3页面echarts渲染时间

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐Performance api计算持续时间&#x1f496; mark用法&#x1f496; measure用法 ⭐计算echarts渲染的持续时间⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端 performance api使用 —— mark、measure计…

vs2019 c++中模板 enable_if_t 的使用

&#xff08;1&#xff09; 该模板的定义如下&#xff1a; template <bool _Test, class _Ty void> struct enable_if {}; // no member "type" when !_Testtemplate <class _Ty> struct enable_if<true, _Ty> { // type is _Ty for _Testusing …

C++——动态规划

公共子序列问题 ~待补充 最长公共子序列 对于两个字符串A和B&#xff0c;A的前i位和B的前j位的最大公共子序列必然是所求解的一部分&#xff0c;设dp[i][j]为串A前i位和B串前j位的最长公共子序列的长度&#xff0c;则所求答案为dp[n][m]&#xff0c;其中n&#xff0c;m分别为…