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