VSync 3

7 阅读5分钟

VSyncDispatchTimerQueue::registerCallback 调用流程分析

调用链路总览

registerCallback 调用链 (从上到下):

1. VSyncCallbackRegistration 构造函数
   ↓
2. VSyncDispatchTimerQueue::registerCallback()

核心调用点: VSyncCallbackRegistration 的构造函数中直接调用 mDispatch->registerCallback()


完整调用流程图

┌─────────────────────────────────────────────────────────────────────────────┐
│  调用方 1: EventThread 构造函数                                              │
│                                                                             │
│  EventThread::EventThread(...)                                              │
│       ↓                                                                     │
│  初始化列表:mVsyncRegistration(...)                                        │
│       ↓                                                                     │
│  VSyncCallbackRegistration::VSyncCallbackRegistration(dispatch, callback)   │
│       ↓ (构造函数体内)                                                      │
│  mDispatch->registerCallback(callback, callbackName)  ← 调用点              │
│       ↓                                                                     │
│  VSyncDispatchTimerQueue::registerCallback()                                │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│  调用方 2: VsyncSchedule::PredictedVsyncTracer 构造函数                     │
│                                                                             │
│  VsyncSchedule::VsyncSchedule(...)                                          │
│       ↓                                                                     │
│  初始化列表:mTracer(...)                                                   │
│       ↓                                                                     │
│  PredictedVsyncTracer::PredictedVsyncTracer(dispatch)                       │
│       ↓                                                                     │
│  初始化列表:mRegistration(dispatch, makeVsyncCallback(), __func__)         │
│       ↓ (构造函数体内)                                                      │
│  mDispatch->registerCallback(callback, callbackName)  ← 调用点              │
│       ↓                                                                     │
│  VSyncDispatchTimerQueue::registerCallback()                                │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│  调用方 3: EventThread::onNewVsyncScheduleInternal()                        │
│                                                                             │
│  EventThread::onNewVsyncScheduleInternal(schedule)                          │
│       ↓                                                                     │
│  std::exchange(mVsyncRegistration,                                          │
│                VSyncCallbackRegistration(mVsyncSchedule->getDispatch(),     │
│                                          createDispatchCallback(),          │
│                                          mThreadName))                      │
│       ↓ (VSyncCallbackRegistration 构造函数)                                 │
│  mDispatch->registerCallback(callback, callbackName)  ← 调用点              │
│       ↓                                                                     │
│  VSyncDispatchTimerQueue::registerCallback()                                │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│  调用方 4: MessageQueue::onNewVsyncScheduleLocked()                         │
│                                                                             │
│  MessageQueue::onNewVsyncScheduleLocked(dispatch)                           │
│       ↓                                                                     │
│  mVsync.registration = std::make_unique<VSyncCallbackRegistration>(         │
│      dispatch, createCallback(), "MessageQueue")                            │
│       ↓ (VSyncCallbackRegistration 构造函数)                                 │
│  mDispatch->registerCallback(callback, callbackName)  ← 调用点              │
│       ↓                                                                     │
│  VSyncDispatchTimerQueue::registerCallback()                                │
└─────────────────────────────────────────────────────────────────────────────┘

详细调用分析

调用点 1:EventThread 构造函数

文件: frameworks/native/services/surfaceflinger/Scheduler/EventThread.cpp:241-254

EventThread::EventThread(const char* name, 
                         std::shared_ptr<scheduler::VsyncSchedule> vsyncSchedule,
                         android::frametimeline::TokenManager* tokenManager,
                         ThrottleVsyncCallback throttleVsyncCallback,
                         GetVsyncPeriodFunction getVsyncPeriodFunction,
                         std::chrono::nanoseconds workDuration,
                         std::chrono::nanoseconds readyDuration)
      : mThreadName(name),
        mVsyncTracer(base::StringPrintf("VSYNC-%s", name), 0),
        mWorkDuration(base::StringPrintf("VsyncWorkDuration-%s", name), workDuration),
        mReadyDuration(readyDuration),
        mVsyncSchedule(std::move(vsyncSchedule)),
        
        // ← 关键:在初始化列表中创建 VSyncCallbackRegistration
        mVsyncRegistration(mVsyncSchedule->getDispatch(), createDispatchCallback(), name),
        
        mTokenManager(tokenManager),
        mThrottleVsyncCallback(std::move(throttleVsyncCallback)),
        mGetVsyncPeriodFunction(std::move(getVsyncPeriodFunction)) {
    // ...
}

调用链:

EventThread::EventThread()
  → mVsyncRegistration 初始化 (VSyncCallbackRegistration 类型)
  → VSyncCallbackRegistration::VSyncCallbackRegistration(dispatch, callback, name)
  → mDispatch->registerCallback(std::move(callback), std::move(callbackName))
  → VSyncDispatchTimerQueue::registerCallback()

调用点 2:VsyncSchedule::PredictedVsyncTracer 构造函数

文件: frameworks/native/services/surfaceflinger/Scheduler/VsyncSchedule.cpp:35-53

class VsyncSchedule::PredictedVsyncTracer {
    // Invoked from the thread of the VsyncDispatch owned by this VsyncSchedule.
    constexpr auto makeVsyncCallback() {
        return [this](nsecs_t, nsecs_t, nsecs_t) {
            mParity = !mParity;
            schedule();
        };
    }

public:
    // ← 关键:在初始化列表中创建 VSyncCallbackRegistration
    explicit PredictedVsyncTracer(std::shared_ptr<VsyncDispatch> dispatch)
          : mRegistration(std::move(dispatch), makeVsyncCallback(), __func__) {
        schedule();
    }

private:
    void schedule() { mRegistration.schedule({0, 0, 0}); }

    TracedOrdinal<bool> mParity = {"VSYNC-predicted", 0};
    VSyncCallbackRegistration mRegistration;  // ← 成员变量
};

调用链:

VsyncSchedule::VsyncSchedule()
  → mTracer 初始化 (PredictedVsyncTracer 类型,仅当 kTracePredictedVsync 启用)
  → PredictedVsyncTracer::PredictedVsyncTracer(dispatch)
  → mRegistration 初始化 (VSyncCallbackRegistration 类型)
  → VSyncCallbackRegistration::VSyncCallbackRegistration(dispatch, callback, __func__)
  → mDispatch->registerCallback(std::move(callback), std::move(callbackName))
  → VSyncDispatchTimerQueue::registerCallback()

调用点 3:EventThread::onNewVsyncScheduleInternal

文件: frameworks/native/services/surfaceflinger/Scheduler/EventThread.cpp:728-748

scheduler::VSyncCallbackRegistration EventThread::onNewVsyncScheduleInternal(
        std::shared_ptr<scheduler::VsyncSchedule> schedule) {
    std::lock_guard<std::mutex> lock(mMutex);
    
    // 取消旧的注册
    const bool reschedule = mVsyncRegistration.cancel() == scheduler::CancelResult::Cancelled;
    
    // 更新 VsyncSchedule
    mVsyncSchedule = std::move(schedule);
    
    // ← 关键:创建新的 VSyncCallbackRegistration 替换旧的
    auto oldRegistration =
            std::exchange(mVsyncRegistration,
                          scheduler::VSyncCallbackRegistration(
                                  mVsyncSchedule->getDispatch(),  // ← 新的 dispatch
                                  createDispatchCallback(),        // ← 新的 callback
                                  mThreadName));                   // ← callback 名称
    
    // 如果需要,重新调度
    if (reschedule) {
        mVsyncRegistration.schedule({.workDuration = mWorkDuration.get().count(),
                                     .readyDuration = mReadyDuration.count(),
                                     .earliestVsync = mLastVsyncCallbackTime.ns()});
    }
    return oldRegistration;
}

调用链:

EventThread::onNewVsyncScheduleInternal(schedule)
  → std::exchange(mVsyncRegistration, VSyncCallbackRegistration(...))
  → VSyncCallbackRegistration::VSyncCallbackRegistration(dispatch, callback, name)
  → mDispatch->registerCallback(std::move(callback), std::move(callbackName))
  → VSyncDispatchTimerQueue::registerCallback()

触发时机:

  • 当 Scheduler 切换 VSYNC 配置时调用
  • 例如:刷新率切换、显示模式变化

调用栈:

Scheduler::applyNewVsyncSchedule(vsyncSchedule)
  → Scheduler::onNewVsyncSchedule(vsyncSchedule->getDispatch())
  → MessageQueue::onNewVsyncSchedule(dispatch)
  
  同时遍历所有 EventThread:
  → EventThread::onNewVsyncSchedule(vsyncSchedule)
  → EventThread::onNewVsyncScheduleInternal(schedule)
  → VSyncCallbackRegistration 构造函数
  → registerCallback()

调用点 4:MessageQueue::onNewVsyncScheduleLocked

文件: frameworks/native/services/surfaceflinger/Scheduler/MessageQueue.cpp:111-130

std::unique_ptr<scheduler::VSyncCallbackRegistration> 
MessageQueue::onNewVsyncScheduleLocked(std::shared_ptr<scheduler::VSyncDispatch> dispatch) {
    const bool reschedule = mVsync.registration &&
            mVsync.registration->cancel() == scheduler::CancelResult::Cancelled;

    // ← 关键:创建新的 VSyncCallbackRegistration
    mVsync.registration = std::make_unique<scheduler::VSyncCallbackRegistration>(
            dispatch, createCallback(), "MessageQueue");

    if (reschedule) {
        mVsync.registration->schedule({.workDuration = mVsync.workDuration,
                                       .readyDuration = mVsync.readyDuration,
                                       .earliestVsync = mVsync.earliestVsync});
    }
    return reschedule ? std::make_unique<scheduler::VSyncCallbackRegistration>() : nullptr;
}

调用链:

MessageQueue::onNewVsyncScheduleLocked(dispatch)
  → std::make_unique<VSyncCallbackRegistration>(dispatch, callback, "MessageQueue")
  → VSyncCallbackRegistration::VSyncCallbackRegistration(dispatch, callback, name)
  → mDispatch->registerCallback(std::move(callback), std::move(callbackName))
  → VSyncDispatchTimerQueue::registerCallback()

触发时机:

  • Scheduler 初始化时
  • VSYNC 配置更新时

调用栈:

Scheduler::initVsync()
  → MessageQueue::initVsync()
  → MessageQueue::onNewVsyncSchedule(dispatch)
  → MessageQueue::onNewVsyncScheduleLocked(dispatch)
  → VSyncCallbackRegistration 构造函数
  → registerCallback()

VSyncCallbackRegistration 类实现

文件: frameworks/native/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp:445-488

// 构造函数 - 这里调用 registerCallback
VSyncCallbackRegistration::VSyncCallbackRegistration(
        std::shared_ptr<VSyncDispatch> dispatch,
        VSyncDispatch::Callback callback,
        std::string callbackName)
      : mDispatch(std::move(dispatch)),
        mToken(mDispatch->registerCallback(std::move(callback),  // ← 调用点
                                           std::move(callbackName))) {}

// 移动构造函数
VSyncCallbackRegistration::VSyncCallbackRegistration(
        VSyncCallbackRegistration&& other)
      : mDispatch(std::move(other.mDispatch)), 
        mToken(std::exchange(other.mToken, std::nullopt)) {}

// 移动赋值运算符
VSyncCallbackRegistration& VSyncCallbackRegistration::operator=(
        VSyncCallbackRegistration&& other) {
    if (this == &other) return *this;
    if (mToken) {
        mDispatch->unregisterCallback(*mToken);  // ← 注销旧回调
    }
    mDispatch = std::move(other.mDispatch);
    mToken = std::exchange(other.mToken, std::nullopt);
    return *this;
}

// 析构函数 - 自动注销回调
VSyncCallbackRegistration::~VSyncCallbackRegistration() {
    if (mToken) mDispatch->unregisterCallback(*mToken);  // ← 注销回调
}

// 调度回调
ScheduleResult VSyncCallbackRegistration::schedule(
        VSyncDispatch::ScheduleTiming scheduleTiming) {
    if (!mToken) {
        return std::nullopt;
    }
    return mDispatch->schedule(*mToken, scheduleTiming);
}

registerCallback 实现

文件: frameworks/native/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp:328-337

VSyncDispatchTimerQueue::CallbackToken VSyncDispatchTimerQueue::registerCallback(
        Callback callback, std::string callbackName) {
    std::lock_guard lock(mMutex);
    
    // ← 将回调包装成 VSyncDispatchTimerQueueEntry 并存储到 mCallbacks map
    return CallbackToken{
            mCallbacks
                    .emplace(++mCallbackToken,
                             std::make_shared<VSyncDispatchTimerQueueEntry>(
                                     std::move(callbackName),
                                     std::move(callback),      // ← 保存 callback
                                     mMinVsyncDistance))
                    .first->first};
}

关键点:

  1. 每次调用 registerCallback 都会生成一个新的 CallbackToken (自增 ID)
  2. Callback 被包装成 VSyncDispatchTimerQueueEntry 对象
  3. 存储在 mCallbacks unordered_map 中
  4. 返回 CallbackToken 用于后续的 schedule/update/cancel 操作

完整调用栈示例

场景 1:EventThread 初始化

#0  VSyncDispatchTimerQueue::registerCallback()
#1  VSyncCallbackRegistration::VSyncCallbackRegistration()
#2  EventThread::EventThread()  [初始化列表]
#3  std::make_unique<EventThread>(...)
#4  Scheduler::Scheduler()
#5  SurfaceFlinger::SurfaceFlinger()

场景 2:刷新率切换

#0  VSyncDispatchTimerQueue::registerCallback()
#1  VSyncCallbackRegistration::VSyncCallbackRegistration()
#2  EventThread::onNewVsyncScheduleInternal()
#3  EventThread::onNewVsyncSchedule()
#4  Scheduler::applyNewVsyncSchedule()
#5  Scheduler::setPacesetterDisplay() 或 Scheduler::updatePolicy()

场景 3:Scheduler 初始化

#0  VSyncDispatchTimerQueue::registerCallback()
#1  VSyncCallbackRegistration::VSyncCallbackRegistration()
#2  MessageQueue::onNewVsyncScheduleLocked()
#3  MessageQueue::onNewVsyncSchedule()
#4  MessageQueue::initVsync()
#5  Scheduler::Scheduler()

关键设计模式

1. RAII 管理回调生命周期

class VSyncCallbackRegistration {
    std::shared_ptr<VSyncDispatch> mDispatch;
    std::optional<CallbackToken> mToken;
    
    // 构造函数自动注册
    VSyncCallbackRegistration(dispatch, callback, name) 
        : mDispatch(dispatch), mToken(dispatch->registerCallback(callback, name)) {}
    
    // 析构函数自动注销
    ~VSyncCallbackRegistration() {
        if (mToken) mDispatch->unregisterCallback(*mToken);
    }
};

优点:

  • 无需手动管理回调注销
  • 避免回调泄漏
  • 异常安全

2. Token 模式

using CallbackToken = StrongTyping<size_t, class CallbackTokenTag, Compare, Hash>;

// 注册时返回 Token
CallbackToken token = mDispatch->registerCallback(callback, name);

// 使用 Token 进行后续操作
mDispatch->schedule(token, timing);
mDispatch->cancel(token);
mDispatch->unregisterCallback(token);

优点:

  • 类型安全的回调标识
  • 支持多个回调并存
  • 可单独管理每个回调

3. std::function 回调

using Callback = std::function<void(nsecs_t, nsecs_t, nsecs_t)>;

// 支持 lambda、函数指针、bind 等
registerCallback([this](nsecs_t a, nsecs_t b, nsecs_t c) {
    onVsync(a, b, c);
}, "EventThread");

优点:

  • 灵活的回调定义
  • 支持捕获上下文
  • 类型擦除,接口简洁

总结

registerCallback 调用方汇总

调用方位置触发时机
EventThread 构造函数EventThread.cpp:253EventThread 创建时
PredictedVsyncTracer 构造函数VsyncSchedule.cpp:46VsyncSchedule 创建且启用 tracing 时
EventThread::onNewVsyncScheduleInternal()EventThread.cpp:740VSYNC 配置更新时
MessageQueue::onNewVsyncScheduleLocked()MessageQueue.cpp:114MessageQueue 初始化/VSYNC 更新时

调用链核心

VSyncCallbackRegistration 构造函数
  ↓
mDispatch->registerCallback(callback, name)
  ↓ (mDispatch 实际类型是 VSyncDispatchTimerQueue)
VSyncDispatchTimerQueue::registerCallback()
  ↓
mCallbacks.emplace(token, VSyncDispatchTimerQueueEntry(callback, ...))

生命周期管理

创建 → VSyncCallbackRegistration 构造函数 → registerCallback()
使用 → schedule()/update()/cancel()
销毁 → ~VSyncCallbackRegistration() → unregisterCallback()