Android性能:SurfaceFlinger与BufferQueue(3)

2024-05-15 08:28

本文主要是介绍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

这篇关于Android性能:SurfaceFlinger与BufferQueue(3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超