Android BufferQueue简析

简介

BufferQueue是Android 中所有图形处理操作的核心。它的作用很简单:将生成图形数据缓冲区的一方(生产方)连接到接受数据以进行显示或进一步处理的一方(消耗方)。几乎所有在系统中移动图形数据缓冲区的内容都依赖于BufferQueue,比如显示、编码等。
BufferQueue是典型的生产者、消费者模型,通信过程如下所示:

《Android BufferQueue简析》 图一

即图形生产者先向BufferQueue申请GraphicBuffer,填充完GraphicBuffer后,将GraphicBuffer移交给BufferQueue,BufferQueue会通知图形消费者(比如SurfaceFlinger、OMX等)有新的图形数据可以使用,图形消费者就可以从BufferQueue取出GraphicBuffer,使用完之后放回到BufferQueue以便循环使用。一般图形生产者和消费者是在不同进程中,BufferQueue采用了binder和共享内存机制,因此可以高效地在进程间传递图形数据。

调用流程

BufferQueue调用流程如下所示:

《Android BufferQueue简析》 图二

一般是在消费者进程调用BufferQueue的createBufferQueue创建BufferQueueCore、BufferQueueProducer和BufferQueueConsumer对象,这三个对象与图一对应,其中BufferQueueProducer和BufferQueueConsumer分别实现了IGraphicBufferProducer和IGraphicBufferConsumer binder接口,然后会在消费者进程调用consumerConnect向BufferQueueCore注册IConsumerListener,这样有新数据的时候就可以通过IConsumerListener通知对应的消费者,
收到通知后,消费者通过IGraphicBufferConsumer从BufferQueueCore取出GraphicBuffer,使用完之后将GraphicBuffer放回到BufferQueueCore。

在生产者进程获取到IGraphicBufferProducer接口后,可以通过connect向BufferQueueCore注册IProducerListener,这样在消费者将GraphicBuffer放回BufferQueueCore时可以通知生产者,生产者可以通过IGraphicBufferProducer向BufferQueueCore申请GraphicBuffer,填充完GraphicBuffer后,将GraphicBuffer提交给BufferQueueCore,然后由BufferQueueCore来通知消费者。

核心类

以显示流程为例,生产者进程一般就是应用程序进程,消费者进程就是SurfaceFlinger进程,应用程序进程的surface对象和SurfaceFlinger进程的layer对象可以看做实际的生产者和消费者,主要类的关系如下所示:

《Android BufferQueue简析》 图三

应用程序申请surface时,会在SurfaceFlinger进程创建一个layer对象,接着会创建BufferQueueCore、BufferQueueProducer和BufferQueueConsumer对象,然后创建SurfaceFlingerConsumer和ProxyConsumerListener对象,而在应用程序进程这端会创建Surface对象和BpGraphicBufferProducer代理对象,应用程序进程通过Surface对象中的BpGraphicBufferProducer向SurfaceFlinger进程中的BufferQueueCore对象申请和提交GraphicBuffer,SurfaceFlinger进程中的BufferQueueCore对象通过ProxyConsumerListener、SurfaceFlingerConsumer、Layer一路通知到SurfaceFlinger有新的GraphicBuffer需要合成,SurfaceFlinger收到通知,通过Layer调用SurfaceFlingerConsumer的updateTexImage,将GraphicBuffer绘制成纹理,然后再合成输出。

[1] : https://source.android.google.cn/devices/graphics/arch-bq-gralloc

    原文作者:Jimmy2012
    原文地址: https://www.jianshu.com/p/edd7d264be73
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞