From cfc348d69c4045ecb8168cf69d391e69e1417745 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Wed, 19 Feb 2020 21:22:13 -0800 Subject: [PATCH] clutter/actor: avoid transform node for identity matrix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the transform matrix is an identity, then positioning wont change and we can avoid creating the transform node altogether. This is based on a similar find in GTK today while reducing temporary allocations. This cuts the number of transforms created in clutter_actor_paint() by about half under light testing of GNOME Shell from 6.8% to 2.4% of allocations. Before: ALLOCATED TOTAL FUNCTION [ 20.4 MiB] [ 21.20%] clutter_actor_paint [ 11.0 MiB] [ 11.45%] clutter_paint_node_paint [ 6.6 MiB] [ 6.84%] clutter_transform_node_new [ 2.5 MiB] [ 2.61%] clutter_actor_node_new After: ALLOCATED TOTAL FUNCTION [ 33.4 MiB] [ 24.12%] clutter_actor_paint [ 26.2 MiB] [ 18.91%] clutter_paint_node_paint [ 3.4 MiB] [ 2.43%] clutter_actor_node_new [ 3.3 MiB] [ 2.41%] clutter_transform_node_new Allocation amounts will have differed due to different amounts of running time, but the % of allocations has now dropped below clutter_actor_node_new() which should be expected. https://gitlab.gnome.org/GNOME/mutter/issues/1056 --- clutter/clutter/clutter-actor.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index 610741abc..163d30d43 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -3997,11 +3997,14 @@ clutter_actor_paint (ClutterActor *self, clutter_actor_get_transform (self, &transform); - transform_node = clutter_transform_node_new (&transform); - clutter_paint_node_add_child (transform_node, root_node); - clutter_paint_node_unref (root_node); + if (!cogl_matrix_is_identity (&transform)) + { + transform_node = clutter_transform_node_new (&transform); + clutter_paint_node_add_child (transform_node, root_node); + clutter_paint_node_unref (root_node); - root_node = g_steal_pointer (&transform_node); + root_node = g_steal_pointer (&transform_node); + } #ifdef CLUTTER_ENABLE_DEBUG /* Catch when out-of-band transforms have been made by actors not as part