surfaceflinger创建Connection对象的过程前面已经论述过,在此就不赘述了。
Surfaceflinger中接收vsync信号的入口为MessageQueue的cb_eventReceiver方法,调用流程图如下,
cb_eventReceiver方法如下,直接调用eventReceiver方法,
MessageQueue* queue = reinterpret_cast<MessageQueue *>(data);
return queue->eventReceiver(fd, events);
eventReceiver方法主要逻辑如下,
1,调用DisplayEventReceiver的getEvents方法循环读取mEventTube对象中的数据,
while ((n = DisplayEventReceiver::getEvents(&mEventTube, buffer, 8)) > 0) {
2,如果是vsync信号,就调用Handler的dispatchInvalidate处理,
if (buffer[i].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) {
mHandler->dispatchInvalidate();
break;
}
此处的Handler是MessageQueue.cpp中的一个类,其dispatchInvalida