| // 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 |