1.显示渲染--SF消息分发流程:
MessageQueue是SurfaceFlinger中的消息队列,mEventQueue是MessageQueue的一个对象,SF在初次引用时(sp强引用)会对对mEventQueue进行初始化。
* frameworks/native/services/surfaceflinger/MessageQueue.cpp
void MessageQueue::init(const sp<SurfaceFlinger>& flinger)
{
mFlinger = flinger;
mLooper = new Looper(true);
mHandler = new Handler(*this);
}
MessageQueue初始化时,创建了一个Looper和一个Handler。此外,在SurfaceFlinger初始化时,创建了一个EventThread,并传给了MessageQueue(里面塞了一个EventThread,接收ET的VSYNC和HOTPLUG事件再发送)。
void SurfaceFlinger::init() {
... ...
sp<VSyncSource> sfVsyncSrc =
new DispSyncSource(&mPrimaryDispSync, SurfaceFlinger::sfVsyncPhaseOffsetNs, true, "sf");
mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
mEventQueue.setEventThread(mSFEventThread);
MessageQueue的setEventThread函数如下:
void MessageQueue::setEventThread(const sp<EventThread>& eventThread)
{
if (mEventThread == eventThread) {
return;
}
if (mEventTube.getFd() >= 0) {
mLooper->removeFd(mEventTube.getFd());
}
mEventThread = eventThread;
mEvents = eventThread->createEventConnection();
mEvents->stealReceiveChannel(&mEventTube);
mLooper->addFd(mEventTube.getFd(), 0, Looper::E