From b77acbf30b8bbf48e5ead37b1ad3d2e468166f64 Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Thu, 2 Oct 2025 00:11:39 -0700 Subject: [PATCH] Delete Skia-specific performance overlay implementation (#176364) (Essentially a re-issue of https://github.com/flutter/flutter/pull/174682 which ended up with broken Google Testing links) We had 2 different implementations of the rendering code for the performance overlay layer. The skia version used some skia-specific code to render the overlay incrementally into an offscreen surface and so we created a different implementation for Impeller that only uses standard rendering calls (and no surface cache). It turns out that the Impeller version was faster anyway even on Skia so it is a simple change to delete the old code and always use the new visualizer. The new visualizer reduces the time to render the graph from just under 1ms to about .1ms on Skia. The new visualizer takes .1ms longer to compute on the UI thread, but overall we save time between the 2 threads. The new visualizer is much faster on Impeller. Some work could be done to save some of that time on the UI thread by only incrementally updating the graph data, but for now we can take the ~.8-.9ms savings with just some deleted code. --- engine/src/flutter/flow/BUILD.gn | 2 - .../flow/layers/performance_overlay_layer.cc | 9 +- .../performance_overlay_layer_unittests.cc | 20 +- engine/src/flutter/flow/stopwatch.cc | 7 +- engine/src/flutter/flow/stopwatch.h | 5 +- engine/src/flutter/flow/stopwatch_dl.cc | 69 +++---- engine/src/flutter/flow/stopwatch_sk.cc | 186 ------------------ engine/src/flutter/flow/stopwatch_sk.h | 40 ---- .../src/flutter/flow/stopwatch_unittests.cc | 24 ++- .../performance_overlay_gold_120fps.png | Bin 16260 -> 16080 bytes .../performance_overlay_gold_60fps.png | Bin 16534 -> 16118 bytes .../performance_overlay_gold_90fps.png | Bin 16266 -> 16204 bytes 12 files changed, 77 insertions(+), 285 deletions(-) delete mode 100644 engine/src/flutter/flow/stopwatch_sk.cc delete mode 100644 engine/src/flutter/flow/stopwatch_sk.h diff --git a/engine/src/flutter/flow/BUILD.gn b/engine/src/flutter/flow/BUILD.gn index 89abc7244af..c4a31be4052 100644 --- a/engine/src/flutter/flow/BUILD.gn +++ b/engine/src/flutter/flow/BUILD.gn @@ -82,8 +82,6 @@ source_set("flow") { "stopwatch.h", "stopwatch_dl.cc", "stopwatch_dl.h", - "stopwatch_sk.cc", - "stopwatch_sk.h", "surface.cc", "surface.h", "surface_frame.cc", diff --git a/engine/src/flutter/flow/layers/performance_overlay_layer.cc b/engine/src/flutter/flow/layers/performance_overlay_layer.cc index 505f6081c61..ce4855e3e23 100644 --- a/engine/src/flutter/flow/layers/performance_overlay_layer.cc +++ b/engine/src/flutter/flow/layers/performance_overlay_layer.cc @@ -12,7 +12,6 @@ #include "display_list/dl_text_skia.h" #include "flow/stopwatch.h" #include "flow/stopwatch_dl.h" -#include "flow/stopwatch_sk.h" #include "third_party/skia/include/core/SkFont.h" #include "third_party/skia/include/core/SkFontMgr.h" #include "third_party/skia/include/core/SkTextBlob.h" @@ -44,12 +43,8 @@ void VisualizeStopWatch(DlCanvas* canvas, if (show_graph) { DlRect visualization_rect = DlRect::MakeXYWH(x, y, width, height); - if (impeller_enabled) { - DlStopwatchVisualizer(stopwatch, point_storage, color_storage) - .Visualize(canvas, visualization_rect); - } else { - SkStopwatchVisualizer(stopwatch).Visualize(canvas, visualization_rect); - } + DlStopwatchVisualizer(stopwatch, point_storage, color_storage) + .Visualize(canvas, visualization_rect); } if (show_labels) { diff --git a/engine/src/flutter/flow/layers/performance_overlay_layer_unittests.cc b/engine/src/flutter/flow/layers/performance_overlay_layer_unittests.cc index e787e9162ac..078c4e34f9b 100644 --- a/engine/src/flutter/flow/layers/performance_overlay_layer_unittests.cc +++ b/engine/src/flutter/flow/layers/performance_overlay_layer_unittests.cc @@ -73,6 +73,7 @@ static void TestPerformanceOverlayLayerGold(int refresh_rate) { .ui_time = mock_stopwatch, .texture_registry = nullptr, .raster_cache = nullptr, + .impeller_enabled = false, // clang-format on }; @@ -141,7 +142,13 @@ class ImageSizeTextBlobInspector : public virtual DlOpReceiver, const DlPoint& point, DlImageSampling sampling, bool render_with_attributes) override { - sizes_.push_back(image->GetBounds().GetSize()); + // We no longer render performance overlays with temp images. + FML_UNREACHABLE(); + } + + void drawVertices(const std::shared_ptr& vertices, + DlBlendMode mode) override { + sizes_.push_back(vertices->GetBounds().GetSize()); } void drawText(const std::shared_ptr& text, @@ -151,17 +158,17 @@ class ImageSizeTextBlobInspector : public virtual DlOpReceiver, text_positions_.push_back(DlPoint(x, y)); } - const std::vector& sizes() { return sizes_; } + const std::vector& sizes() { return sizes_; } const std::vector> texts() { return texts_; } const std::vector text_positions() { return text_positions_; } private: - std::vector sizes_; + std::vector sizes_; std::vector> texts_; std::vector text_positions_; }; -TEST_F(PerformanceOverlayLayerTest, PaintingEmptyLayerDies) { +TEST_F(PerformanceOverlayLayerTest, PaintingEmptyLayerDoesNotDie) { const uint64_t overlay_opts = kVisualizeRasterizerStatistics; auto layer = std::make_shared(overlay_opts); @@ -169,8 +176,7 @@ TEST_F(PerformanceOverlayLayerTest, PaintingEmptyLayerDies) { EXPECT_EQ(layer->paint_bounds(), DlRect()); EXPECT_FALSE(layer->needs_painting(paint_context())); - // Crashes reading a nullptr. - EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()), ""); + layer->Paint(paint_context()); } TEST_F(PerformanceOverlayLayerTest, InvalidOptions) { @@ -237,7 +243,7 @@ TEST_F(PerformanceOverlayLayerTest, MarkAsDirtyWhenResized) { layer->set_paint_bounds(DlRect::MakeLTRB(0.0f, 0.0f, 48.0f, 48.0f)); layer->Preroll(preroll_context()); layer->Paint(display_list_paint_context()); - DlISize first_draw_size; + DlSize first_draw_size; { ImageSizeTextBlobInspector inspector; display_list()->Dispatch(inspector); diff --git a/engine/src/flutter/flow/stopwatch.cc b/engine/src/flutter/flow/stopwatch.cc index ac0e25ca05c..03fe10878f5 100644 --- a/engine/src/flutter/flow/stopwatch.cc +++ b/engine/src/flutter/flow/stopwatch.cc @@ -6,8 +6,6 @@ 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(); @@ -26,11 +24,10 @@ FixedRefreshRateUpdater::FixedRefreshRateUpdater( void Stopwatch::Start() { start_ = fml::TimePoint::Now(); - current_sample_ = (current_sample_ + 1) % kMaxSamples; } void Stopwatch::Stop() { - laps_[current_sample_] = fml::TimePoint::Now() - start_; + SetLapTime(fml::TimePoint::Now() - start_); } void Stopwatch::SetLapTime(const fml::TimeDelta& delta) { @@ -39,7 +36,7 @@ void Stopwatch::SetLapTime(const fml::TimeDelta& delta) { } const fml::TimeDelta& Stopwatch::LastLap() const { - return laps_[(current_sample_ - 1) % kMaxSamples]; + return laps_[current_sample_]; } const fml::TimeDelta& Stopwatch::GetLap(size_t index) const { diff --git a/engine/src/flutter/flow/stopwatch.h b/engine/src/flutter/flow/stopwatch.h index 71869aae24e..ffdda914316 100644 --- a/engine/src/flutter/flow/stopwatch.h +++ b/engine/src/flutter/flow/stopwatch.h @@ -16,6 +16,9 @@ namespace flutter { class Stopwatch { public: + // The number of samples that will be accumulated for performance monitoring + static const size_t kMaxSamples = 120; + /// The refresh rate interface for `Stopwatch`. class RefreshRateUpdater { public: @@ -56,7 +59,7 @@ class Stopwatch { const RefreshRateUpdater& refresh_rate_updater_; fml::TimePoint start_; std::vector laps_; - size_t current_sample_ = 0; + size_t current_sample_ = kMaxSamples - 1u; FML_DISALLOW_COPY_AND_ASSIGN(Stopwatch); }; diff --git a/engine/src/flutter/flow/stopwatch_dl.cc b/engine/src/flutter/flow/stopwatch_dl.cc index 2235d089042..914430dcbb1 100644 --- a/engine/src/flutter/flow/stopwatch_dl.cc +++ b/engine/src/flutter/flow/stopwatch_dl.cc @@ -20,21 +20,21 @@ static const size_t kMaxFrameMarkers = 8; void DlStopwatchVisualizer::Visualize(DlCanvas* canvas, const DlRect& rect) const { - auto painter = DlVertexPainter(vertices_storage_, color_storage_); + DlVertexPainter painter(vertices_storage_, color_storage_); DlPaint paint; // Establish the graph position. - auto const x = rect.GetX(); - auto const y = rect.GetY(); - auto const width = rect.GetWidth(); - auto const height = rect.GetHeight(); - auto const bottom = rect.GetBottom(); + const DlScalar x = rect.GetX(); + const DlScalar y = rect.GetY(); + const DlScalar width = rect.GetWidth(); + const DlScalar height = rect.GetHeight(); + const DlScalar bottom = rect.GetBottom(); // Scale the graph to show time frames up to those that are 3x the frame time. - auto const one_frame_ms = GetFrameBudget().count(); - auto const max_interval = one_frame_ms * 3.0; - auto const max_unit_interval = UnitFrameInterval(max_interval); - auto const sample_unit_width = (1.0 / kMaxSamples); + const DlScalar one_frame_ms = GetFrameBudget().count(); + const DlScalar max_interval = one_frame_ms * 3.0; + const DlScalar max_unit_interval = UnitFrameInterval(max_interval); + const DlScalar sample_unit_width = width / kMaxSamples; // resize backing storage to match expected lap count. size_t required_storage = @@ -50,20 +50,21 @@ void DlStopwatchVisualizer::Visualize(DlCanvas* canvas, // Prepare a path for the data; we start at the height of the last point so // it looks like we wrap around. { - for (auto i = 0u; i < stopwatch_.GetLapsCount(); i++) { - auto const sample_unit_height = - (1.0 - UnitHeight(stopwatch_.GetLap(i).ToMillisecondsF(), - max_unit_interval)); + DlScalar bar_left = x; + for (size_t i = 0u; i < stopwatch_.GetLapsCount(); i++) { + const double time_ms = stopwatch_.GetLap(i).ToMillisecondsF(); + const DlScalar sample_unit_height = static_cast( + height * UnitHeight(time_ms, max_unit_interval)); - auto const bar_width = width * sample_unit_width; - auto const bar_height = height * sample_unit_height; - auto const bar_left = x + width * sample_unit_width * i; + const DlScalar bar_top = bottom - sample_unit_height; + const DlScalar bar_right = x + (i + 1) * sample_unit_width; painter.DrawRect(DlRect::MakeLTRB(/*left=*/bar_left, - /*top=*/y + bar_height, - /*right=*/bar_left + bar_width, + /*top=*/bar_top, + /*right=*/bar_right, /*bottom=*/bottom), DlColor(0xAA0000FF)); + bar_left = bar_right; } } @@ -71,22 +72,22 @@ void DlStopwatchVisualizer::Visualize(DlCanvas* canvas, { if (max_interval > one_frame_ms) { // Paint the horizontal markers. - auto count = static_cast(max_interval / one_frame_ms); + size_t count = static_cast(max_interval / one_frame_ms); // Limit the number of markers to a reasonable amount. if (count > kMaxFrameMarkers) { count = 1; } - for (auto i = 0u; i < count; i++) { - auto const frame_height = + for (uint32_t i = 0u; i < count; i++) { + const DlScalar frame_height = height * (1.0 - (UnitFrameInterval(i + 1) * one_frame_ms) / max_unit_interval); // Draw a skinny rectangle (i.e. a line). painter.DrawRect(DlRect::MakeLTRB(/*left=*/x, /*top=*/y + frame_height, - /*right=*/width, + /*right=*/x + width, /*bottom=*/y + frame_height + 1), DlColor(0xCC000000)); } @@ -100,12 +101,12 @@ void DlStopwatchVisualizer::Visualize(DlCanvas* canvas, // budget exceeded. color = DlColor::kRed(); } - auto const l = - x + width * (static_cast(stopwatch_.GetCurrentSample()) / - kMaxSamples); - auto const t = y; - auto const r = l + width * sample_unit_width; - auto const b = rect.GetBottom(); + size_t sample = + (stopwatch_.GetCurrentSample() + 1) % stopwatch_.GetLapsCount(); + const DlScalar l = x + sample * sample_unit_width; + const DlScalar t = y; + const DlScalar r = l + sample_unit_width; + const DlScalar b = rect.GetBottom(); painter.DrawRect(DlRect::MakeLTRB(l, t, r, b), color); } @@ -124,10 +125,10 @@ DlVertexPainter::DlVertexPainter(std::vector& vertices_storage, : vertices_(vertices_storage), colors_(color_storage) {} void DlVertexPainter::DrawRect(const DlRect& rect, const DlColor& color) { - auto const left = rect.GetLeft(); - auto const top = rect.GetTop(); - auto const right = rect.GetRight(); - auto const bottom = rect.GetBottom(); + const DlScalar left = rect.GetLeft(); + const DlScalar top = rect.GetTop(); + const DlScalar right = rect.GetRight(); + const DlScalar bottom = rect.GetBottom(); FML_DCHECK(6 + colors_offset_ <= vertices_.size()); FML_DCHECK(6 + colors_offset_ <= colors_.size()); @@ -139,7 +140,7 @@ void DlVertexPainter::DrawRect(const DlRect& rect, const DlColor& color) { vertices_[vertices_offset_++] = DlPoint(right, bottom); // tl vertices_[vertices_offset_++] = DlPoint(left, bottom); // bl br vertices_[vertices_offset_++] = DlPoint(left, top); // - for (auto i = 0u; i < 6u; i++) { + for (size_t i = 0u; i < 6u; i++) { colors_[colors_offset_++] = color; } } diff --git a/engine/src/flutter/flow/stopwatch_sk.cc b/engine/src/flutter/flow/stopwatch_sk.cc deleted file mode 100644 index c40eedd5acb..00000000000 --- a/engine/src/flutter/flow/stopwatch_sk.cc +++ /dev/null @@ -1,186 +0,0 @@ -// 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_sk.h" -#include "include/core/SkCanvas.h" -#include "include/core/SkImageInfo.h" -#include "include/core/SkPaint.h" -#include "include/core/SkPath.h" -#include "include/core/SkSize.h" -#include "include/core/SkSurface.h" - -namespace flutter { - -static const size_t kMaxSamples = 120; -static const size_t kMaxFrameMarkers = 8; - -void SkStopwatchVisualizer::InitVisualizeSurface(SkISize size) const { - // Mark as dirty if the size has changed. - if (visualize_cache_surface_) { - if (size.width() != visualize_cache_surface_->width() || - size.height() != visualize_cache_surface_->height()) { - cache_dirty_ = true; - }; - } - - if (!cache_dirty_) { - return; - } - cache_dirty_ = false; - - // TODO(garyq): Use a GPU surface instead of a CPU surface. - visualize_cache_surface_ = - SkSurfaces::Raster(SkImageInfo::MakeN32Premul(size)); - - SkCanvas* cache_canvas = visualize_cache_surface_->getCanvas(); - - // Establish the graph position. - const SkScalar x = 0; - const SkScalar y = 0; - const SkScalar width = size.width(); - const SkScalar height = size.height(); - - SkPaint paint; - paint.setColor(0x99FFFFFF); - cache_canvas->drawRect(SkRect::MakeXYWH(x, y, width, height), paint); - - // Scale the graph to show frame times up to those that are 3 times the frame - // time. - const double one_frame_ms = GetFrameBudget().count(); - const double max_interval = one_frame_ms * 3.0; - const double max_unit_interval = UnitFrameInterval(max_interval); - - // Draw the old data to initially populate the graph. - // Prepare a path for the data. We start at the height of the last point, so - // it looks like we wrap around - SkPath path; - path.setIsVolatile(true); - path.moveTo(x, height); - path.lineTo( - x, y + height * (1.0 - UnitHeight(stopwatch_.GetLap(0).ToMillisecondsF(), - max_unit_interval))); - double unit_x; - double unit_next_x = 0.0; - for (size_t i = 0; i < kMaxSamples; i += 1) { - unit_x = unit_next_x; - unit_next_x = (static_cast(i + 1) / kMaxSamples); - const double sample_y = - y + height * (1.0 - UnitHeight(stopwatch_.GetLap(i).ToMillisecondsF(), - max_unit_interval)); - path.lineTo(x + width * unit_x, sample_y); - path.lineTo(x + width * unit_next_x, sample_y); - } - path.lineTo( - width, - y + height * - (1.0 - - UnitHeight(stopwatch_.GetLap(kMaxSamples - 1).ToMillisecondsF(), - max_unit_interval))); - path.lineTo(width, height); - path.close(); - - // Draw the graph. - paint.setColor(0xAA0000FF); - cache_canvas->drawPath(path, paint); -} - -void SkStopwatchVisualizer::Visualize(DlCanvas* canvas, - const DlRect& rect) const { - // Initialize visualize cache if it has not yet been initialized. - InitVisualizeSurface(SkISize::Make(rect.GetWidth(), rect.GetHeight())); - - SkCanvas* cache_canvas = visualize_cache_surface_->getCanvas(); - SkPaint paint; - - // Establish the graph position. - const SkScalar x = 0; - const SkScalar y = 0; - const SkScalar width = visualize_cache_surface_->width(); - const SkScalar height = visualize_cache_surface_->height(); - - // Scale the graph to show frame times up to those that are 3 times the frame - // time. - const double one_frame_ms = GetFrameBudget().count(); - const double max_interval = one_frame_ms * 3.0; - const double max_unit_interval = UnitFrameInterval(max_interval); - - const double sample_unit_width = (1.0 / kMaxSamples); - - // Draw vertical replacement bar to erase old/stale pixels. - paint.setColor(0x99FFFFFF); - paint.setStyle(SkPaint::Style::kFill_Style); - paint.setBlendMode(SkBlendMode::kSrc); - double sample_x = - x + width * (static_cast(prev_drawn_sample_index_) / kMaxSamples); - const auto eraser_rect = SkRect::MakeLTRB( - sample_x, y, sample_x + width * sample_unit_width, height); - cache_canvas->drawRect(eraser_rect, paint); - - // Draws blue timing bar for new data. - paint.setColor(0xAA0000FF); - paint.setBlendMode(SkBlendMode::kSrcOver); - const auto bar_rect = SkRect::MakeLTRB( - sample_x, - y + height * - (1.0 - - UnitHeight(stopwatch_ - .GetLap(stopwatch_.GetCurrentSample() == 0 - ? kMaxSamples - 1 - : stopwatch_.GetCurrentSample() - 1) - .ToMillisecondsF(), - max_unit_interval)), - sample_x + width * sample_unit_width, height); - cache_canvas->drawRect(bar_rect, paint); - - // Draw horizontal frame markers. - paint.setStrokeWidth(0); // hairline - paint.setStyle(SkPaint::Style::kStroke_Style); - paint.setColor(0xCC000000); - - if (max_interval > one_frame_ms) { - // Paint the horizontal markers - size_t frame_marker_count = - static_cast(max_interval / one_frame_ms); - - // Limit the number of markers displayed. After a certain point, the graph - // becomes crowded - if (frame_marker_count > kMaxFrameMarkers) { - frame_marker_count = 1; - } - - for (size_t frame_index = 0; frame_index < frame_marker_count; - frame_index++) { - const double frame_height = - height * (1.0 - (UnitFrameInterval((frame_index + 1) * one_frame_ms) / - max_unit_interval)); - cache_canvas->drawLine(x, y + frame_height, width, y + frame_height, - paint); - } - } - - // Paint the vertical marker for the current frame. - // We paint it over the current frame, not after it, because when we - // paint this we don't yet have all the times for the current frame. - paint.setStyle(SkPaint::Style::kFill_Style); - paint.setBlendMode(SkBlendMode::kSrcOver); - if (UnitFrameInterval(stopwatch_.LastLap().ToMillisecondsF()) > 1.0) { - // budget exceeded - paint.setColor(SK_ColorRED); - } else { - // within budget - paint.setColor(SK_ColorGREEN); - } - sample_x = x + width * (static_cast(stopwatch_.GetCurrentSample()) / - kMaxSamples); - const auto marker_rect = SkRect::MakeLTRB( - sample_x, y, sample_x + width * sample_unit_width, height); - cache_canvas->drawRect(marker_rect, paint); - prev_drawn_sample_index_ = stopwatch_.GetCurrentSample(); - - // Draw the cached surface onto the output canvas. - auto image = DlImage::Make(visualize_cache_surface_->makeImageSnapshot()); - canvas->DrawImage(image, rect.GetOrigin(), DlImageSampling::kNearestNeighbor); -} - -} // namespace flutter diff --git a/engine/src/flutter/flow/stopwatch_sk.h b/engine/src/flutter/flow/stopwatch_sk.h deleted file mode 100644 index 9a73b0dbeab..00000000000 --- a/engine/src/flutter/flow/stopwatch_sk.h +++ /dev/null @@ -1,40 +0,0 @@ -// 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_STOPWATCH_SK_H_ -#define FLUTTER_FLOW_STOPWATCH_SK_H_ - -#include "flow/stopwatch.h" -#include "include/core/SkSurface.h" - -namespace flutter { - -//------------------------------------------------------------------------------ -/// A stopwatch visualizer that uses Skia (|SkCanvas|) to draw the stopwatch. -/// -/// @see DlStopwatchVisualizer for the newer non-backend specific version. -class SkStopwatchVisualizer : public StopwatchVisualizer { - public: - explicit SkStopwatchVisualizer(const Stopwatch& stopwatch) - : StopwatchVisualizer(stopwatch) {} - - void Visualize(DlCanvas* canvas, const DlRect& rect) const override; - - private: - /// Initializes the |SkSurface| used for drawing the stopwatch. - /// - /// Draws the base background and any timing data from before the initial - /// call to |Visualize|. - void InitVisualizeSurface(SkISize size) const; - - // Mutable data cache for performance optimization of the graphs. - // Prevents expensive redrawing of old data. - mutable bool cache_dirty_ = true; - mutable sk_sp visualize_cache_surface_; - mutable size_t prev_drawn_sample_index_ = 0; -}; - -} // namespace flutter - -#endif // FLUTTER_FLOW_STOPWATCH_SK_H_ diff --git a/engine/src/flutter/flow/stopwatch_unittests.cc b/engine/src/flutter/flow/stopwatch_unittests.cc index c8fae3e0479..cae2f55b8d4 100644 --- a/engine/src/flutter/flow/stopwatch_unittests.cc +++ b/engine/src/flutter/flow/stopwatch_unittests.cc @@ -51,15 +51,33 @@ TEST(Instrumentation, GetLapByIndexTest) { fml::Milliseconds frame_budget_90fps = fml::RefreshRateToFrameBudget(90); FixedRefreshRateStopwatch stopwatch(frame_budget_90fps); stopwatch.SetLapTime(fml::TimeDelta::FromMilliseconds(10)); - EXPECT_EQ(stopwatch.GetLap(1), fml::TimeDelta::FromMilliseconds(10)); + EXPECT_EQ(stopwatch.GetLap(0), fml::TimeDelta::FromMilliseconds(10)); } -TEST(Instrumentation, GetCurrentSampleTest) { +TEST(Instrumentation, GetCurrentSampleStartStopTest) { fml::Milliseconds frame_budget_90fps = fml::RefreshRateToFrameBudget(90); FixedRefreshRateStopwatch stopwatch(frame_budget_90fps); + // Stopwatch starts primed to place the first sample in slot 0 when + // the actual time is available. + EXPECT_EQ(stopwatch.GetCurrentSample(), size_t(Stopwatch::kMaxSamples - 1u)); stopwatch.Start(); + // CurrentSample still not updated because we are still measuring + // this frame. + EXPECT_EQ(stopwatch.GetCurrentSample(), size_t(Stopwatch::kMaxSamples - 1u)); stopwatch.Stop(); - EXPECT_EQ(stopwatch.GetCurrentSample(), size_t(1)); + // The most current sample is placed in slot #0. + EXPECT_EQ(stopwatch.GetCurrentSample(), size_t(0)); +} + +TEST(Instrumentation, GetCurrentSampleSetLapTimeTest) { + fml::Milliseconds frame_budget_90fps = fml::RefreshRateToFrameBudget(90); + FixedRefreshRateStopwatch stopwatch(frame_budget_90fps); + // Stopwatch starts primed to place the first sample in slot 0 when + // the actual time is available. + EXPECT_EQ(stopwatch.GetCurrentSample(), size_t(Stopwatch::kMaxSamples - 1u)); + stopwatch.SetLapTime(fml::TimeDelta::FromMilliseconds(10)); + // The most current sample is placed in slot #0. + EXPECT_EQ(stopwatch.GetCurrentSample(), size_t(0)); } TEST(Instrumentation, GetLapsCount) { diff --git a/engine/src/flutter/testing/resources/performance_overlay_gold_120fps.png b/engine/src/flutter/testing/resources/performance_overlay_gold_120fps.png index 20bb1f8704fe4d9983cbb16f399ec53d247f150e..572a5bc0dc3bfe35155f12ffea7d600238ad7478 100644 GIT binary patch literal 16080 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 diff --git a/engine/src/flutter/testing/resources/performance_overlay_gold_60fps.png b/engine/src/flutter/testing/resources/performance_overlay_gold_60fps.png index 5e5dd0218ded359c2cd0fce0e4d783585a81ceb4..0742106286ddde9a0379b47ad2bee364b1fd5c9b 100644 GIT binary patch literal 16118 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Νom`hBpP3*cNr>YwaE!&6yd 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 literal 16534 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

~2TqUF9v#Rmu#cC02 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 rPYe8Mfj=$qrv?7B!2j