iconGrid: Create icon clones in a separate loop
For reasons not yet fully understood, Main.uiGroup.add_actor
takes around
10 milliseconds to complete.
Because of this, each actor.opacity = 0
has a good chance of falling
on a different frame. And when it does, _opacityChangedId
also lands
on multiple different frames each incurring a separate relayout cycle.
It is this excessive number of relayouts that causes stuttering in the
icon grid animation (#2065 (closed)). But it is the slowness of uiGroup.add_actor
that causes the number to be excessive when it should be one.
By creating the clones and adding them to uiGroup
early, we then enable
the existing loop starting the animation to complete within a single frame.
And by completing within a single frame all the opacity changes land within
the same frame interval, thus incurring only a single relayout instead of
many.
This issue went unnoticed until 004a5e10 (!704 (merged)), after which the slow
emissions of notify::opacity
became a more visible performance problem.
Closes: #2065 (closed)