Actionscript optimizations tutorial
[ January 27, 2004 ] by Marco Lapi, a.k.a Lapo
In this article we discuss many different ways of optimizing your actionscript code. Also we've run a set of benchmarks to test typical game code bits and see how to squeeze the best performance out of the flash player.


10) Nested loops (for vs. while)
Nested loops are a common programming technique to access 2 dimensional data, like map arrays in a tile based game, etc...
As you may expect from the previous tests the while loop performs better.


11) TellTarget vs. dot syntax
If you started out with Flash before version 5, you will remember the way TellTarget
was used to command moviclips.
Well, even if it was deprecated by Flash 5 and subsequent versions in favor of the more elegant “dot syntax”, it looks like the old fashioned Tell Target does his job better than anyone else. So you may consider “downgrading” some of you scripts to achieve an extra bit of speed.

Check this code snippet:

MAX = 10000
mc = _root.createEmptyMovieClip("test", 1000)

function test_dot()
{
	var i=MAX
	while(--i > -1)
	{
		mc._x = 10
		mc._y = 10
	}

}

function test_tellTarget()
{
	var i=MAX
	while(--i > -1)
	{
		tellTarget(mc)
		{
			_x = 10
			_y = 10
		}
	}
	
}

12) Accessing local vars (This vs. With vs. Reference)
Local variables and objects can be referenced in more than one way.
We've tested two ways to do it and found out that the usage of the keyword this produces the worst results.
More speed can be achieved using with operator.
The following code was used as a test, running a 10000 iteration loop

obj = {}
obj.a = 1
obj.b = 2
obj.c = 3
obj.d = 4
obj.e = 5
obj.f = 6
obj.g = 7
obj.h = 8
obj.test1 = useThis

obj.test2 = useWith


MAX = 10000


function useThis()
{
	var i = MAX
	while(--i > -1)
	{
		this.a = 1
		this.b = 2
		this.c = 3
		this.d = 4
		this.e = 5
		this.f = 6
		this.g = 7
		this.h = 8
	}
}


function useWith()
{
	var i = MAX
	while(--i > -1)
	{
		with(this)
		{
			a = 1
			b = 2
			c = 3
			d = 4
			e = 5
			f = 6
			g = 7
			h = 8
		}
	}
}

13) Loop listening for pressed keys
Listening for key presses can be optimized the same way we did with the Math functions name lookup.
Instead of using if(Key.isDown(Key.LEFT)) every time it is much better to setup a series of references like this:

keyDown = Key.isDown 
keyLeft = Key.LEFT

and then use if (keyDown(keyLeft))
We also tested the usage of key code numbers instead of key code constants but differences are not significant.

14) Math.floor() vs int()
This tip was submitted by iopred in the Flashkit forums (http://www.flashkit.com/board/showthread.php?s=38baf94bb869a0376c6f599d8bf2685d&threadid=434875)
Instead of using the new Math library floor() function try the old-fashioned int()
Our benchmarks show a nice speed increase.

15) Eval vs. array access
We did not find significant performance boost using the eval() function over the
array-like indexing introduced by Flash MX.
In other words this code:

var mc = eval("_root.myMc" + i)

doesn't seem to be much faster than

var mc = _root["myMc" + i]

As you can see from our chart the difference is really small.

16) Looping through movieclips: ASBroadcaster vs. Loop
This test shows how the undocumented Flash MX ASBroadcaster object can help
in squeezing out some extra speed out of the flash player.
The benchmark creates 500 movieclips and then it tests how much time it is needed to remove them.
The looping version calls the removeMovieClip() on each mc while the ASBroadcaster version subscribes each clip to a custom event handler. When the event broadcaster dispatches the custom event all movicelips handle that event and this results in a much better performance.

This is the looping version:

MAX = 500
SX = 550
SY = 330

MovieClip.prototype.onCustomEvent = function()
{
	this.removeMovieClip()
}

function init()
{
	var i=MAX
	var rnd = Math.random
	while(--i > -1)
	{
		var m = _root.attachMovie("enemy","e"+i,i)
		m._x = rnd() * SX
		m._y = rnd() * SY 
	}
}

init()

function bench()
{
	var t = getTimer()
	var i=MAX
	while(--i > -1)
	{
		_root["e"+i].onCustomEvent()
	}
	res.text = "time: " + (getTimer() - t)
}

The same thing, using ASBroadcaster:


MAX = 500
evtManager = {}
ASBroadcaster.initialize(evtManager)

SX = 550
SY = 330

MovieClip.prototype.onCustomEvent = function()
{
	this.removeMovieClip()
}

function init()
{
	var i=MAX
	var rnd = Math.random
	while(--i > -1)
	{
		var m = _root.attachMovie("enemy","e"+i,i)
		m._x = rnd() * SX
		m._y = rnd() * SY 
		evtManager.addListener(m)
	}
}

init()

function bench()
{
	var t = getTimer()
	evtManager.broadcastMessage("onCustomEvent")
	res.text = "time: " + (getTimer() - t)
}
  

Compiling for flash player 6 using Flash MX 2004:
One of the interesting things with FMX 2004 is that the actionscript compiler has been improved under many aspects.
The new compiler does a better job with both global (player 6 and 7) and local register (player 7 only) making some of the tweaking presented here less important.

You can see by yourself, from our benchmark table, that some very interesting results were achieved.

The most noticeable improvements we noticed were that _global variables seems to be a lot faster than timeline variables and nested loops now perform way better than before.
Also you will notice that almost every test run faster than the Flash-MX compiled version.

Conclusions:
What we can learn from all these benchmarks is that by accurately choosing the right way to code certain time critical functions, we can greatly improve the flash player performance.
Although we've presented here a good number of optimization tips, there's much more for you to experiment with and more benchmarks could be created to show other ways of code tweaking.
We feel like the best approach is to isolate those very cpu-intense routines and try to apply as many of these advices as possible and also running your own tests for your specific problems.

If you wish you can furtherly discuss these topics in our forums by posting in this thread

Other code-optimization resources:

http://flasm.sourceforge.net/
Flasm is a nice utility that can compile and decompile actionscript in its assembler-like form, so you can directly manipulate the SWF
bytecode. It works also with Flash MX 2004.
On the website you can find optimization tips, an insight into flash byetcode and you can also download the Flash sourcecode.

The Flashkit Board Optimization thread
A very long thread discussing many actionscript optimization tips. A huge resource of examples!

Bit-101 Forum Optimizations Tips
Another interesting discussion about code tweaking.

OddHammer Tips
28 quick tips for optimizing yor AS code.


           
 
 
Name: Marco Lapi, a.k.a Lapo
Location: Fossano, Italy
Age: 34
Flash experience: started out with Flash 4 back in 1999
Job: web designer/developer
Website: http://www.gotoandplay.it/
 
 
| Homepage | News | Games | Articles | Multiplayer Central | Reviews | Spotlight | Forums | Info | Links | Contact us | Advertise | Credits |

| www.smartfoxserver.com | www.gotoandplay.biz | www.openspace-engine.com |

gotoAndPlay() v 3.0.0 -- (c)2003-2008 gotoAndPlay() Team -- P.IVA 03121770048