Animation Engine: speed tips
Alex Tweedly
alex at tweedly.net
Tue Jun 30 21:40:56 EDT 2020
Hi David,
I had a quick look at this (for slightly selfish reasons - I will be
doing some simple animation soon, so this piqued my interest to look at
it sooner :-)
[ all comments on performance or timing here are on an aging (2011)
Macbook Pro, LC 9.6.0 ]
So, there's good news, and there's bad news :-)
1. Bad news.
It is slow (surprisingly, disappointingly slow) to move graphic objects
in LC. Moving small simple objects (unfilled circle graphics <20 pixels
across) over an uncomplicated background. Each move takes between 1 and
2.6 msecs. (Yes, that's for one object !!)
[ Puts on 'grumpy old man' hat = that's about the same time as it took
on my old Atari ST - 34 years ago!! Where's Moore's Law when I need it
:-). ]
2. Good news.
Although disappointing performance, it is (probably) good enough for
your described example. Around 30 simple, small objects moving, 20 fps
~= 700ms within a second; it should just be doable.
3. Bad News.
You're on the edge !! The timings above were for moving objects in a
simple, tight loop. (see sample code below my sig.) You have a little
bit of spare CPU left over to handle overhead, object management, new
co-ord calculation, etc., but not very much.
Animation Engine.
It's a powerful library - has lots of good stuff to do fading, morphing,
collision detection, input constraint, color changes, animated scrolls
(bounce, overshoot, ...), and then it has two methods of just *moving*
LC controls.
The 'classic' version requires the developer to set up a timer/loop
handler, and use the various aeMovexxx handlers; because of the timer
handling it's tricky and needs care from the developer.
The other version is only for straight line moves (aeMoveTo); this is
much simpler to use, can handle multiple shapes moving in synch and does
it very efficiently. (The older equivalent was aeMoveLinear, which is
deprecated). If all your moving is (or can be cast into) using this
version, you might have no problems. Note Malte describes aeMoveTo as
'frame-perfect' - all the moves done by aeMoveTo happen perfectly
aligned by the (single) frame timer, so moves can be precisely
coordindated to start and/or finish at exactly the same time.
If it can't be, then you might think about adding new functionality to
AE to provide a similar capability , using the same single timer that
aeMoveTo uses.
My needs are slightly different:-
1. linear and "hop" moves only (*)
2. need to string together multiple moves within a 'frame-perfect' setting
btw - this 'stringing together' is exactly what you would need for
hand-drawn curve following; you'd form a points-list from the
hand-drawing, then construct a series of linear moves along each edge.
I decided the easiest way to achieve what I need was a simple
purpose-specific library, that has just these features. It's simple to
use, understand and debug - currently < 200 lines, and likely to finish
up around 250 lines by the time I'm done adding features.
(*) What's a "hop" move?
Think of a child's board game (Ludo, S&Ladders, ...) When you move a
piece, you don't (if you're playing with a child) usually just pick it
up and move it (say) 5 squares, instead you go "...1...2...3...4...5",
while touching the piece in or near each square in turn. That's a hop
move (or a series of hop-moves. :-)
Anyway - I have that working now, so with luck I'll get a chance to work
on it this week and get it tidied up, and release a first version by the
weekend, so if you (or anyone) is interested they can try it out.
Alex.
Simple benchmark:
I finished up with a pretty trivial example bit of code:
> put the loc of grc "g1" into tmp
> repeat 100 times
> add 1 to item 1 of tmp
> set the loc of grc "g1" to tmp
> wait 0 with messages
> end repeat
Notes:
0. Graphic "g1" is a simple, small circle.
1. if the graphic wanders off screen (out of window) the time taken
drops to 0.
2. If you remove the "add 1 to item 1 of tmp" (i.e. the graphic remains
in the same place), then again the time drops to effectively 0.
So with this simple code, I find that (on my aging Macbook Pro), those
100 moves take between 125 and 275 ms (i.e. just about 1 to 2.5 ms per
shape to move). And that variation is easily matched against the
complexity of the surroundings the piece is moving through - if it moves
over (or under) many other graphic objects, it takes clearly longer.
Good luck.
On 28/06/2020 01:09, David Bovill via use-livecode wrote:
> I made a quick test - creating and animating small graphic circles along a complex curve with many points. It works fine with one or two animated spheres but I’d like to be able to animate >30 and it slows to a crawl after 4 or 5. I tried setting the layer mode appropriately for all the objects - but I’m doing this on a new MacBook Pro - and it does not make a difference.
>
> Does anyone have an example stack with multiple animated objects that I can compare / test for speed?
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
More information about the use-livecode
mailing list