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");
}