| // 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. |
| |
| #ifndef FLUTTER_FLOW_INSTRUMENTATION_H_ |
| #define FLUTTER_FLOW_INSTRUMENTATION_H_ |
| |
| #include <vector> |
| |
| #include "flutter/fml/macros.h" |
| #include "flutter/fml/time/time_delta.h" |
| #include "flutter/fml/time/time_point.h" |
| #include "third_party/skia/include/core/SkCanvas.h" |
| |
| namespace flutter { |
| |
| class Stopwatch { |
| public: |
| /// The refresh rate interface for `Stopwatch`. |
| class RefreshRateUpdater { |
| public: |
| /// Time limit for a smooth frame. |
| /// See: `DisplayManager::GetMainDisplayRefreshRate`. |
| virtual fml::Milliseconds GetFrameBudget() const = 0; |
| }; |
| |
| /// The constructor with a updater parameter, it will update frame_budget |
| /// everytime when `GetFrameBudget()` is called. |
| explicit Stopwatch(const RefreshRateUpdater& updater); |
| |
| ~Stopwatch(); |
| |
| const fml::TimeDelta& LastLap() const; |
| |
| fml::TimeDelta MaxDelta() const; |
| |
| fml::TimeDelta AverageDelta() const; |
| |
| void InitVisualizeSurface(const SkRect& rect) const; |
| |
| void Visualize(SkCanvas* canvas, const SkRect& rect) const; |
| |
| void Start(); |
| |
| void Stop(); |
| |
| void SetLapTime(const fml::TimeDelta& delta); |
| |
| /// All places which want to get frame_budget should call this function. |
| fml::Milliseconds GetFrameBudget() const; |
| |
| private: |
| inline double UnitFrameInterval(double time_ms) const; |
| inline double UnitHeight(double time_ms, double max_height) const; |
| |
| const RefreshRateUpdater& refresh_rate_updater_; |
| fml::TimePoint start_; |
| std::vector<fml::TimeDelta> laps_; |
| size_t current_sample_; |
| |
| // Mutable data cache for performance optimization of the graphs. Prevents |
| // expensive redrawing of old data. |
| mutable bool cache_dirty_; |
| mutable sk_sp<SkSurface> visualize_cache_surface_; |
| mutable size_t prev_drawn_sample_index_; |
| |
| FML_DISALLOW_COPY_AND_ASSIGN(Stopwatch); |
| }; |
| |
| /// Used for fixed refresh rate query cases. |
| class FixedRefreshRateUpdater : public Stopwatch::RefreshRateUpdater { |
| fml::Milliseconds GetFrameBudget() const override; |
| |
| public: |
| explicit FixedRefreshRateUpdater( |
| fml::Milliseconds fixed_frame_budget = fml::kDefaultFrameBudget); |
| |
| private: |
| fml::Milliseconds fixed_frame_budget_; |
| }; |
| |
| /// Used for fixed refresh rate cases. |
| class FixedRefreshRateStopwatch : public Stopwatch { |
| public: |
| explicit FixedRefreshRateStopwatch( |
| fml::Milliseconds fixed_frame_budget = fml::kDefaultFrameBudget); |
| |
| private: |
| FixedRefreshRateUpdater fixed_delegate_; |
| }; |
| |
| } // namespace flutter |
| |
| #endif // FLUTTER_FLOW_INSTRUMENTATION_H_ |