美文网首页
手机显示一帧的流程是如何实现的?

手机显示一帧的流程是如何实现的?

作者: 程序员Android1 | 来源:发表于2022-03-28 11:10 被阅读0次

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

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

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

一、显示一帧流程概览

程序员Android

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 流转图
  1. dequeue(生产者发起) :
    当生产者需要缓冲区时,它会通过调用 dequeueBuffer() 从 BufferQueue 请求一个可用的缓冲区,并指定缓冲区的宽度、高度、像素格式和使用标记。
  2. queue(生产者发起):
    生产者填充缓冲区并通过调用 queueBuffer() 将缓冲区返回到队列。
  3. acquire(消费者发起) :
    消费者通过 acquireBuffer() 获取该缓冲区并使用该缓冲区的内容
  4. release(消费者发起) :
    当消费者操作完成后,它会通过调用 releaseBuffer() 将该缓冲区返回到队列

三、App ,SF Buffer 交互图

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

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

相关文章

网友评论

      本文标题:手机显示一帧的流程是如何实现的?

      本文链接:https://www.haomeiwen.com/subject/hfdyjrtx.html