evas - fix pending object set tracking to not multi-add the same object

flag if obj in pending array and don't add if already there. fixes
run-away slowness in rendering in some cases
This commit is contained in:
Marcel Hollerbach 2018-10-29 21:50:45 +01:00 committed by Carsten Haitzler (Rasterman)
parent 014bbb888e
commit 47e6bbb397
2 changed files with 9 additions and 3 deletions

View File

@ -752,6 +752,7 @@ _evas_render_phase1_object_restack_handle(Phase1_Context *p1ctx,
{
OBJ_ARRAY_PUSH(&(p1ctx->e->pending_objects), obj);
obj->changed = EINA_TRUE;
obj->in_pending_objects = EINA_TRUE;
}
obj->restack = EINA_TRUE;
}
@ -1353,7 +1354,9 @@ pending_change(void *data, void *gdata EINA_UNUSED)
}
//FIXME: after evas_object_change_reset(), obj->changed is always false...
return obj->changed ? EINA_TRUE : EINA_FALSE;
Eina_Bool val = obj->changed ? EINA_TRUE : EINA_FALSE;
obj->in_pending_objects = val;
return val;
}
static Eina_Bool
@ -3636,6 +3639,7 @@ evas_render_updates_internal(Evas *eo_e,
EFL_CANVAS_OBJECT_CLASS);
evas_object_change(obj->smart.parent, smart_parent);
}
obj->changed = EINA_TRUE;
}
eina_evlog("-render_post_change", eo_e, 0.0, NULL);
@ -4161,8 +4165,9 @@ evas_render_object_recalc(Evas_Object_Protected_Data *obj)
e = obj->layer->evas;
if ((!e) || (e->cleanup)) return;
OBJ_ARRAY_PUSH(&e->pending_objects, obj);
obj->changed = EINA_TRUE;
if (!obj->in_pending_objects)
OBJ_ARRAY_PUSH(&e->pending_objects, obj);
obj->in_pending_objects = obj->changed = EINA_TRUE;
}
}

View File

@ -1146,6 +1146,7 @@ struct _Evas_Object_Protected_Data
Eina_Bool is_active : 1;
Eina_Bool changed : 1;
Eina_Bool in_pending_objects : 1;
Eina_Bool restack : 1;
Eina_Bool is_smart : 1;
Eina_Bool is_event_parent : 1;