| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/shell/common/vsync_waiter_fallback.h" |
| |
| #include "flutter/fml/logging.h" |
| |
| namespace shell { |
| namespace { |
| |
| fml::TimePoint SnapToNextTick(fml::TimePoint value, |
| fml::TimePoint tick_phase, |
| fml::TimeDelta tick_interval) { |
| fml::TimeDelta offset = (tick_phase - value) % tick_interval; |
| if (offset != fml::TimeDelta::Zero()) |
| offset = offset + tick_interval; |
| return value + offset; |
| } |
| |
| } // namespace |
| |
| VsyncWaiterFallback::VsyncWaiterFallback(blink::TaskRunners task_runners) |
| : VsyncWaiter(std::move(task_runners)), |
| phase_(fml::TimePoint::Now()), |
| weak_factory_(this) {} |
| |
| VsyncWaiterFallback::~VsyncWaiterFallback() = default; |
| |
| constexpr fml::TimeDelta interval = fml::TimeDelta::FromSecondsF(1.0 / 60.0); |
| |
| // |shell::VsyncWaiter| |
| void VsyncWaiterFallback::AwaitVSync() { |
| fml::TimePoint now = fml::TimePoint::Now(); |
| fml::TimePoint next = SnapToNextTick(now, phase_, interval); |
| |
| task_runners_.GetUITaskRunner()->PostDelayedTask( |
| [self = weak_factory_.GetWeakPtr()] { |
| if (self) { |
| const auto frame_time = fml::TimePoint::Now(); |
| self->FireCallback(frame_time, frame_time + interval); |
| } |
| }, |
| next - now); |
| } |
| |
| } // namespace shell |