ecore_evas - fix aninmator based frame render ticking to full framerate
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Thu, 22 Nov 2018 11:45:00 +0000 (11:45 +0000)
committerHermet Park <hermetpark@gmail.com>
Wed, 5 Dec 2018 05:52:40 +0000 (14:52 +0900)
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

index 5520f4a..e0846a3 100644 (file)
@@ -129,9 +129,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
@@ -338,6 +335,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))
           {
@@ -3461,7 +3463,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);
+         }
     }
 }
 
@@ -3481,8 +3486,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;
+          }
      }
 }