Voici un résumé de quelques techniques pour optimiser votre code actionscript3. Les gains de performances sont réels et peuvent facilement être constatés sur les gros projets.
1. Autant que possible, ne pas utiliser d'objets dynamiques comme les MovieClip, Object, et autres qui sont beaucoup plus long à parser pour Flash. Si vous utilisez des MovieClip provenant de la librairie, et n'utilisant pas leur timeline, utilisez une fonction qui récupère leur childs et les place dans un nouveau Sprite par exemple.
En ce qui concerne les objets, préférez un type le plus strict possible :
Déconseillé :
for (var i:int=0;i<n;i++) { var v: Object = new Object; v.x = 1; v.y = 2; v.z = 3; }
Conseillé:
class Vector3D { public var x: Number; public var y: Number; public var z: Number; } for (;i<n;i++) { var v: Vector3D = new Vector3D; v.x = 1; v.y = 2; v.z = 3; }
De la même manière, si le type de contenu à stocker est toujours le même, ne pas utiliser Array, mais Vector.<type>()
Cette technique est 10 fois plus rapide.
Déconseillé :
var sum:Number = 0; var len:int = array.length; for(var i:int = 0; i < len; i++) { sum += array[i]; };
Conseillé :
var sum:Number = 0; var len:int = vector.length; for(var i:int = 0; i < len; i++) { sum += vector[i]; };
2. Toujours typer vos objets, même dans les boucles, ainsi le player n'aura pas à chercher quel est le type de contenu avant de l'utiliser :
Déconseillé :
for (;i<n;i++) array[i].x = 2;
Conseillé :
for (;i<n;i++) Vector3D(array[i]).x = 2;
3. Réutiliser les instances de classes plutôt que d'en créer de nouvelles. Cette optimisation permet de donner d'une part moins de travail au garbage collector mais également d'économiser beaucoup de temps perdu en créer ces instances. Cette technique est 300 fois plus rapide.
Déconseillé :
for (;i<n;i++) p = new Point(i, i);
Conseillé :
for (;i<n;i++) { p.x = i; p.y = i; }
4. Ne pas utiliser de try catch autant que possible. Les calculs qui sont générés à l'intérieur sont très gourmands. Cette technique est 3000 fois plus rapide
Déconseillé :
var o: Sprite; for (;i<n;i++) { try { o.blendMode = BlendMode.ADD; } catch ( error: Error ) {} }
Conseillé :
var o: Sprite; for (;i<n;i++) if ( o != null ) o.blendMode = BlendMode.ADD;
La suite au prochain post !

