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.mzph.cn/diannao/12579.shtml

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

相关文章

Python GUI开发- Qt Designer环境搭建

前言 Qt Designer是PyQt5 程序UI界面的实现工具,使用 Qt Designer 可以拖拽、点击完成GUI界面设计,并且设计完成的 .ui 程序可以转换成 .py 文件供 python 程序调用 环境准备 使用pip安装 pip install pyqt5-toolsQt Designer 环境搭建 在pip安装包…

Vue 常见通信

Vue 常见通信 1、父子通信 父传子 props,子传父 events($emit); 通过父链 / 子链 通信$parent / $children; $refs获取ref 可以访问组件实例方法,; 提供与注射provide / inject a t t r s …

使用Processing和PixelFlow库创建交互式流体太极动画

使用Processing和PixelFlow库创建交互式流体太极动画 引言准备工作效果展示代码结构代码解析第一部分:导入库和设置基本参数第二部分:流体类定义MyFluidDataConfig 类详解MyFluidData 类详解my_update 方法详解流体类定义完整代码 第三部分:太…

找数字-算法

解法一、数位模拟 比n大的最小数就是n1,当n1时,以下几种情况会导致n中1的个数发生变化(或者不变) 1.n的低位连续1的个数count>1,如1011,10111,1111等,加1后使得n中1的个数减少count-1个 解…

基于SVPWM的飞轮控制系统的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM的飞轮控制系统的simulink建模与仿真。SVPWM的核心思想是将逆变器输出的三相电压矢量在两相静止坐标系(αβ坐标系)中表示,通过控…

Python3 数据类型详解:掌握数据基石,编写高效程序

Python3 中的基本数据类型包括整数(int)、浮点数(float)、布尔值(bool)、字符串(str)、列表(list)、元组(tuple)、集合(se…

JAVA static注入 Util使用之Service注入

一般在Util等静态方法中调用Service或mapper,初始化后会出现空指针异常:java.lang.NullPointerException。 代码执行优先级的问题,在一个Java类中,存在着静态代码块,静态方法,构造函数,成员方法等等。不同…

golang中的类和接口

类 在 Go 语言中并没有类的概念,而是使用结构体来实现面向对象的特性。通过 type 关键字可以定义自定义类型,包括结构体类型。下面是一个简单的示例: package mainimport "fmt"// 定义一个结构体类型 type Person struct {Name s…

只对外公开必要的信息和步骤

隐藏内部结构 使对象的内部结构对外部不可见的内容的处理被称为封装化。只公开方法等使用者所需要的最低限度的接口,使用者只能通过外部接口进行访问。如此一来,使用该类的程序就无须知道其内部的具体实现。 通过封装化,不仅可以防止调用者…

Node.js安装及环境配置(超详细!保姆级!!)

目录 一、进入官网地址下载安装包 二、安装程序 三、环境配置 四、测试 五、安装淘宝镜像 一、进入官网地址下载安装包 Node.js — Download Node.js (nodejs.org) 选择对应你系统的 node.js 版本,我选择的是Windows系统,64位 点击图中选项&#…

无人机+应急通信:灾害现场应急通信车技术详解

无人机和应急通信车是灾害现场应急通信中的重要技术。无人机可以通过快速到达灾害现场,搭载高清摄像头、红外热成像仪、激光雷达等设备,对灾区进行实时监测和灾情评估,同时也可以通过搭载的通信设备,与指挥中心进行实时通信和数据…

APP逆向实现方式总览

方式一:硬核分析 梳理出参数的构造逻辑,代码还原算法 方式二:模拟执行 2.1 Frida-RPC 电脑调用已加载到手机内存中的方法,直接获取到结果 2.2 AndServer-RPC 安卓程序调用手机中的方法,最后暴露成HTTP服务供电脑…

✅什么是排他锁、共享锁、意向锁

共享锁 共享锁,又被称为读锁,是由读取操作所创建的一种锁。在此期间,其他用户可以同时读取数据,但在数据上未释放所有共享锁之前,任何事务均无法对其进行修改(即获取数据的排他锁)。 一旦事务…

202009青少年软件编程(Python)等级考试试卷(三级)

第 1 题 【单选题】 通过算式123122021120可将二进制1101 转为十进制,下列进制转换结果正确的是?( ) A :0b10转为十进制,结果是2 B :0d10转为十进制,结果是8 C :0x10转为十进制,结果是10 D :0o10转为十进制,结果是16 正确答案:A 试题解析: 第 2 题 【单选题】 语句flo…

基于Nios-II实现流水灯

文章目录 一、新建项目1、选择芯片2、Qsys设计2.1、点击Platform Designer2.2配置软核2.3其他设置 3、Quartus设计3.1添加原理图3.2添加qip文件3.3其他设置3.4驱动设置 4、Nios-II Eslipse设计参考 一、新建项目 使用的Quartus 18.0及以上版本 1、选择芯片 2、Qsys设计 2.1、点…

【AIGC调研系列】你好-GPT-4o

GPT-4o是OpenAI最新发布的一款人工智能模型,它具备处理和生成文本、音频和图像的能力。这个模型的特点是能够实时对这些不同类型的输入进行推理和响应,这使得它在多模态交互方面表现出色[1][2][3]。 GPT-4o的“o”代表“omni”,意味着它是一…

【复试分数线】综合性985历年分数线汇总(第四弹)

国家线和34所自划线 可以看作是考研上岸最最最基础的门槛。真正决定你能不能进入复试的还要看院线(复试分数线)!今天我将分析考信号的除C9、工科类985的其他7所985近三年复试分数线(不包括2024),大家可以参…

Azure IoT Hub是啥

1.概要说明 Azure IoT Hub是微软在物联网(IoT)领域提供的一款重要产品,为设备连接和管理提供了专业的解决方案。以下是关于Azure IoT Hub的详细介绍: 定义:Azure IoT Hub是一个专为连接和管理数百万台物联网设备而设计…

flutter开发实战-人脸识别相机使用

flutter开发实战-人脸识别相机使用 当需要拍摄的时候,需要检测到人脸再进行后续的操作,这里使用的是face_camera 一、引入face_camera 在工程的pubspec.yaml中引入插件 # 检测人脸face_camera: ^0.0.8iOS端需要设置相关权限 在info.plist文件中&…

如何按住ctrl滑动鼠标桌面图标大小不变

如何按住ctrl滑动鼠标桌面图标大小不变 采取以下步骤: 1、鼠标在电脑桌面空白处单击右键,然后在弹出的对话框最上面有个“查看”,点击“查看”出来的最上面有“大图标”“中等图标”“小图标”,根据自己的需要选择图标大小即可。…