SurfaceFlinger MessageQueue原理
SurfaceFlinger MessageQueue 有2个作用:
- 处理SurfaceFlinger INVALIDATE、REFRESH事件
- 管理SurfaceFlinger主线程挂起和恢复
SurfaceFlinger::run() {
while (true) {
mEventQueue->waitMessage(); } } waitMessage {do {IPCThreadState::self()->flushCommands();int32_t ret = mLooper->pollOnce(-1)... } while (true)
}
BufferQueue不是一般android系统那个BufferQueue,他是SurfaceFlinger模块专用的一个数据结构,包含了一个looper,一个handler。looper中的mMessageEnvelopes这个容器才是真正存储消息的地方
SurfaceFlinger::SurfaceFlinger(mEventQueue(mFactory.createMessageQueue())void MessageQueue::init(const sp<SurfaceFlinger>& flinger) {
mFlinger = flinger;mLooper = new Looper(true);mHandler = new Handler(*this);
}
BufferQueue是在SurfaceFlinger构造函数创建的用于SurfaceFlinger和HWC之间跨进程通讯(SurfaceFlinger是生产者,HWC是消费者),其中数据是gpu合成好之后的GraphicBuffer
SurfaceFlinger生产message方式如下所示:
status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
schedule([=] {}).wait();
return NO_ERROR;
}
SurfaceFlinger 主线程其它所有任务被抛入到messagequeue 在SurfaceFlinger主线程执行,调用公共方法SurfaceFlinger::schedule(mEventQueue->postMessage(std::move(task)));
例如:app有图像请求渲染
queuebuffer-->consumer.onFrameAvailable-->SurfaceFlinger::signalLayerUpdate()->invalidate()
MessageQueue::invalidate() {
// 唤醒EventThread线程去loop是否有Vsync来了,Vsync时候才真正调用dispatchInvalidate
EventThread::requestNextVsync -> mCondition.notify_all()
}