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:
		
				
					committed by
					
						
						Matthias Clasen
					
				
			
			
				
	
			
			
			
						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
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user