在Android中,BufferQueue是Surface实现本地窗口的关键,驻留在SurfaceFlinger进程中进行服务,下面从BufferQueue的结构开始分析,
class BufferQueue : public BnGraphicBufferProducer,
public BnGraphicBufferConsumer,
private IBinder::DeathRecipient {
可见BufferQueue拥有producer和consumer两端。再看看createBufferQueue的实现,这里创建了一个BufferQueueCore,然后以这个为参数依次创建了BufferQueueProducer和BufferQueueConsumer。
void BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
sp<IGraphicBufferConsumer>* outConsumer,
const sp<IGraphicBufferAlloc>& allocator) {
sp<BufferQueueCore> core(new BufferQueueCore(allocator));
sp<IGraphicBufferProducer> producer(new BufferQueueProducer(core));
sp<IGraphicBufferConsumer> consumer(new BufferQueueConsumer(core));
*outProducer = producer;
*outConsumer = consumer;
}
这里的producer和consumer是要设置的,而allocator是从外面传进来的,如果传NULL,则在BufferQueueCore中会初始化,如下:
BufferQueueCore::BufferQueueCore(const sp<IGraphicBufferAlloc>& allocator) {
if (allocator == NULL) {
sp<ISurfaceComposer> composer(ComposerService::getComposerService());
mAllocator = composer->createGraphicBufferAlloc();
}
}
这里的ISurfaceComposer实现在SurfaceFlinger中,再看createGraphicBufferAlloc的实现:
sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc() {
sp<GraphicBufferAlloc> gba(new GraphicBufferAlloc());
return gba;
}
这个GraphicBufferAlloc构造函数是个空壳,看看createGraphicBuffer的实现,
sp<GraphicBuffer> GraphicBufferAlloc::createGraphicBuffer(uint32_t width,
uint32_t height, PixelFormat format, uint32_t usage, status_t* error) {
sp<GraphicBuffer> graphicBuffer(
new GraphicBuffer(width, height, format, usage));
status_t err = graphicBuffer->initCheck();
return graphicBuffer;
}
GraphicBuffer继承自ANativeWindowBuffer,这个定义在window.h中,值得注意的是里面有个buffer_handle_t句柄,用于共享内存映射的文件句柄就保存在里面了。GraphicBuffer实现了Flattenable接口从而可以跨进程传输。GraphicBuffer构造函数中调用initSize开辟内存,
status_t GraphicBuffer::initSize(uint32_t inWidth, uint32_t inH