Android图像生产消费模型

一.生产消费模型

    在Android系统中,所有图像的绘制都需要渲染到Surface上。Surface的本质是一块渲染缓存,即GraphicBuffer。当Surface渲染完成时,会提交到SurfaceFlinger中对渲染的图像进行合成。但SurfaceFlinger不直接管理Surface,而是管理Layer。Layer与Surface之间通过图像缓存的生产消费模型关联在一起。

    生产消费模型的核心类有三个:IGraphicBufferProducer、BufferQueueCore、IGraphicBufferConsumer。这三个类相互协作,管理GraphicBuffer的申请提交与获取释放。
0
    当生产者需要渲染图像时,会通过BufferQueueCore获取渲染缓存。当生产者渲染完图像时,会将带有渲染图像的缓存提交到BufferQueueCore中。当消费者需要消费图像缓存时,会从BufferQueueCore中获取带有渲染图像的缓存。当消费者消费完图像时,会将图像缓存提交到BufferQueueCore中。

1.BufferQueue

    在Android 12之前,生产消费模型由BufferQueue进行管理。
1
    BufferQueue由BufferQueueLayer进行管理,BufferQueueLayer由SurfaceFlinger进行管理。
2    通常情况下,一个App对应着一个Surface,一个Surface对应着一个BufferQueueLayer。Surface和BufferQueueLayer之间通过BufferQueue管理的生产消费模型关联。

2.BLASTBufferQueue

    在Android 12之后,生产消费模型由BLASTBufferQueue进行管理,并且将生产消费模型从SurfaceFlinger服务端移动了客户端。
3
    这种变化带来了两个好处:

1)减轻了SurfaceFlinger的压力,SurfaceFlinger不再需要管理每个Layer中的生产消费模型。

2)应用层可以通过监听每帧图像缓冲的合成及提交与合并图像缓冲事务,来实现绘制窗口与View之间的同步及多个绘制窗口之间的同步。

3.图像缓存管理

    在生产消费模型中,BufferQueueCore负责管理图像缓存。在BufferQueueCore中,所有的图像缓存都被抽象成BufferSlot。BufferQueueCore中有四种不同的容器,用来存放不同状态下的BufferSlot:

  • mFreeSlots:初始化时通过参数设置的需要使用的BufferSlot(最大为64)会被保存在这里。
  • mUnusedSlots:剩下不需要使用的BufferSlot会被保存在这里。
  • mActiveBuffers:BufferSlot在使用时需要关联GraphicBuffer,关联后会被保存在这里。
  • mFreeBuffer:BufferSlot在使用完成后会被保存在这里。

    BufferSlot在生产者和消费者的调用中转换不同的状态。生产者通过调用dequeueBuffer申请BufferSlot,并将状态从Free转换为Dequeued。如果BufferSlot是在mFreeSlots中,则会关联GraphicBuffer。之后生产者开始绘制。绘制完成后,生产者通过调用queueBuffer提交BufferSlot,并将状态从Dequeued转换为Queued。之后消费者通过acquireBuffer获取BufferSlot,并将状态从Queued转换为Acquired。之后消费者开始提交缓存去合成。合成完毕后,消费者通过调用releaseBuffer释放BufferSlot。并将状态从Acquired转换为Free。
4

二.Fence机制

    Fence是一种同步机制,与信号量类似,通过提供wait/notify实现生产消费过程的同步。与信号量相比,Fence具有三个特点:

1)Fence可以跨进程和跨设备。

2)Fence是一次性的,每次使用都需要重新申请。

3)Fence具有编号和上下文,同一个上下文的Fence编号可以比较。

    在生产消费模型中,生产者与消费者在接收到VSync信号时开始生产和消费,但由于生产速率与消费速率不同,因此当下一次VSync信号到来时,生产与消费过程不一定都能完成,这时会通过Fence机制来保障生产消费过程的同步。
5

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值