Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 2be282e

Browse files
author
Kaushik Iska
committed
[perf] Add a SceneDisplayLag event when we miss vsyncs
This event goes from now -> current vsync target time to avoid the limitations as seen in flutter/flutter#54095 (comment) This event also tags additional metadata to capture `vsync_transitions_missed` considering the refresh rate of the display.
1 parent 1b6b609 commit 2be282e

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

shell/common/rasterizer.cc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ RasterStatus Rasterizer::DoDraw(
242242
}
243243

244244
FrameTiming timing;
245+
const fml::TimePoint frame_target_time = layer_tree->target_time();
245246
timing.Set(FrameTiming::kBuildStart, layer_tree->build_start());
246247
timing.Set(FrameTiming::kBuildFinish, layer_tree->build_finish());
247248
timing.Set(FrameTiming::kRasterStart, fml::TimePoint::Now());
@@ -271,6 +272,32 @@ RasterStatus Rasterizer::DoDraw(
271272
timing.Set(FrameTiming::kRasterFinish, raster_finish_time);
272273
delegate_.OnFrameRasterized(timing);
273274

275+
if (raster_finish_time > frame_target_time) {
276+
fml::TimePoint latest_frame_target_time =
277+
delegate_.GetLatestFrameTargetTime();
278+
const auto frame_budget_millis = delegate_.GetFrameBudget().count();
279+
if (latest_frame_target_time < raster_finish_time) {
280+
latest_frame_target_time =
281+
latest_frame_target_time +
282+
fml::TimeDelta::FromMillisecondsF(frame_budget_millis);
283+
}
284+
const auto frame_lag =
285+
(latest_frame_target_time - frame_target_time).ToMillisecondsF();
286+
const int vsync_transitions_missed = round(frame_lag / frame_budget_millis);
287+
fml::tracing::TraceEventAsyncComplete(
288+
"flutter", // category
289+
"SceneDisplayLag", // name
290+
raster_finish_time, // begin_time
291+
latest_frame_target_time, // end_time
292+
"frame_target_time", // arg_key_1
293+
frame_target_time, // arg_val_1
294+
"current_frame_target_time", // arg_key_2
295+
latest_frame_target_time, // arg_val_2
296+
"vsync_transitions_missed", // arg_key_3
297+
vsync_transitions_missed // arg_val_3
298+
);
299+
}
300+
274301
// Pipeline pressure is applied from a couple of places:
275302
// rasterizer: When there are more items as of the time of Consume.
276303
// animator (via shell): Frame gets produces every vsync.

0 commit comments

Comments
 (0)