Commit f27dd214 authored by Christian Hergert's avatar Christian Hergert Committed by Matthias Clasen

frametimings: reuse previous frame timing in common case

Typically, there won't be any references on old frame timings except for
the most recent timing. So instead of discarding these and re-entering
gslice twice, just steal the old frame timing and reuse it.

https://bugzilla.gnome.org/show_bug.cgi?id=765592
parent 8f64e4a8
...@@ -416,12 +416,18 @@ _gdk_frame_clock_begin_frame (GdkFrameClock *frame_clock) ...@@ -416,12 +416,18 @@ _gdk_frame_clock_begin_frame (GdkFrameClock *frame_clock)
priv->frame_counter++; priv->frame_counter++;
priv->current = (priv->current + 1) % FRAME_HISTORY_MAX_LENGTH; priv->current = (priv->current + 1) % FRAME_HISTORY_MAX_LENGTH;
/* Try to steal the previous frame timing instead of discarding
* and allocating a new one.
*/
if G_LIKELY (priv->n_timings == FRAME_HISTORY_MAX_LENGTH &&
_gdk_frame_timings_steal (priv->timings[priv->current],
priv->frame_counter))
return;
if (priv->n_timings < FRAME_HISTORY_MAX_LENGTH) if (priv->n_timings < FRAME_HISTORY_MAX_LENGTH)
priv->n_timings++; priv->n_timings++;
else else
{ gdk_frame_timings_unref(priv->timings[priv->current]);
gdk_frame_timings_unref(priv->timings[priv->current]);
}
priv->timings[priv->current] = _gdk_frame_timings_new (priv->frame_counter); priv->timings[priv->current] = _gdk_frame_timings_new (priv->frame_counter);
} }
......
...@@ -111,7 +111,9 @@ void _gdk_frame_clock_begin_frame (GdkFrameClock *clock); ...@@ -111,7 +111,9 @@ void _gdk_frame_clock_begin_frame (GdkFrameClock *clock);
void _gdk_frame_clock_debug_print_timings (GdkFrameClock *clock, void _gdk_frame_clock_debug_print_timings (GdkFrameClock *clock,
GdkFrameTimings *timings); GdkFrameTimings *timings);
GdkFrameTimings *_gdk_frame_timings_new (gint64 frame_counter); GdkFrameTimings *_gdk_frame_timings_new (gint64 frame_counter);
gboolean _gdk_frame_timings_steal (GdkFrameTimings *timings,
gint64 frame_counter);
void _gdk_frame_clock_emit_flush_events (GdkFrameClock *frame_clock); void _gdk_frame_clock_emit_flush_events (GdkFrameClock *frame_clock);
void _gdk_frame_clock_emit_before_paint (GdkFrameClock *frame_clock); void _gdk_frame_clock_emit_before_paint (GdkFrameClock *frame_clock);
......
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
#include "config.h" #include "config.h"
#include <string.h>
#include "gdkframeclockprivate.h" #include "gdkframeclockprivate.h"
/** /**
...@@ -48,6 +50,21 @@ _gdk_frame_timings_new (gint64 frame_counter) ...@@ -48,6 +50,21 @@ _gdk_frame_timings_new (gint64 frame_counter)
return timings; return timings;
} }
gboolean
_gdk_frame_timings_steal (GdkFrameTimings *timings,
gint64 frame_counter)
{
if (timings->ref_count == 1)
{
memset (timings, 0, sizeof *timings);
timings->ref_count = 1;
timings->frame_counter = frame_counter;
return TRUE;
}
return FALSE;
}
/** /**
* gdk_frame_timings_ref: * gdk_frame_timings_ref:
* @timings: a #GdkFrameTimings * @timings: a #GdkFrameTimings
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment