发现一个比较好的介绍graphic帖子, 后面会跟着帖子来梳理下graphic相关知识点
http://blog.csdn.net/u014409795/article/details/51276468
目前创新互联已为千余家的企业提供了网站建设、域名、网页空间、绵阳服务器托管、企业网站设计、昔阳网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
BufferQueue
class BufferQueue {
class ProxyConsumerListener : public BnConsumerListener;
static void createBufferQueue(sp
sp
const sp
private:
BufferQueue(); // Create through createBufferQueue
}
//看起来只有consumer一个角色?
void BufferQueue::createBufferQueue(sp
sp
const sp
sp
sp
sp
BufferQueue核心是BufferQueueCore,
看BufferQueueCore里面是管理什么的
class BufferQueueCore : public virtual RefBase {
friend class BufferQueueProducer;
friend class BufferQueueConsumer;
typedef Vector
private:
// mAllocator is the connection to SurfaceFlinger that is used to allocate
// new GraphicBuffer objects.
sp
// mSlots is an array of buffer slots that must be mirrored on the producer
// side. This allows buffer ownership to be transferred between the producer
// and consumer without sending a GraphicBuffer over Binder. The entire
// array is initialized to NULL at construction time, and buffers are
// allocated for a slot when requestBuffer is called with that slot's index.
BufferQueueDefs::SlotsType mSlots; //
BufferSlot()
: mEglDisplay(EGL_NO_DISPLAY),
mBufferState(BufferSlot::FREE), //state
mRequestBufferCalled(false),
mFrameNumber(0),
mEglFence(EGL_NO_SYNC_KHR),
mAcquireCalled(false),
mNeedsCleanupOnRelease(false),
mAttachedByConsumer(false) {
}
// mGraphicBuffer points to the buffer allocated for this slot or is NULL
// if no buffer has been allocated.
sp
enum BufferState { // state 表示buffer state
FREE = 0, //FREE indicates that the buffer is available to be dequeued by the producer.
// 允许produce获取该buffer,填充数据,状态变为dequeue free 时表示该buffer还被bufferqueue 所有
DEQUEUED = 1,// DEQUEUED indicates that the buffer has been dequeued by the producer, but has not yet been queued or canceled. The slot is "owned" by the producer. 处于待填充数据状态,被producer所有
QUEUED = 2,//QUEUED indicates that the buffer has been filled by the producer and queued for use by the consumer; producer填充完数据,准备提供给consumer消费,被bufferqueue所有
ACQUIRED = 3//ACQUIRED indicates that the buffer has been acquired by the consumer.
buffer被consumer获取到,消费完后转为free
在bufferqueuecore中bufferItem又是什么
class BufferItem : public Flattenable
// mGraphicBuffer points to the buffer allocated for this slot, or is NULL
// if the buffer in this slot has been acquired in the past (see
// BufferSlot.mAcquireCalled).
sp
union {
// mSlot is the slot index of this buffer (default INVALID_BUFFER_SLOT).
int mSlot; // slot数组中索引
// mBuf is the former name for mSlot
int mBuf; // 旧名字
};
BufferSlot 与 BufferItem 都指向GraphicBuffer,然后又 通过mSlot下标关联起来,至于两者使用场景再看