// Copyright 2013 The Flutter 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/flow/stopwatch.h" namespace flutter { static const size_t kMaxSamples = 120; Stopwatch::Stopwatch(const RefreshRateUpdater& updater) : refresh_rate_updater_(updater), start_(fml::TimePoint::Now()) { const fml::TimeDelta delta = fml::TimeDelta::Zero(); laps_.resize(kMaxSamples, delta); } Stopwatch::~Stopwatch() = default; FixedRefreshRateStopwatch::FixedRefreshRateStopwatch( fml::Milliseconds frame_budget) : Stopwatch(fixed_delegate_), fixed_delegate_(frame_budget) {} FixedRefreshRateUpdater::FixedRefreshRateUpdater( fml::Milliseconds fixed_frame_budget) : fixed_frame_budget_(fixed_frame_budget) {} void Stopwatch::Start() { start_ = fml::TimePoint::Now(); current_sample_ = (current_sample_ + 1) % kMaxSamples; } void Stopwatch::Stop() { laps_[current_sample_] = fml::TimePoint::Now() - start_; } void Stopwatch::SetLapTime(const fml::TimeDelta& delta) { current_sample_ = (current_sample_ + 1) % kMaxSamples; laps_[current_sample_] = delta; } const fml::TimeDelta& Stopwatch::LastLap() const { return laps_[(current_sample_ - 1) % kMaxSamples]; } const fml::TimeDelta& Stopwatch::GetLap(size_t index) const { return laps_[index]; } size_t Stopwatch::GetLapsCount() const { return laps_.size(); } size_t Stopwatch::GetCurrentSample() const { return current_sample_; } double StopwatchVisualizer::UnitFrameInterval(double raster_time_ms) const { return raster_time_ms / frame_budget_.count(); } double StopwatchVisualizer::UnitHeight(double raster_time_ms, double max_unit_interval) const { double unit_height = UnitFrameInterval(raster_time_ms) / max_unit_interval; if (unit_height > 1.0) { unit_height = 1.0; } return unit_height; } fml::TimeDelta Stopwatch::MaxDelta() const { fml::TimeDelta max_delta; for (size_t i = 0; i < kMaxSamples; i++) { if (laps_[i] > max_delta) { max_delta = laps_[i]; } } return max_delta; } fml::TimeDelta Stopwatch::AverageDelta() const { fml::TimeDelta sum; // default to 0 for (size_t i = 0; i < kMaxSamples; i++) { sum = sum + laps_[i]; } return sum / kMaxSamples; } fml::Milliseconds Stopwatch::GetFrameBudget() const { return refresh_rate_updater_.GetFrameBudget(); } fml::Milliseconds FixedRefreshRateUpdater::GetFrameBudget() const { return fixed_frame_budget_; } } // namespace flutter