diff options
Diffstat (limited to 'chromium/ui/latency/average_lag_tracker.cc')
-rw-r--r-- | chromium/ui/latency/average_lag_tracker.cc | 153 |
1 files changed, 83 insertions, 70 deletions
diff --git a/chromium/ui/latency/average_lag_tracker.cc b/chromium/ui/latency/average_lag_tracker.cc index 4c8c7ef82b0..347b32d3050 100644 --- a/chromium/ui/latency/average_lag_tracker.cc +++ b/chromium/ui/latency/average_lag_tracker.cc @@ -26,78 +26,10 @@ void AverageLagTracker::AddLatencyInFrame( return; if (scroll_name == "ScrollBegin") { - // Flush all unfinished frames. - while (!frame_lag_infos_.empty()) { - frame_lag_infos_.front().lag_area += LagForUnfinishedFrame( - frame_lag_infos_.front().rendered_accumulated_delta); - frame_lag_infos_.front().lag_area_no_prediction += LagForUnfinishedFrame( - frame_lag_infos_.front().rendered_accumulated_delta_no_prediction); - - // Record UMA when it's the last item in queue. - CalculateAndReportAverageLagUma(frame_lag_infos_.size() == 1); - } - // |accumulated_lag_| should be cleared/reset. - DCHECK(accumulated_lag_ == 0); - - // Create ScrollBegin report, with report time equals to gpu swap time. - LagAreaInFrame first_frame(gpu_swap_begin_timestamp); - frame_lag_infos_.push_back(first_frame); - - // Reset fields. - last_reported_time_ = event_timestamp; - last_finished_frame_time_ = event_timestamp; - last_event_accumulated_delta_ = 0; - last_rendered_accumulated_delta_ = 0; - is_begin_ = true; + AddScrollBeginInFrame(gpu_swap_begin_timestamp, event_timestamp); } else if (scroll_name == "ScrollUpdate" && !last_event_timestamp_.is_null()) { - // Only accept events in nondecreasing order. - if ((event_timestamp - last_event_timestamp_).InMilliseconds() < 0) - return; - - // Pop all frames where frame_time <= event_timestamp. - while (!frame_lag_infos_.empty() && - frame_lag_infos_.front().frame_time <= event_timestamp) { - base::TimeTicks front_time = - std::max(last_event_timestamp_, last_finished_frame_time_); - base::TimeTicks back_time = frame_lag_infos_.front().frame_time; - frame_lag_infos_.front().lag_area += - LagBetween(front_time, back_time, latency, event_timestamp, - frame_lag_infos_.front().rendered_accumulated_delta); - frame_lag_infos_.front().lag_area_no_prediction += LagBetween( - front_time, back_time, latency, event_timestamp, - frame_lag_infos_.front().rendered_accumulated_delta_no_prediction); - - CalculateAndReportAverageLagUma(); - } - - // Initialize a new LagAreaInFrame when current_frame_time > frame_time. - if (frame_lag_infos_.empty() || - gpu_swap_begin_timestamp > frame_lag_infos_.back().frame_time) { - LagAreaInFrame new_frame(gpu_swap_begin_timestamp, - last_rendered_accumulated_delta_, - last_event_accumulated_delta_); - frame_lag_infos_.push_back(new_frame); - } - - // last_frame_time <= event_timestamp < frame_time - if (!frame_lag_infos_.empty()) { - // The front element in queue (if any) must satisfy frame_time > - // event_timestamp, otherwise it would be popped in the while loop. - DCHECK(last_finished_frame_time_ <= event_timestamp && - event_timestamp <= frame_lag_infos_.front().frame_time); - base::TimeTicks front_time = - std::max(last_finished_frame_time_, last_event_timestamp_); - base::TimeTicks back_time = event_timestamp; - - frame_lag_infos_.front().lag_area += - LagBetween(front_time, back_time, latency, event_timestamp, - frame_lag_infos_.front().rendered_accumulated_delta); - - frame_lag_infos_.front().lag_area_no_prediction += LagBetween( - front_time, back_time, latency, event_timestamp, - frame_lag_infos_.front().rendered_accumulated_delta_no_prediction); - } + AddScrollUpdateInFrame(latency, gpu_swap_begin_timestamp, event_timestamp); } last_event_timestamp_ = event_timestamp; @@ -105,6 +37,87 @@ void AverageLagTracker::AddLatencyInFrame( last_rendered_accumulated_delta_ += latency.predicted_scroll_update_delta(); } +void AverageLagTracker::AddScrollBeginInFrame( + base::TimeTicks gpu_swap_begin_timestamp, + base::TimeTicks event_timestamp) { + // Flush all unfinished frames. + while (!frame_lag_infos_.empty()) { + frame_lag_infos_.front().lag_area += LagForUnfinishedFrame( + frame_lag_infos_.front().rendered_accumulated_delta); + frame_lag_infos_.front().lag_area_no_prediction += LagForUnfinishedFrame( + frame_lag_infos_.front().rendered_accumulated_delta_no_prediction); + + // Record UMA when it's the last item in queue. + CalculateAndReportAverageLagUma(frame_lag_infos_.size() == 1); + } + // |accumulated_lag_| should be cleared/reset. + DCHECK(accumulated_lag_ == 0); + + // Create ScrollBegin report, with report time equals to gpu swap time. + LagAreaInFrame first_frame(gpu_swap_begin_timestamp); + frame_lag_infos_.push_back(first_frame); + + // Reset fields. + last_reported_time_ = event_timestamp; + last_finished_frame_time_ = event_timestamp; + last_event_accumulated_delta_ = 0; + last_rendered_accumulated_delta_ = 0; + is_begin_ = true; +} + +void AverageLagTracker::AddScrollUpdateInFrame( + const LatencyInfo& latency, + base::TimeTicks gpu_swap_begin_timestamp, + base::TimeTicks event_timestamp) { + // Only accept events in nondecreasing order. + if ((event_timestamp - last_event_timestamp_).InMilliseconds() < 0) + return; + + // Pop all frames where frame_time <= event_timestamp. + while (!frame_lag_infos_.empty() && + frame_lag_infos_.front().frame_time <= event_timestamp) { + base::TimeTicks front_time = + std::max(last_event_timestamp_, last_finished_frame_time_); + base::TimeTicks back_time = frame_lag_infos_.front().frame_time; + frame_lag_infos_.front().lag_area += + LagBetween(front_time, back_time, latency, event_timestamp, + frame_lag_infos_.front().rendered_accumulated_delta); + frame_lag_infos_.front().lag_area_no_prediction += LagBetween( + front_time, back_time, latency, event_timestamp, + frame_lag_infos_.front().rendered_accumulated_delta_no_prediction); + + CalculateAndReportAverageLagUma(); + } + + // Initialize a new LagAreaInFrame when current_frame_time > frame_time. + if (frame_lag_infos_.empty() || + gpu_swap_begin_timestamp > frame_lag_infos_.back().frame_time) { + LagAreaInFrame new_frame(gpu_swap_begin_timestamp, + last_rendered_accumulated_delta_, + last_event_accumulated_delta_); + frame_lag_infos_.push_back(new_frame); + } + + // last_frame_time <= event_timestamp < frame_time + if (!frame_lag_infos_.empty()) { + // The front element in queue (if any) must satisfy frame_time > + // event_timestamp, otherwise it would be popped in the while loop. + DCHECK(last_finished_frame_time_ <= event_timestamp && + event_timestamp <= frame_lag_infos_.front().frame_time); + base::TimeTicks front_time = + std::max(last_finished_frame_time_, last_event_timestamp_); + base::TimeTicks back_time = event_timestamp; + + frame_lag_infos_.front().lag_area += + LagBetween(front_time, back_time, latency, event_timestamp, + frame_lag_infos_.front().rendered_accumulated_delta); + + frame_lag_infos_.front().lag_area_no_prediction += LagBetween( + front_time, back_time, latency, event_timestamp, + frame_lag_infos_.front().rendered_accumulated_delta_no_prediction); + } +} + float AverageLagTracker::LagBetween(base::TimeTicks front_time, base::TimeTicks back_time, const LatencyInfo& latency, |