#ifndef CC_METRICS_PREDICTOR_JANK_TRACKER_H_
#define CC_METRICS_PREDICTOR_JANK_TRACKER_H_
#include <optional>
#include "base/time/time.h"
#include "cc/cc_export.h"
#include "cc/metrics/event_metrics.h"
#include "cc/metrics/scroll_jank_ukm_reporter.h"
namespace cc {
class CC_EXPORT PredictorJankTracker {
public:
PredictorJankTracker();
~PredictorJankTracker();
PredictorJankTracker(const PredictorJankTracker&) = delete;
PredictorJankTracker& operator=(const PredictorJankTracker);
void ReportLatestScrollDelta(float delta,
base::TimeTicks presentation_ts,
base::TimeDelta vsync_interval,
std::optional<EventMetrics::TraceId> trace_id);
void ResetCurrentScrollReporting();
void set_scroll_jank_ukm_reporter(
ScrollJankUkmReporter* scroll_jank_ukm_reporter) {
scroll_jank_ukm_reporter_ = scroll_jank_ukm_reporter;
}
static float GetSlowScrollDeltaThreshold();
static float GetSlowScrollJankyThreshold();
static float GetFastScrollJankyThreshold();
private:
void StoreLatestFrameData(float delta,
base::TimeTicks presentation_ts,
std::optional<EventMetrics::TraceId> trace_id);
void ReportJankyFrame(float next_delta,
float janky_value,
bool contains_missed_vsyncs,
bool slow_scroll,
std::optional<EventMetrics::TraceId> trace_id);
bool ContainsMissedVSync(base::TimeTicks& presentation_ts,
base::TimeDelta& vsync_interval);
void ReportJankyFramePercentage();
struct FrameData {
float prev_delta_ = 0;
std::optional<EventMetrics::TraceId> prev_trace_id_;
float cur_delta_ = 0;
std::optional<EventMetrics::TraceId> cur_trace_id_;
base::TimeTicks prev_presentation_ts_;
base::TimeTicks cur_presentation_ts_;
} frame_data_;
float total_frames_ = 0;
float janky_frames_ = 0;
raw_ptr<ScrollJankUkmReporter> scroll_jank_ukm_reporter_ = nullptr;
};
}
#endif