簡(jiǎn)介
BufferQueue是Android 中所有圖形處理操作的核心饭庞。它的作用很簡(jiǎn)單:將生成圖形數(shù)據(jù)緩沖區(qū)的一方(生產(chǎn)方)連接到接受數(shù)據(jù)以進(jìn)行顯示或進(jìn)一步處理的一方(消耗方)戒悠。幾乎所有在系統(tǒng)中移動(dòng)圖形數(shù)據(jù)緩沖區(qū)的內(nèi)容都依賴于BufferQueue,比如顯示舟山、編碼等绸狐。
BufferQueue是典型的生產(chǎn)者、消費(fèi)者模型累盗,通信過(guò)程如下所示:
即圖形生產(chǎn)者先向BufferQueue申請(qǐng)GraphicBuffer寒矿,填充完GraphicBuffer后,將GraphicBuffer移交給BufferQueue若债,BufferQueue會(huì)通知圖形消費(fèi)者(比如SurfaceFlinger符相、OMX等)有新的圖形數(shù)據(jù)可以使用,圖形消費(fèi)者就可以從BufferQueue取出GraphicBuffer蠢琳,使用完之后放回到BufferQueue以便循環(huán)使用啊终。一般圖形生產(chǎn)者和消費(fèi)者是在不同進(jìn)程中,BufferQueue采用了binder和共享內(nèi)存機(jī)制傲须,因此可以高效地在進(jìn)程間傳遞圖形數(shù)據(jù)蓝牲。
調(diào)用流程
BufferQueue調(diào)用流程如下所示:
一般是在消費(fèi)者進(jìn)程調(diào)用BufferQueue的createBufferQueue創(chuàng)建BufferQueueCore、BufferQueueProducer和BufferQueueConsumer對(duì)象泰讽,這三個(gè)對(duì)象與圖一對(duì)應(yīng)例衍,其中BufferQueueProducer和BufferQueueConsumer分別實(shí)現(xiàn)了IGraphicBufferProducer和IGraphicBufferConsumer binder接口,然后會(huì)在消費(fèi)者進(jìn)程調(diào)用consumerConnect向BufferQueueCore注冊(cè)IConsumerListener已卸,這樣有新數(shù)據(jù)的時(shí)候就可以通過(guò)IConsumerListener通知對(duì)應(yīng)的消費(fèi)者佛玄,
收到通知后,消費(fèi)者通過(guò)IGraphicBufferConsumer從BufferQueueCore取出GraphicBuffer咬最,使用完之后將GraphicBuffer放回到BufferQueueCore翎嫡。
在生產(chǎn)者進(jìn)程獲取到IGraphicBufferProducer接口后,可以通過(guò)connect向BufferQueueCore注冊(cè)IProducerListener永乌,這樣在消費(fèi)者將GraphicBuffer放回BufferQueueCore時(shí)可以通知生產(chǎn)者惑申,生產(chǎn)者可以通過(guò)IGraphicBufferProducer向BufferQueueCore申請(qǐng)GraphicBuffer,填充完GraphicBuffer后翅雏,將GraphicBuffer提交給BufferQueueCore圈驼,然后由BufferQueueCore來(lái)通知消費(fèi)者。
核心類
以顯示流程為例望几,生產(chǎn)者進(jìn)程一般就是應(yīng)用程序進(jìn)程绩脆,消費(fèi)者進(jìn)程就是SurfaceFlinger進(jìn)程,應(yīng)用程序進(jìn)程的surface對(duì)象和SurfaceFlinger進(jìn)程的layer對(duì)象可以看做實(shí)際的生產(chǎn)者和消費(fèi)者,主要類的關(guān)系如下所示:
應(yīng)用程序申請(qǐng)surface時(shí)靴迫,會(huì)在SurfaceFlinger進(jìn)程創(chuàng)建一個(gè)layer對(duì)象惕味,接著會(huì)創(chuàng)建BufferQueueCore、BufferQueueProducer和BufferQueueConsumer對(duì)象玉锌,然后創(chuàng)建SurfaceFlingerConsumer和ProxyConsumerListener對(duì)象名挥,而在應(yīng)用程序進(jìn)程這端會(huì)創(chuàng)建Surface對(duì)象和BpGraphicBufferProducer代理對(duì)象,應(yīng)用程序進(jìn)程通過(guò)Surface對(duì)象中的BpGraphicBufferProducer向SurfaceFlinger進(jìn)程中的BufferQueueCore對(duì)象申請(qǐng)和提交GraphicBuffer主守,SurfaceFlinger進(jìn)程中的BufferQueueCore對(duì)象通過(guò)ProxyConsumerListener禀倔、SurfaceFlingerConsumer、Layer一路通知到SurfaceFlinger有新的GraphicBuffer需要合成参淫,SurfaceFlinger收到通知救湖,通過(guò)Layer調(diào)用SurfaceFlingerConsumer的updateTexImage,將GraphicBuffer繪制成紋理涎才,然后再合成輸出鞋既。
[1] : https://source.android.google.cn/devices/graphics/arch-bq-gralloc