Android 刷新一帧流程trace拆解

和你一起终身学 习,这里是程序员Android

其实一眼就喜欢的不是文案,

而是似曾相识的经历 O(∩_∩)O
经典好文推荐,通过阅读本文,您将收获以下知识点:

一、Android 显示一帧流程概览

二、生产者,消费者 BufferQueue 流转图

三、App ,SF Buffer 交互图

四、SF 跟 HWC 交互图

一、Android 显示一帧流程概览


程序员Android

原图链接:

https://upload-images.jianshu.io/upload_images/5851256-5d802da2815c12f2.png

1.1 Android 显示一帧大致分为下面 八步:

  1. App 接收到 vsync-app 信号后开始工作。
  2. App 主线程被Message唤醒,执行onVsync。
  3. App 执行 doFrame ,处理input、animation、traversal、draw等。
  4. App UIThread 跟RenderThread sync 数据。
  5. App 执行DrawFrame,从SurfaceFlinger(后续简称SF) 的 BufferQueue 中 Dequeue buffer,取出一个bufffer后,执行渲染绘制,接着将绘制好的Buffer 通过queuebuffer 放回到。BufferQueue中给 SF消费。
  6. App queuebuffer 后, SF 中对应的 app buffer 会增加 +1。
  7. Vsync-sf 到来后,SF 从BufferQueue 中 acquireBuffer一个Buffer 进行消费, 对应SF 中的 app buffer 会减 - 1 , SF 消费处理后,通过 releaseBuffer 将buffer 归还到BufferQueue 中。
  8. SF 通过 bind 跟 Hardware Composer HAL(简称HWC) 进行通信,通过一些处理后显示到手机屏幕上。

二、生产者,消费者 BufferQueue 流转图


生产者,消费者 BufferQueue 流转图

原图链接:

https://upload-images.jianshu.io/upload_images/5851256-1fd0a4018940ddd8.png

2.1. dequeue(生产者发起)

当生产者需要缓冲区时,它会通过调用 dequeueBuffer() 从 BufferQueue 请求一个可用的缓冲区,并指定缓冲区的宽度、高度、像素格式和使用标记。

2.2. queue(生产者发起)

生产者填充缓冲区并通过调用 queueBuffer() 将缓冲区返回到队列。

2.3. acquire(消费者发起)

消费者通过 acquireBuffer() 获取该缓冲区并使用该缓冲区的内容

2.4. release(消费者发起)

当消费者操作完成后,它会通过调用 releaseBuffer() 将该缓冲区返回到队列

三、App ,SF Buffer 交互图


App ,SF Buffer 交互图

原图链接:

https://upload-images.jianshu.io/upload_images/5851256-9ee4c505abf5eff3.png

3.1App ,SF Buffer 交互流程拆解

  1. App 通过bind 向SF dequeuebuffer 进行buffer申请
  2. SF 对端完成对bufferQueue 的dequeuebuffer的申请
  3. App 处理合成完后,通过binder向SF queuebuffer 申请buffer 入队。
  4. SF 对端通过queuebuffer 完成buffer 对BufferQueue的入队申请,供SF消费并显示到屏幕上

四、SF 跟 HWC 交互图

SurfaceFlinger 接受来自多个来源的数据缓冲区,对它们进行合成,然后发送到显示设备。

SF 送显图

原图链接:

https://upload-images.jianshu.io/upload_images/5851256-e2998c0cd7dd4219.png

SF 跟 HWC 交互图

原图链接:

https://upload-images.jianshu.io/upload_images/5851256-53d12f9bfef6809a.png

4.1 SF 跟 HWC 交互流程

  1. vsync-sf 周期到来,SF 开始绘制准备工作
  2. SF 通过 acquirebuffer 从BufferQueue 中取出一帧进行消费
  3. App 对应的BufferQueue 在SF acquirebuffer 后对那个的值会 -1
  4. App 对应的buffer 值为 2
  5. App 对应的buffer值 在SF acquirebuffer 后变为 1
  6. SF 跟HWC 通过binder 通信处理完后,通过rleasebuffer将buffer 归还到BufferQueue中,紧接着一帧就可以显示出来

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,比如:文章底部留言,12小时内必删,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

如果认为有点用,欢迎您来点点赞👍🏻,

❤️爱心发射, biu~收到请留言!

相关推荐
weixin_403810138 小时前
AI智能体写安卓自动化脚本教程:Cursor/Trae+CLI 实战,自然语言生成代码
android·人工智能·自动化·跨境电商·安卓自动化脚本·多账户运营
呆呆小孩10 小时前
零基础学 MySQL(上):从建库建表到增删改查,一篇搭好 SQL 基础
android·sql·mysql
catchadmin10 小时前
NativePHP v4 让 Blade 构建原生 iOS 与 Android 界面
android·ios·ai·php
FfHUCisI12 小时前
Golang 数据库连接池深度调优
android·数据库·golang
古法安卓14 小时前
Android-epoll原理详解
android·java·android studio
字节暗面16 小时前
四款 APP 加固强度测评:让 AI 拆了四个包,结果有点出乎意料
android·逆向工程·加固
网安蟹佬霸17 小时前
蓝队防御实战:SIEM与SOAR构建安全运营中心(万字详解+实战配置)
android·安全·web安全·网络安全·网安
敢敢のwings18 小时前
世界模型与FlashWorld:从“在梦中学习“到秒级3D场景生成
android·学习·3d
Dovis(誓平步青云)18 小时前
牛奶不能减成负数:冰箱库存的筛选、去重与不可变更新
android·java·开发语言
Awna19 小时前
MySQL 存储空间与索引运维实战:从空间排查到在线扩容
android·运维·mysql