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~收到请留言!

相关推荐
恋猫de小郭1 分钟前
2026 Android I/O ,全新 AI 手机、 Android PC 和车载驾驶
android·前端·flutter
赏金术士13 小时前
Kotlin ViewModel
android·kotlin
vistaup14 小时前
kotlin 二维码实现高斯模糊
android·kotlin
愈努力俞幸运15 小时前
function calling与mcp
android·数据库·redis
阿巴斯甜15 小时前
LeakCanary
android
阿巴斯甜16 小时前
compose
android
阿巴斯甜16 小时前
Glide
android
-SOLO-16 小时前
使用Perfetto debug trace查看超时slice
android
阿巴斯甜16 小时前
Retrofit
android
阿巴斯甜16 小时前
OkHttp
android