Android 一帧绘制流程分析笔记

92a388d5f7e3094359704f3e297d81da.gif

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

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、显示一帧流程概览
二、生产者,消费者 BufferQueue 流转图
三、App ,SF Buffer 交互图
四、SF 跟 HWC 交互图

一、显示一帧流程概览

471001fc446528ec7313414ed6445f8e.png

原图链接:
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 流转图

02199fa60ed539fa5d601ef6de73430e.png

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-1fd0a4018940ddd8.png

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

  2. queue(生产者发起):
    生产者填充缓冲区并通过调用 queueBuffer() 将缓冲区返回到队列。

  3. acquire(消费者发起) :
    消费者通过 acquireBuffer() 获取该缓冲区并使用该缓冲区的内容

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

三、App ,SF Buffer 交互图

c79c9ab9a3cfc9b3fe37109dd9fb3d2a.png

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-9ee4c505abf5eff3.png

  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 接受来自多个来源的数据缓冲区,对它们进行合成,然后发送到显示设备。

d51b88d1f1995cfdebc53a0c3228bb21.png

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-e2998c0cd7dd4219.png

95201f5aaa0c5d2e8fb4a7d947f8fd96.png

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-53d12f9bfef6809a.png

  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中,紧接着一帧就可以显示出来

友情推荐:

Android 开发干货集锦

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

032bdb1049fb30df95cfe810b5934739.jpeg

点击阅读原文,为大佬点赞!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值