1.BufferQueue
应用程序负责生产画面,SurfaceFlinger负责消费画面,这是一个典型的生产者消费者模型,它们之间用buffer作为媒介传递,BufferQueue就是用来管理这些buffer,解决状态同步问题。
在BufferQueue中使用BufferSlot(槽)这个数据结构来表示buffer:
struct BufferSlot {
sp<GraphicBuffer> mGraphicBuffer;
BufferState mBufferState;
}
mGraphicBuffer表示对应的图形缓冲,mBufferState记录图形缓冲的使用状态。其中分为4种状态:
FREE: 该状态表示buffer处于空闲状态,可以被应用程序申请绘制。
DEQUEUED: 此状态表示应用程序已经通过dequeueBuffer申请到了图形缓冲,buffer的控制已经交给应用程序,此时应用程序可以往buffer绘制图形数据。
QUEUED: 此状态表示应用已经通过queueBuffer把图形缓冲提交到BufferQueue中,buffer的控制权归属BufferQueue,等待SurfaceFlinger去消费。
ACQUIRED: 此状态表示SurfaceFlinger已经通过acquireBuffer申请到了buffer的消费权,并把它交给HWC去做合成处理。
等图形消费者完成了图形合成之后,又会把buffer的状态置为FREE,又可以再次循环利用。状态迁移图如下:
2.buffer的申请
应用程序在绘制自己的界面前,都需要先去申请一块绘制的buffer(画布),在应用侧使用Surface表示,而在SurfaceFlinger则是用BufferLayer表示。BufferLayer包含了BufferQueue,以及对应的producer(生产者)和consumer(消费者);而应用程序中的Surface中就会包含producer的client端。
应用端在执行到performTraversals()方法的时候,在执行performMeasure之前,会调用relayoutWindow()这个方法,在这里应用程序通过WMS作为媒介,和SurfaceFlinger关联:
frameworks/base/core/java/android/view/ViewRootImpl.java
performTraversals() {
relayoutResult = relayoutWindow(params, viewVisibility, insetsPending);
}
private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
boolean insetsPending) throws RemoteException {
relayoutResult = mWindowSession.relayout(mWindow, params,requestedWidth, requestedHeight,