Android BufferQueue简析

作者: Jimmy2012 | 来源:发表于2017-10-28 23:11 被阅读544次

    简介

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

    图一

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

    调用流程

    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对象可以看做实际的生产者和消费者,主要类的关系如下所示:

    图三

    应用程序申请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

    相关文章

      网友评论

      • 布吉刀:应用程序进程的surface对象和SurfaceFlinger进程的layer对象可以看做实际的生产者和消费者

      本文标题:Android BufferQueue简析

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