-
createEventConnection()
方法返回的是一个IDisplayEventConnection
对象mEvents
-
接着通过
IDisplayEventConnection
对象的stealReceiveChannel()
方法 -
该方法主要是设置
mEventTube
对象的mReceiveFd
,mEventTube
的类型是BitTube
-
BitTube
对象中包含一对Fd
:mReceiveFd
和mSendFd
,初始化时会通过socketpair()
创建全双工通信 -
最后通过
Looper
类的addFd()
方法将mReceiveFd
添加到epoll
监听列表中,并且传入了MessageQueue::cb_eventReceiver
作为事件的回调方法 -
回调方法如下:
int MessageQueue::cb_eventReceiver(int fd, int events, void* data) {
MessageQueue* queue = reinterpret_cast<MessageQueue*>(data);
return queue->eventReceiver(fd, events);
}
int MessageQueue::eventReceiver(int /fd/, int /events/) {
ssize_t n;
DisplayEventReceiver::Event buffer[8];
while ((n = DisplayEventReceiver::getEvents(&mEventTube, buffer, 8)) > 0) {
for (int i = 0; i < n; i++) {
if (buffer[i].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) {
mHandler->dispatchInvalidate();
break;
}
}
}
return 1;
}
- 方法最后会调用
mHandler->dispatchInvalidate();
方法,这就会涉及到Handler
的处理逻辑
我们看下Handler
中的处理逻辑:
void MessageQueue::Handler::handleMessage(const Message& message) {
switch (message.what) {
case INVALIDATE:
android_atomic_and(~eventMaskInvalidate, &mEventMask);
mQueue.mFlinger->onMessageReceived(message.what);
break;
case REFRESH:
android_atomic_and(~eventMaskRefresh, &mEventMask);
mQueue.mFlinger->onMessageReceived(message.what);
break;
}
}
调用了SurfaceFlinger
的onMessageReceived()
方法,这里才是真正处理消息的地方,后面细讲这个方法哈
我们先看下EventThread
类
消息和事件分发-EventThread
EventThread
的继承关系如下:
class EventThread : public android::EventThread, private VSyncSource::Callback {
}
需要注意的是VSyncSource::Callback
类,它提供了一个onVSyncEvent()
的回调方法
EventThread
的构造方法如下(精简版):
EventThread::EventThread(…){
…
// 创建线程并开始执行,核心业务通过 threadMain() 方法来完成
mThread = std::thread(&EventThread::threadMain, this);
// 设置一些线程的名称和优先级
pthread_setname_np(mThread.native_handle(), threadName);
…
// 设置调度策略为 SP_FOREGROUND
set_sched_policy(tid, SP_FOREGROUND);
}
构造方法中启动了一个线程,这个线程的执行逻辑在threadMain()
方法中:
void EventThread::threadMain() NO_THREAD_SAFETY_ANALYSIS {
std::unique_lockstd::mutex lock(mMutex);
// mKeepRunning 只会在析构函数中置为 false
while (mKeepRunning) {
DisplayEventReceiver::Event event;
Vector<spEventThread::Connection > signalConnections;
// 通过 waitForEventLocked() 循环等待事件
// 方法中会通过 mCondition 对象的 wait() 方法进行等待
signalConnections = waitForEventLocked(&lock, &event);
const size_t count = signalConnections.size();
for (size_t i = 0; i < count; i++) {
const sp& conn(signalConnections[i]);
// 通过 postEvent() 将事件通知到到 MessageQueue
status_t err = conn->postEvent(event);
…
}
}
}
threadMain()
方法中的重点是:
waitForEventLocked()
方法会循环等待消息(也就是VSYNC
信号),并获取到注册的Connection
对象列表- 当接收到信号后,通过
Connection
对象的postEvent()
将数据发送到MessageQueue
- 此时
MessageQueue
中的Looper
会检测到数据输入,然后通知回调MessageQueue
的cb_eventReceiver()
方法
信号分发过程
前面讲过VSYNC
信号由HWC
产生,为了方便接收,HWComposer
提供了一个HW2::ComposerCallback
用于监听消息
class ComposerCallback {
public:
virtual void onHotplugReceived(…) = 0;
virtual void onRefreshReceived(…) = 0;
virtual void onVsyncReceived(…) = 0;
virtual ~ComposerCallback() = default;
};
- 从前面类关系图中可以发现,
SurfaceFlinger
继承该类,我们重点关注onVsyncReceived()
方法
SurfaceFlinger::onVsyncReceived()
方法如下:
void SurfaceFlinger::onVsyncReceived(…) {
…
bool needsHwVsync = false;
{ // Scope for the lock
Mutex::Autolock _l(mHWVsyncLock);
if (type == DisplayDevice::DISPLAY_PRIMARY && mPrimaryHWVsyncEnabled) {
// 通过 addResyncSample 来进一步分发信号
needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
}
}
…
}
onVsyncReceived()
方法调用mPrimaryDispSync
对象的addResyncSample()
方法来进一步分发VSYNC
信号
mPrimaryDispSync
对象的类型是DispSync
,这个类比较简单,核心是它的成员变量mThread
,类型是DispSyncThread
-
DispSync::DispSync(const char* name)
- mName(name), mRefreshSkipCount(0), mThread(new DispSyncThread(name)) {}
void DispSync::init(bool hasSyncFramework, int64_t dispSyncPresentTimeOffset) {
…
mThread->run(“DispSync”, PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE);
…
}
addResyncSample()
方法中最重要的