INCLUDE PERFETTO MODULE chrome.chrome_scrolls;
INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
INCLUDE PERFETTO MODULE chrome.event_latency;
CREATE PERFETTO TABLE chrome_janky_event_latencies_v3 (
id LONG,
ts TIMESTAMP,
dur DURATION,
track_id LONG,
name STRING,
cause_of_jank STRING,
sub_cause_of_jank STRING,
delayed_frame_count LONG,
frame_jank_ts TIMESTAMP,
frame_jank_dur LONG
) AS
SELECT
s.id,
s.ts,
s.dur,
s.track_id,
s.name,
e.cause_of_jank,
e.sub_cause_of_jank,
cast_int!((e.delay_since_last_frame/e.vsync_interval) - 1) AS delayed_frame_count,
cast_int!(s.ts + s.dur - ((e.delay_since_last_frame - e.vsync_interval) * 1e6)) AS frame_jank_ts,
cast_int!((e.delay_since_last_frame - e.vsync_interval) * 1e6) AS frame_jank_dur
FROM chrome_gesture_scroll_updates AS s
JOIN chrome_janky_frames AS e
ON s.id = e.event_latency_id;
CREATE PERFETTO VIEW chrome_janky_frame_presentation_intervals (
id LONG,
ts TIMESTAMP,
dur DURATION,
delayed_frame_count LONG,
cause_of_jank STRING,
sub_cause_of_jank STRING,
event_latency_id LONG
) AS
SELECT
row_number() OVER (ORDER BY frame_jank_ts) AS id,
frame_jank_ts AS ts,
frame_jank_dur AS dur,
delayed_frame_count,
cause_of_jank,
sub_cause_of_jank,
id AS event_latency_id
FROM chrome_janky_event_latencies_v3;
CREATE PERFETTO TABLE chrome_scroll_stats (
scroll_id LONG,
frame_count LONG,
missed_vsyncs LONG,
presented_frame_count LONG,
janky_frame_count LONG,
janky_frame_percent DOUBLE
) AS
WITH
vsyncs AS (
SELECT
count() AS presented_vsync_count,
scroll.id AS scroll_id
FROM chrome_unique_frame_presentation_ts AS frame
JOIN chrome_scrolls AS scroll
ON frame.presentation_timestamp >= scroll.ts
AND frame.presentation_timestamp <= scroll.ts + scroll.dur
GROUP BY
scroll_id
),
missed_vsyncs AS (
SELECT
cast_int!(SUM((delay_since_last_frame / vsync_interval) - 1)) AS total_missed_vsyncs,
scroll_id
FROM chrome_janky_frames
GROUP BY
scroll_id
),
frame_stats AS (
SELECT
scroll_id,
num_frames AS presented_frame_count,
coalesce(num_janky_frames, 0) AS janky_frame_count,
round(coalesce(scroll_jank_percentage, 0), 2) AS janky_frame_percent
FROM chrome_frames_per_scroll
)
SELECT
vsyncs.scroll_id,
presented_vsync_count + coalesce(total_missed_vsyncs, 0) AS frame_count,
total_missed_vsyncs AS missed_vsyncs,
presented_frame_count,
janky_frame_count,
janky_frame_percent
FROM vsyncs
LEFT JOIN missed_vsyncs
USING (scroll_id)
LEFT JOIN frame_stats
USING (scroll_id);
CREATE PERFETTO TABLE chrome_scroll_jank_intervals_v3 (
id LONG,
ts TIMESTAMP,
dur DURATION
) AS
WITH
janky_latencies AS (
SELECT
s.frame_jank_ts AS start_ts,
s.frame_jank_ts + s.frame_jank_dur AS end_ts
FROM chrome_janky_event_latencies_v3 AS s
),
ordered_jank_end_ts AS (
SELECT
*,
max(end_ts) OVER (ORDER BY start_ts ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS max_end_ts_so_far
FROM janky_latencies
),
range_starts AS (
SELECT
*,
CASE
WHEN start_ts <= 1 + lag(max_end_ts_so_far) OVER (ORDER BY start_ts)
THEN 0
ELSE 1
END AS range_start
FROM ordered_jank_end_ts
),
range_groups AS (
SELECT
*,
sum(range_start) OVER (ORDER BY start_ts) AS range_group
FROM range_starts
)
SELECT
range_group AS id,
min(start_ts) AS ts,
max(end_ts) - min(start_ts) AS dur
FROM range_groups
GROUP BY
range_group;