From 12827e8873c7bd7e04f85214c787ffbc89d6492f Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Thu, 22 Nov 2018 11:45:00 +0000 Subject: [PATCH] ecore_evas - fix aninmator based frame render ticking to full framerate so i was seeing ecore evas only rendering every 2nd frame... this is because it was adding and deleting animatiors every time it rendered instead of keeping one around as lon as updates where there to render and then remove it afterwards. this caused nasty timing problems and thus problems assessing framerate of rendered content etc. etc. ... not good. this fixes that. this only happened if you only used pure legacy ecore animators. if you used the efl animator tick events it worked right. @fix --- src/lib/ecore_evas/ecore_evas.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index f63463ad3e..109b5ef79a 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -120,9 +120,6 @@ _ecore_evas_animator(void *data, const Efl_Event *ev EINA_UNUSED) Ecore_Evas *ee = data; ee->animator_ticked = EINA_TRUE; - - efl_event_callback_del(ee->evas, EFL_EVENT_ANIMATOR_TICK, _ecore_evas_animator, ee); - ee->animator_registered = EINA_FALSE; } static Eina_Bool @@ -308,6 +305,11 @@ _ecore_evas_idle_enter(void *data EINA_UNUSED) if (ee->engine.func->fn_evas_changed) ee->engine.func->fn_evas_changed(ee, change); + if (!change) + { + efl_event_callback_del(ee->evas, EFL_EVENT_ANIMATOR_TICK, _ecore_evas_animator, ee); + ee->animator_registered = EINA_FALSE; + } #ifdef ECORE_EVAS_ASYNC_RENDER_DEBUG if ((ee->in_async_render) && (ee->async_render_start <= 0.0)) { @@ -3284,7 +3286,10 @@ _ticking_start(Ecore_Evas *ee) { // Backend doesn't support per window vsync, fallback to generic support if (ee->animator_count++ > 0) return; - ee->anim = ecore_animator_add(_ecore_evas_animator_fallback, ee); + if (!ee->anim) + { + ee->anim = ecore_animator_add(_ecore_evas_animator_fallback, ee); + } } } @@ -3304,8 +3309,11 @@ _ticking_stop(Ecore_Evas *ee) { // Backend doesn't support per window vsync, fallback to generic support if (--ee->animator_count > 0) return; - ecore_animator_del(ee->anim); - ee->anim = NULL; + if (ee->anim) + { + ecore_animator_del(ee->anim); + ee->anim = NULL; + } } }