我一直以为DisplayEventReceiver是跟Input一样,通过BitTube的两个socket进行跨进程的通信,也就是SF-APP之间的通信,但实际上不是的。
实际上的逻辑是,每次VSYNC事件到来从HAL的线程调之后,
01-01 00:35:01.163 2963 3017 D SurfaceFlinger: onVSyncEvent
EventThread会将这个vsync事件记录到自己的mVSyncEvent中,并释放Condition锁。
void EventThread::onVSyncEvent(nsecs_t timestamp) {
ALOGD("EventThread::onVSyncEvent");
std::lock_guard<std::mutex> lock(mMutex);
mVSyncEvent[0].header.type = DisplayEventReceiver::DISPLAY_EVENT_VSYNC;
mVSyncEvent[0].header.id = 0;
mVSyncEvent[0].header.timestamp = timestamp;
mVSyncEvent[0].vsync.count++;
mCondition.notify_all();
}
然后在EventThread一直threadLoop的waitForEvent函数中,此时如果有有效的connection连接的话就会真正拿到这个事件。前面的逻辑是判断mDisplayEventConnections列表里面是不是存在有效的Connection。
if (mCondition.wait_for(*lock, timeout) == std::cv_status::timeout) {
Android VSYNC事件传递流程
最新推荐文章于 2025-03-26 10:33:51 发布