forked from AuroraMiddleware/gtk
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
This commit is contained in:
parent
8f64e4a8e3
commit
f27dd21426
@ -416,12 +416,18 @@ _gdk_frame_clock_begin_frame (GdkFrameClock *frame_clock)
|
||||
priv->frame_counter++;
|
||||
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)
|
||||
priv->n_timings++;
|
||||
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);
|
||||
}
|
||||
|
@ -111,7 +111,9 @@ void _gdk_frame_clock_begin_frame (GdkFrameClock *clock);
|
||||
void _gdk_frame_clock_debug_print_timings (GdkFrameClock *clock,
|
||||
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_before_paint (GdkFrameClock *frame_clock);
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "gdkframeclockprivate.h"
|
||||
|
||||
/**
|
||||
@ -48,6 +50,21 @@ _gdk_frame_timings_new (gint64 frame_counter)
|
||||
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:
|
||||
* @timings: a #GdkFrameTimings
|
||||
|
Loading…
Reference in New Issue
Block a user