SurfaceFlinger请求Vsync流程

sf vsync 的开始定时和定时完成的回调的主要类MessageQueue.cpp


一、MesssageQueue的初始化

在SurfaceFlinger.cpp的 init 时或者有新的屏幕添加的时候会调用到SurfaceFlinger::initScheduler()

void SurfaceFlinger::initScheduler(const sp<DisplayDevice>& display) {
   
    ........
	// 1、创建Configuration
    mVsyncConfiguration = getFactory().createVsyncConfiguration(currRefreshRate);

    .........
	//2、创建Scheduler实例
    mScheduler = std::make_unique<scheduler::Scheduler>(static_cast<ICompositor&>(*this),
                                                        static_cast<ISchedulerCallback&>(*this),
                                                        features);
    {
        。。。。
		// 3、创建 VsyncSchedule ,VsyncSchedule里面有三个属性 VsyncTracker、VsyncDispatch、 VsyncController非常重要
        mScheduler->createVsyncSchedule(features);
        。。。。
    }

	。。。。。
	//创建app vsync 对应的EventThread
    mAppConnectionHandle =
            mScheduler->createConnection("app", mFrameTimeline->getTokenManager(),
                                         /*workDuration=*/configs.late.appWorkDuration,
                                         /*readyDuration=*/configs.late.sfWorkDuration,
                                         impl::EventThread::InterceptVSyncsCallback());
    mSfConnectionHandle =
            mScheduler->createConnection("appSf", mFrameTimeline->getTokenManager(),
                                         /*workDuration=*/std::chrono::nanoseconds(vsyncPeriod),
                                         /*readyDuration=*/configs.late.sfWorkDuration,
                                         [this](nsecs_t timestamp) {
                                             mInterceptor->saveVSyncEvent(timestamp);
                                         });
	//4、
    mScheduler->initVsync(mScheduler->getVsyncDispatch(), *mFrameTimeline->getTokenManager(),
                          configs.late.sfWorkDuration);
     。。。。。
}

1.创建Configuration

创建Configuration的时候会定义出相位差的具体值,这个值很重要。我们知道app vsync 的workDuration是16.67ms,而sf vsync 的workDuration是15.67ms,就是因为相位差导致sf 比 app 的少1ms。这个时候还会确定app vsync和 sf vsync 的 workDuration 和 readyDuration 的值。这个相位差的作用了为了app和sf不会同时获取到vsync信号,不会争抢资源。
代码如下(示例):

std::unique_ptr<scheduler::VsyncConfiguration> DefaultFactory::createVsyncConfiguration(
        Fps currentRefreshRate) {
    if (property_get_bool("debug.sf.use_phase_offsets_as_durations", false)) {
        return std::make_unique<scheduler::impl::WorkDuration>(currentRefreshRate);
    } else {
        return std::make_unique<scheduler::impl::PhaseOffsets>(currentRefreshRate);
    }
}

通过命令 adb shell getprop debug.sf.use_phase_offsets_as_durations 查询设备的属性,结果没有获取到值,所以 property_get_bool 获取到的是默认的false,所以创建的是 PhaseOffsets。PhaseOffsets的构造方法如下

PhaseOffsets::PhaseOffsets(Fps currentRefreshRate)
      : PhaseOffsets(currentRefreshRate, sysprop::vsync_event_phase_offset_ns(1000000)//这里就是定义相位差的值

2.创建MessageQueue实例

代码 2 创建的是Scheduler的实例,而Scheduler的父类是MessageQueue

class Scheduler : impl::MessageQueue

3.创建VsyncSchedule 实例

void Scheduler::createVsyncSchedule(FeatureFlags features) {
    mVsyncSchedule.emplace(features);
}

emplace()是一个新语法:就是创建一个 mVsyncSchedule属性,并传入features。
VsyncSchedule里面有三个非常重要的属性:
在这里插入图片描述

4.开始进行sf vsync的定时

void MessageQueue::initVsync(scheduler::VSyncDispatch& dispatch,
                             frametimeline::TokenManager& tokenManager,
                             std::chrono::nanoseconds workDuration) {
     //开始定时                      
    setDuration(workDuration);
    mVsync.tokenManager = &tokenManager;
    //往 VSyncCallbackRegistration 中传入 &MessageQueue::vsyncCallback,定时结束之后最终会调用这个方法
    mVsync.registration = std::make_unique<
            scheduler::VSyncCallbackRegistration>(dispatch,
                                                  std::bind(&MessageQueue::vsyncCallback, this,
                                                            std::placeholders::_1,
                                                            std::placeholders::_2,
                                                            std::placeholders::_3),
                                                  "sf");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值