SurfaceFlinger处理vsync信号
Posted Achillisjack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SurfaceFlinger处理vsync信号相关的知识,希望对你有一定的参考价值。
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中的一个类,其dispatchInvalidate方法如下,
if ((android_atomic_or(eventMaskInvalidate, &mEventMask) & eventMaskInvalidate) == 0)
mQueue.mLooper->sendMessage(this, Message(MessageQueue::INVALIDATE));
调用主线程的Looper调用sendMessage方法发送INVALIDATE消息,切换到主线程中执行。Handler Looper机制再次不论述了,只需要知道会执行handleMessage方法, Handler的handleMessage方法对INVALIDATE消息处理如下,
case INVALIDATE:
android_atomic_and(~eventMaskInvalidate, &mEventMask);
mQueue.mFlinger->onMessageReceived(message.what);
break;
此处的mFlinger是SurfaceFlinger对象, SurfaceFlinger的onMessageReceived方法对INVALIDATE消息处理如下,
switch (what)
case MessageQueue::INVALIDATE:
bool refreshNeeded = handleMessageTransaction();
refreshNeeded |= handleMessageInvalidate();
refreshNeeded |= mRepaintEverything;
if (refreshNeeded)
•••
signalRefresh();
break;
signalRefresh方法后面会详细论述。
以上是关于SurfaceFlinger处理vsync信号的主要内容,如果未能解决你的问题,请参考以下文章