Skip to content

Commit

Permalink
[perf] Add a SceneDisplayLag event when we miss vsyncs (flutter#17575)
Browse files Browse the repository at this point in the history
This event goes from now -> current vsync target time
to avoid the limitations as seen in flutter#54095 (comment)

This event also tags additional metadata to capture
`vsync_transitions_missed` considering the refresh rate of the display.
  • Loading branch information
iskakaushik committed Apr 8, 2020
1 parent 1b48463 commit f6ca489
Showing 1 changed file with 27 additions and 0 deletions.
27 changes: 27 additions & 0 deletions shell/common/rasterizer.cc
Expand Up @@ -242,6 +242,7 @@ RasterStatus Rasterizer::DoDraw(
}

FrameTiming timing;
const fml::TimePoint frame_target_time = layer_tree->target_time();
timing.Set(FrameTiming::kBuildStart, layer_tree->build_start());
timing.Set(FrameTiming::kBuildFinish, layer_tree->build_finish());
timing.Set(FrameTiming::kRasterStart, fml::TimePoint::Now());
Expand Down Expand Up @@ -271,6 +272,32 @@ RasterStatus Rasterizer::DoDraw(
timing.Set(FrameTiming::kRasterFinish, raster_finish_time);
delegate_.OnFrameRasterized(timing);

if (raster_finish_time > frame_target_time) {
fml::TimePoint latest_frame_target_time =
delegate_.GetLatestFrameTargetTime();
const auto frame_budget_millis = delegate_.GetFrameBudget().count();
if (latest_frame_target_time < raster_finish_time) {
latest_frame_target_time =
latest_frame_target_time +
fml::TimeDelta::FromMillisecondsF(frame_budget_millis);
}
const auto frame_lag =
(latest_frame_target_time - frame_target_time).ToMillisecondsF();
const int vsync_transitions_missed = round(frame_lag / frame_budget_millis);
fml::tracing::TraceEventAsyncComplete(
"flutter", // category
"SceneDisplayLag", // name
raster_finish_time, // begin_time
latest_frame_target_time, // end_time
"frame_target_time", // arg_key_1
frame_target_time, // arg_val_1
"current_frame_target_time", // arg_key_2
latest_frame_target_time, // arg_val_2
"vsync_transitions_missed", // arg_key_3
vsync_transitions_missed // arg_val_3
);
}

// Pipeline pressure is applied from a couple of places:
// rasterizer: When there are more items as of the time of Consume.
// animator (via shell): Frame gets produces every vsync.
Expand Down

0 comments on commit f6ca489

Please sign in to comment.