clutter/frame-clock: Add dispatch jitter to frame timing measurements

Dispatch jitter is how much the dispatch interval has changed between
frames. It's a measure of sampling smoothness for events that are occurring
at a higher rate than the screen is refreshing:

 * Mouse movement
 * Clients rendering at swap interval zero
 * Keyframe animation position

Zero jitter is ideal but will practically never happen, and a jitter value
of several thousand microseconds will be visible to the naked eye as stutter
even if you're maintaining a perfect frame rate.

To make the numbers easier to interpret we also log the jitter as a
percentage of the refresh interval.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3082>
This commit is contained in:
Daniel van Vugt 2023-06-20 16:29:24 +08:00 committed by Marge Bot
parent be0aa2976e
commit e7a210d963

View File

@ -116,6 +116,8 @@ struct _ClutterFrameClock
int n_missed_frames; int n_missed_frames;
int64_t missed_frame_report_time_us; int64_t missed_frame_report_time_us;
int64_t last_dispatch_interval_us;
}; };
G_DEFINE_TYPE (ClutterFrameClock, clutter_frame_clock, G_DEFINE_TYPE (ClutterFrameClock, clutter_frame_clock,
@ -767,6 +769,19 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock,
MAX (frame_clock->shortterm.max_dispatch_lateness_us, MAX (frame_clock->shortterm.max_dispatch_lateness_us,
frame_clock->last_dispatch_lateness_us); frame_clock->last_dispatch_lateness_us);
if (G_UNLIKELY (CLUTTER_HAS_DEBUG (FRAME_TIMINGS)))
{
int64_t dispatch_interval_us, jitter_us;
dispatch_interval_us = time_us - frame_clock->last_dispatch_time_us;
jitter_us = llabs (dispatch_interval_us -
frame_clock->last_dispatch_interval_us);
frame_clock->last_dispatch_interval_us = dispatch_interval_us;
CLUTTER_NOTE (FRAME_TIMINGS, "dispatch jitter %5ldµs (%3ld%%)",
jitter_us,
jitter_us * 100 / frame_clock->refresh_interval_us);
}
frame_clock->last_dispatch_time_us = time_us; frame_clock->last_dispatch_time_us = time_us;
g_source_set_ready_time (frame_clock->source, -1); g_source_set_ready_time (frame_clock->source, -1);