Android Vsync事件分发

VsyncDispatchTimerQueueEntry

上一篇文章讲到,displaysyncsource会将自己的 onVsyncCallback 接口注册到 VSyncDispatchTimerQueueEntry 中

VSyncDispatchTimerQueueEntry::VSyncDispatchTimerQueueEntry(std::string const& name,
                                                           VSyncDispatch::Callback const& cb,
                                                           nsecs_t minVsyncDistance)
      : mName(name),
        mCallback(cb),
        mMinVsyncDistance(minVsyncDistance) {}

这个 Entry 类内部会维护 一个 mArmedInfo 结构体,这里面分别记录了nextWakeupTime, nextVsyncTime, nextReadyTime。 executing() 接口会将该结构体清空
nextWakeupTime 线程需要被唤醒的时间
nextVsyncTime 真正的Vsync time
nextReadyTime
然后每个 entry 类 会将自己 作为 callback注册到 VsyncDispatchTimerQueue 中

VsyncDispatchTimerQueue

这个类负责 在 wakeuptime 来临时,唤醒 DispSyncSource,并且更新Entry 类的mArmedInfo
他会将自己的timerCallback 接口作为callback注册给 Time类

Timer

timer 顾名思义,是一个计时器。
他是一个线程,在启动是,会创建一个 timerfd用于计时,一个epollfd,用于通知消息

Timer::Timer() {
    reset();
    mDispatchThread = std::thread([this]() { threadMain(); });
}

Timer::~Timer() {
    endDispatch();
    mDispatchThread.join();
    cleanup();
}

void Timer::reset() {
    cleanup();
    mTimerFd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC | TFD_NONBLOCK);
    mEpollFd = epoll_create1(EPOLL_CLOEXEC);
    if (pipe2(mPipes.data(), O_CLOEXEC | O_NONBLOCK)) {
        ALOGE("could not create TimerDispatch mPipes");
        return;
    };
    setDebugState(DebugState::Reset);
}

每次 VsyncDispatchTimerQueue 从 entry类 获得的 wakeuptime,会给timer 作为 target time,然后设置等待。在timer的线程函数中,会用epoll 等待时间到来的消息,当时间到来时,会按照该流程callback
Timer ->VsyncDispatchTimerQueue -> VsyncDispatchTimerQueueEntry->DispSyncSource->EventThread -> MessageQueue -> SurfaceFlinger

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值