From 0e902ffffe50587fcd5012c84ac57028857ed00c Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Sun, 8 Dec 2013 15:07:40 +0900 Subject: [PATCH] ecore evas - add animator update syncing to only render on animator ticks this adds a ifdefable feature to sync rendering only to animator slots. this should reduce over-render of more frames than a user can see when updates are triggered by things like mouse movements (which may come in many times faster than the framerate). this is an experiment to see if this helps smoothness and load. it also has problems in e grabs x while rendering - this is now fixed in e18 alreadey, but it is just a config you can turn off. --- src/lib/ecore_evas/ecore_evas.c | 46 ++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index 771e7dc839..db2ada75e8 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -43,6 +43,28 @@ static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL; static Ecore_Evas *ecore_evases = NULL; static int _ecore_evas_fps_debug = 0; +#define RENDER_SYNC 1 + +#ifdef RENDER_SYNC +static Ecore_Animator *ecore_evas_animator = NULL; +static Eina_Bool ecore_evas_animator_ticked = EINA_FALSE; +static Eina_Bool ecore_evas_first = EINA_TRUE; +static int overtick = 0; + +static Eina_Bool +_ecore_evas_animator(void *data EINA_UNUSED) +{ + ecore_evas_animator_ticked = EINA_TRUE; + overtick--; + if (overtick == 0) + { + ecore_evas_animator = NULL; + return EINA_FALSE; + } + return EINA_TRUE; +} +#endif + static Eina_Bool _ecore_evas_idle_enter(void *data EINA_UNUSED) { @@ -55,6 +77,25 @@ _ecore_evas_idle_enter(void *data EINA_UNUSED) #endif if (!ecore_evases) return ECORE_CALLBACK_RENEW; + +#ifdef RENDER_SYNC + if (!ecore_evas_first) + { + if ((!ecore_evas_animator_ticked) && + (!ecore_main_loop_animator_ticked_get())) + { + if (!ecore_evas_animator) + { + overtick = 1; + ecore_evas_animator = ecore_animator_add(_ecore_evas_animator, NULL); + } + return ECORE_CALLBACK_RENEW; + } + ecore_evas_animator_ticked = EINA_FALSE; + } + ecore_evas_first = EINA_FALSE; +#endif + if (_ecore_evas_fps_debug) { t1 = ecore_time_get(); @@ -351,7 +392,10 @@ ecore_evas_shutdown(void) if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown(); ecore_idle_enterer_del(ecore_evas_idle_enterer); ecore_evas_idle_enterer = NULL; - +#ifdef RENDER_SYNC + if (ecore_evas_animator) ecore_animator_del(ecore_evas_animator); + ecore_evas_animator = NULL; +#endif #ifdef BUILD_ECORE_EVAS_EWS while (_ecore_evas_ews_shutdown()); #endif