簡介
BufferQueue是Android 中所有圖形處理操作的核心。它的作用很簡單:將生成圖形數(shù)據(jù)緩沖區(qū)的一方(生產(chǎn)方)連接到接受數(shù)據(jù)以進行顯示或進一步處理的一方(消耗方)。幾乎所有在系統(tǒng)中移動圖形數(shù)據(jù)緩沖區(qū)的內(nèi)容都依賴于BufferQueue,比如顯示、編碼等。
BufferQueue是典型的生產(chǎn)者、消費者模型,通信過程如下所示:

即圖形生產(chǎn)者先向BufferQueue申請GraphicBuffer,填充完GraphicBuffer后,將GraphicBuffer移交給BufferQueue,BufferQueue會通知圖形消費者(比如SurfaceFlinger、OMX等)有新的圖形數(shù)據(jù)可以使用,圖形消費者就可以從BufferQueue取出GraphicBuffer,使用完之后放回到BufferQueue以便循環(huán)使用。一般圖形生產(chǎn)者和消費者是在不同進程中,BufferQueue采用了binder和共享內(nèi)存機制,因此可以高效地在進程間傳遞圖形數(shù)據(jù)。
調(diào)用流程
BufferQueue調(diào)用流程如下所示:

一般是在消費者進程調(diào)用BufferQueue的createBufferQueue創(chuàng)建BufferQueueCore、BufferQueueProducer和BufferQueueConsumer對象,這三個對象與圖一對應(yīng),其中BufferQueueProducer和BufferQueueConsumer分別實現(xiàn)了IGraphicBufferProducer和IGraphicBufferConsumer binder接口,然后會在消費者進程調(diào)用consumerConnect向BufferQueueCore注冊IConsumerListener,這樣有新數(shù)據(jù)的時候就可以通過IConsumerListener通知對應(yīng)的消費者,
收到通知后,消費者通過IGraphicBufferConsumer從BufferQueueCore取出GraphicBuffer,使用完之后將GraphicBuffer放回到BufferQueueCore。
在生產(chǎn)者進程獲取到IGraphicBufferProducer接口后,可以通過connect向BufferQueueCore注冊IProducerListener,這樣在消費者將GraphicBuffer放回BufferQueueCore時可以通知生產(chǎn)者,生產(chǎn)者可以通過IGraphicBufferProducer向BufferQueueCore申請GraphicBuffer,填充完GraphicBuffer后,將GraphicBuffer提交給BufferQueueCore,然后由BufferQueueCore來通知消費者。
核心類
以顯示流程為例,生產(chǎn)者進程一般就是應(yīng)用程序進程,消費者進程就是SurfaceFlinger進程,應(yīng)用程序進程的surface對象和SurfaceFlinger進程的layer對象可以看做實際的生產(chǎn)者和消費者,主要類的關(guān)系如下所示:

應(yīng)用程序申請surface時,會在SurfaceFlinger進程創(chuàng)建一個layer對象,接著會創(chuàng)建BufferQueueCore、BufferQueueProducer和BufferQueueConsumer對象,然后創(chuàng)建SurfaceFlingerConsumer和ProxyConsumerListener對象,而在應(yīng)用程序進程這端會創(chuàng)建Surface對象和BpGraphicBufferProducer代理對象,應(yīng)用程序進程通過Surface對象中的BpGraphicBufferProducer向SurfaceFlinger進程中的BufferQueueCore對象申請和提交GraphicBuffer,SurfaceFlinger進程中的BufferQueueCore對象通過ProxyConsumerListener、SurfaceFlingerConsumer、Layer一路通知到SurfaceFlinger有新的GraphicBuffer需要合成,SurfaceFlinger收到通知,通過Layer調(diào)用SurfaceFlingerConsumer的updateTexImage,將GraphicBuffer繪制成紋理,然后再合成輸出。
[1] : https://source.android.google.cn/devices/graphics/arch-bq-gralloc