Vous êtes sur la page 1sur 77

OPTIMISER LES PERFORMANCES POUR LA PLATEFORME ADOBE FLASH

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 1 / 77

Ce livret vous a t remis en complment du Programme AS3 Formation. Il vous est personnel et ne peut pas tre redistribu.

Si vous souhaitez partager directement l'adresse du site web, o j'explique en vido comment crer simplement une application flash robuste et volutive, visitez :
Tutoriels Vidos gratuits pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3

Livret de Formation
Ecrit par Matthieu Deloison Formateur ActionScript
Ce livret est un recueil de mes lectures sur diffrents blogs comme celui de Thibault Imbert (www.bytearray.org), celui de Grant Skinner (www.gskinner.com) et bien d'autres encore... J'ai mis en pratiques l'ensemble de ces conseils dans mes applications sur des projets professionnels et personnels. Ce sont des conseils pratiques et vrifis dans de "vraies applications flash".

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 2 / 77

Table des matires


OPTIMISER LES PERFORMANCES..........................................................................................1 POUR LA PLATEFORME............................................................................................................ 1 ADOBE FLASH............................................................................................................................ 1 INTRODUCTION.............................................................................................................................. 5 LOptimisation des Performances pour la Plateforme Adobe Flash..............................................5 LEXECUTION DU CODE................................................................................................................ 6 Les performances perues et les performances relles...............................................................7 Ciblez vos optimisations..............................................................................................................9 GERER LA MEMOIRE................................................................................................................... 11 Les Display Objects................................................................................................................... 11 Les types primitifs...................................................................................................................... 12 Rutiliser les objets.................................................................................................................... 14 Librer la mmoire..................................................................................................................... 19 UTILISATION DES BITMAPS........................................................................................................22 La qualit des Bitmaps............................................................................................................... 22 BitmapData single reference......................................................................................................24 Les filtres et le dchargement dynamique de bitmap.................................................................34 Utilisation des effets 3D............................................................................................................. 36 REDUIRE LUTILISATION DU CPU...............................................................................................38 Pause et reprise......................................................................................................................... 38 La gestion des instances........................................................................................................... 40 Le mode veille............................................................................................................................ 42 Cration et suppression des objets............................................................................................44 Les vnements Activate et deactivate......................................................................................48 LES PERFORMANCES ACTIONSCRIPT 3.0................................................................................50 L'API de dessin.......................................................................................................................... 50 La capture et diffusion d'vnements.........................................................................................51 Travailler avec les Pixels............................................................................................................ 55 OPTIMISATIONS PLUS FINES.....................................................................................................58 TextField.................................................................................................................................... 58 Les boucles avec TextField........................................................................................................60 Remplacer loprateur []............................................................................................................. 62

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 3 / 77

Limiter lappel des fonctions....................................................................................................64 Optimiser les boucles................................................................................................................. 66 Les boucles inverses................................................................................................................. 67 OPTIMISATION DE LAPPLICATION............................................................................................68 Du contenu externe................................................................................................................... 68 Flash Remoting.......................................................................................................................... 70 Utiliser le cache de Player Flash................................................................................................73 CONCLUSION............................................................................................................................... 74 C'EST MAINTENANT !.................................................................................................................. 75 PRISE DE NOTES......................................................................................................................... 76

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 4 / 77

INTRODUCTION
Version 1.1

LOptimisation des Performances pour la Plateforme Adobe Flash


Les applications Flash, y compris Adobe AIR, fonctionnent sur plusieurs plateformes comme : le bureau, les smartphones, les tablettes PC et les tlvisions. A travers plusieurs exemples et cas concrets, vous dcouvrirez avec ce document les meilleures pratiques pour programmer des applications flash. Ce document aborde les sujets suivants : La consommation de la mmoire. L'utilisation des ressources CPU. L'amlioration des performances de l'ActionScript 3. L'amlioration de la vitesse du rendu. Le travail avec l'audio et la vido. Des tests et des dploiements d'application.

Plusieurs de ces optimisations peuvent sappliquer aux applications sur tous les priphriques, incluant lexcution AIR, le Player Flash. Quelques exceptions et ajouts supplmentaires sont pour les appareils mobiles (smartphones, tablettes). La majorit de ces optimisations concernent les nouvelles fonctionnalits du Player Flash 10.1 et AIR 2.5. Toutefois, plusieurs de ces optimisations peuvent se mettre en uvre sur les anciennes versions du Player Flash et dAIR.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 5 / 77

LEXECUTION DU CODE
Un lment trs important pour comprendre comment amliorer les performances dune application est de comprendre comment la plateforme flash excute le code. Le code excute en boucle le code de chaque frame. Dans ce cas l, une frame reprsente une portion de temps, dtermin par le framerate (nombre dimage par seconde) de lapplication. Le temps accord pour chaque frame dpend directement du framerate. Par exemple, si vous spcifi un framerate de 30 images par secondes, lexcution du code sur chaque frame est de 33 ms. Vous pouvez renseigner le framerate de votre application au moment de la compilation avec Adobe Flash CS5 ou le SDK Flex. Vous pouvez galement renseigner un framerate diffrent, directement dans le code Plus le framerate de votre application est bas, plus les performances seront leves. En fonction du type dapplication, vous pouvez utiliser un framerate de 12fps. Par exemple pour les applications sans animation, la lecture de vido ou audio, les interfaces utilisateurs avec seulement des boutons de contrles... Dans ces cas l un framerate de 12 fps est largement suffisant. Pour les autres types dapplications comme les jeux flash, les squences animes, les interfaces utilisateurs avec des effets de tweens... un framerate de 30 40 fps est ncessaire pour fournir une exprience satisfaisante lutilisateur. Tout en sachant que le Player Flash 10.2 ne peut pas grer un framerate suprieur 60. Le Player Flash 11 offre encore de meilleures performances et peut grer un framerate suprieur 60 fps.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 6 / 77

Les performances perues et les performances relles


Au final, votre application est jug par les utilisateurs. Les dveloppeurs peuvent mesurer les performances de lapplication, combien de temps met pour sexcuter telle ou telle partie, combien dinstances dobjets sont cres... Toutefois, ces diffrentes mesures importent peu les utilisateurs. Les utilisateurs utilisent dautres critres pour dfinir la performance dune application. Par exemple, est ce quapplication est rapide, fluide et avec un temps de rponse rapide mes demandes ? Est ce que lapplication utilise trop les ressources de ma machine ? Posez-vous ces questions pour dfinir la performance perue de votre application : Est ce que les animation sont fluides ou saccades ? Est ce que le contenu vido parat fluide ou saccad? Est ce que l'audio est en lecture continue, ou avec une fonction pause / lecture ? Est ce que la fentre se bloque o se vide pendant les calculs longs. Lorsque vous renseignez du texte, est ce fluide ou avec des saccades ? Si vous cliquez sur un lment, la rponse est-elle instantane ou avec un dlai ? Est ce que le ventilateur du CPU devient bruyant lorsque l'application s'excute ? Sur un ordianteur portable ou un smartphone, est ce que la batterie se dcharge rapidement pendant l'excution de l'application ? Est ce que les autres applications deviennent lentes pendant que la notre s'excute ?

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 7 / 77

Il est trs important de comprendre la diffrence entre les performances perues et les performances relles. Les solutions pour obtenir les meilleures performances perues sont diffrentes que pour obtenir de la performance pure. Assurez-vous de ne pas excuter trop de codes lors de lexcution de lapplication, ni trop de mise jour graphiques (animations, effets...). Dans certains cas, il est ncessaire de diviser votre application en plusieurs parties, entre chaque partie, des mises jour de lcran. Les techniques fournies dans ce document sont axes sur la performance du code lexcution et comment sont perues ces performances par lutilisateur.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 8 / 77

Ciblez vos optimisations


Des amliorations de performances nimpliquent pas forcment une amlioration significative pour les utilisateurs. Il est important de se concentrer sur loptimisation des performances sur fonctions spcifiques qui posent problmes dans votre application. Plusieurs optimisations sont de bonnes pratiques et peuvent toujours tre mises en uvres. Pour les autres optimisations, cela dpend des besoins de votre application et de lutilisateur. Par exemple, une application fournit toujours de meilleures performances si elle nutilise pas danimation, de vido ou deffets graphiques. Toutefois, une des raisons de lutilisation de la plateforme Flash pour crer des applications, est la possibilit dutiliser des mdias, les possibilits graphiques pour concevoir des applications rich . Prenez en compte le niveau dinteractions / effets graphiques, en fonction des caractristiques de la machines, des appareils sur lesquels sexcute votre application. Le premier conseil est dviter doptimiser trop tard . Certaines optimisations ncessitent une rcriture du code qui devient difficile lire ou faire voluer. Ce code une fois optimis est difficile maintenir dans le temps. Concernant ce type doptimisations, il est toujours prfrable dattendre et de dterminer les sections de code ncessitant ce type doptimisation.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 9 / 77

Dans lidal, en rduisant la consommation mmoire dune application, cela augmente les performances de celle-ci. Toutefois, cela nest pas toujours possible. Par exemple, si une application se bloque durant certaines oprations, la solution est toujours de diminuer les calculs effectus sur chaque frame. En diminuant les calculs, cela prend moins de ressources pour accomplir le calcul demand. Effectivement, il est possible pour lutilisateur de ne pas percevoir le temps supplmentaire (accord aux calculs), si lapplication continue de rpondre ses interactions et quelle ne se bloque plus.

Une chose savoir propos de loptimisation est deffectuer des tests de performances.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 10 / 77

GERER LA MEMOIRE
Lconomie de la mmoire est trs important dans le dveloppement dune application. Pour les appareils mobiles (comme les smartphones), cest la priorit, il est indispensable de limiter la consommation des ressources mmoires par lapplication.

Les Display Objects


Choisissez le Display Object adquate.

ActionScript 3 propose une large gamme de display objects. Une des optimisations la plus simple est de limiter lutilisation de la mmoire en slectionnant le type de display object appropri. Pour des formes simples, sans interaction, utilisez des objets Shape. Pour des objets interactifs, qui nont pas besoin de timeline, prfrez les objets Sprite. Pour les animations qui utilisent la timeline, utilisez les objets MovieClip.

Choisissez toujours le type dobjet le plus efficace pour votre application. Le code ci-dessous montre lutilisation de la mmoire pour les diffrents types dobjets.
trace(getSize(new Shape())); // output: 236 trace(getSize(new Sprite())); // output: 412 trace(getSize(new MovieClip())); // output: 440

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 11 / 77

La mthode getSize() montre le nombre de bytes utilis par un objet en mmoire. Vous voyez que l'utilisation d'un objet MovieClip la place d'un objet Shape, consomme prs du double de mmoire, surtout si les fonctionnalits d'un MovieClip sont inutiles.

Les types primitifs


Utilisez la mthode getSize() pour tester votre code et dterminer lobjet le plus efficace pour la tche.

Tous les types primitifs utilisent de 4 8 bytes en mmoire, sauf String. En utilisant un type primitif correct, il est facile doptimiser lutilisation de la mmoire.
// Primitive types var a:Number; trace(getSize(a)); // output: 8 var b:int; trace(getSize(b)); // output: 4 var c:uint; trace(getSize(c)); // output: 4 var d:Boolean; trace(getSize(d)); // output: 4 var e:String; trace(getSize(e)); // output: 4

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 12 / 77

Pour un nombre, cest 8 bytes qui sont rservs par la Machine Virtuel ActionScript (AVM) si il ny a aucune valeur de renseigne. Tous les autres types primitifs sont stocks sur 4 bytes.
// Primitive types var a:Number = 5; trace(getSize(a)); // output: 4 a = Number.MAX_VALUE; trace(getSize(a)); // output: 8

Le fonctionnement est diffrent pour le type String. La mmoire rserve est en fonction de la taille de la String (chane de caractres).
var name:String; trace(getSize(name)); // output: 4 name = " "; trace(getSize(name)); // output: 24 name = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularized in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."; trace(getSize(name)); // output: 1172

Utilisez la mthode getSize() pour tester votre code et ainsi choisir le type primitif le plus efficace pour la tche excuter.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 13 / 77

Rutiliser les objets


Rutilisez les objets lorsque cest possible, plutt que den crer dautres.

Une autre solution facile pour optimiser la mmoire est de rutiliser les objets et dviter den crer de nouveaux lorsque cest possible.
const MAX_NUM:int = 18; const COLOR:uint = 0xCCCCCC; var area:Rectangle; for (var:int = 0; i < MAX_NUM; i++) { // ne rutilisez pas ce code area = new Rectangle(i,0,1,10); myBitmapData.fillRect(area,COLOR); }

La recration de lobjet Rectangle chaque boucle utilise plus de mmoire, avec un temps de traitement plus long, cause de la cration dun nouveau objet chaque boucle. Utilisez plutt ce type de code :
const MAX_NUM:int = 18; const COLOR:uint = 0xCCCCCC; // Create the rectangle outside the loop var area:Rectangle = new Rectangle(0,0,1,10); for (var:int = 0; i < MAX_NUM; i++) { area.x = i; myBitmapData.fillRect(area,COLOR); }

Lexemple prcdent utilise un seul objet, avec un impact trs faible sur la mmoire.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 14 / 77

Lexemple suivant montre une conomie importante de mmoire en rutilisant un objet BitmapData.
var myImage:BitmapData; var myContainer:Bitmap; const MAX_NUM:int = 333; for (var i:int = 0; i< MAX_NUM; i++) { // cration d'un bitmap de 20 x 20 pixels, non-transparent myImage = new BitmapData(20,20,false,0x006f77); // cration d'un container pour chaque instance BitmapData myContainer = new Bitmap(myImage); // ajout la display list addChild(myContainer); // positionne le container myContainer.x = (myContainer.width + 8) * Math.round(i % 22); myContainer.y = (myContainer.height + 8) * int(i / 22); }

Note : lorsque vous utilisez des valeurs positives, arrondir un nombre avec int est plus rapide que dutiliser la mthode Math.floor().

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 15 / 77

Limage ci-dessous vous montre le rsultat :

Une version optimise est de crer une seul instance BitmapData puis dutiliser plusieurs rfrences Bitmap pour obtenir un rsultat identique :
// cration d'un seul bitmap de 20 x 20 pixels, non-transparent var myImage:BitmapData = new BitmapData(20,20,false,0xF0D062); var myContainer:Bitmap; const MAX_NUM:int = 300; for (var i:int = 0; i< MAX_NUM; i++) { // cration d'un container avec un rfrence BitmapData myContainer = new Bitmap(myImage); // ajout la display list addChild(myContainer); // positionne le container myContainer.x = (myContainer.width + 8) * Math.round(i % 20); myContainer.y = (myContainer.height + 8) * int(i / 20); }

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 16 / 77

Cette technique conomise environ 700 KB de mmoire, ce qui est trs significatif pour les appareils mobiles (smartphones). Chaque container Bitmap peut tre manipuler sans modifier le BitmapData dorigine, tout cela en utilisant les proprits du Bitmap.
// cration d'un seul bitmap de 20 x 20 pixels, non-transparent var myImage:BitmapData = new BitmapData(20,20,false,0x06f77); var myContainer:Bitmap; const MAX_NUM:int = 333; for (var i:int = 0; i< MAX_NUM; i++) { // cration d'un container avec un rfrence BitmapData myContainer = new Bitmap(myImage); // ajout la display list addChild(myContainer); // positionne le container myContainer.x = (myContainer.width + 8) * Math.round(i % 22); myContainer.y = (myContainer.height + 8) * int(i / 22); // dfinition d'une rotation, alpha et scaleX individuel myContainer.rotation = Math.random()*360; myContainer.alpha = Math.random(); myContainer.scaleX = myContainer.scaleY = Math.random(); }

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 17 / 77

Et voici le rsultat :

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 18 / 77

Librer la mmoire
Supprimez toutes les rfrences des objets pour vous assurer du passage du garbage collector.

Vous ne pouvez pas excuter le garbage collector directement dans le Player Flash. Pour tre certains que quun objet est libr par le garbage collector, il faut supprimer toutes les rfrences cet objet. Note : vous pouvez appeler directement le garbage collector dans Adobe AIR et la version debug du Flash Player. Par exemple, le code suivant met une rfrence de Sprite null :
var mySprite:Sprite = new Sprite(); // La rfrence est gale null, le garbage collector le retire de la mmoire mySprite = null;

Rappelez-vous, lorsquun objet est null, il nest pas toujours supprim de la mmoire. Parfois, le garbage collector ne sexcute pas, si la mmoire disponible est considre comme suffisante. Le garbage collector nest pas prvisible.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 19 / 77

Lorsque le garbage collector sexcute, il trouve des objets non supprims. Il dtecte les objets inutiliss, en trouvant des objets rfrencs par dautres, mais que lapplication nutilise plus. Tous les objets inutiliss dtects de cette faon sont supprims. Dans les grosses applications, ce processus peut utiliser beaucoup de CPU et peut affecter les performances et donc crer un ralentissement dans lapplication. Essayez de limiter les passages du garbage collector en rutilisant les objets ds que c'est possible. galement, mettez les rfrences null, lorsque cest possible, ainsi le garbage collector sexcute plus rapidement pour trouver ces objets. Note : mettre un display objet null nimplique pas sa suppression. Lobjet continue de consommer des ressources CPU, mme aprs le passage du garbage collector. Assurez-vous davoir dsactiv (dsabonn) votre objet avant de mettre sa rfrence null. Le garbage collector peut tre excuter en appelant la mthode System.gc(), disponible dans Adobe AIR et la version debug du Player Flash. Note : si l'objet utilis est un diffuseur d'vnements, d'autres objets peuvent le rfrencer. Alors, supprimez les couteurs en utilisant la mthode removeEventListener() avant de mettre sa rfrence null.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 20 / 77

La mmoire utilise par un Bitmap peut tre rduite instantanment. Par exemple, la classe BitmapData possde une mthode dispose(). L'exemple suivant cre une instance BitmapData de 1,8 MB. L'utilisation de la mmoire grimpe de 1,8 MB.
trace(System.totalMemory / 1024); // output: 43100 // cration d'une instance BitmapData var image:BitmapData = new BitmapData(800, 600); trace(System.totalMemory / 1024); // output: 44964

Ensuite, le BitmapData est supprim manuellement.


trace(System.totalMemory / 1024); // output: 43100 // cration d'une instance BitmapData var image:BitmapData = new BitmapData(800, 600); trace(System.totalMemory / 1024); // output: 44964 image.dispose(); image = null; trace(System.totalMemory / 1024); // output: 43084

Pour que la mthode dispose() supprime les pixels de la mmoire, la rfrence doit tre mise null. Toujours appeler la mthode dispose() et mettre la rfrence null lorsque vous navez plus besoin de lobjet BitmapData, alors la mmoire est libre immdiatement.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 21 / 77

UTILISATION DES BITMAPS


Lutilisation de vecteurs la place des bitmaps est une bonne solution pour conomiser la mmoire. Par contre, lutilisation de vecteurs, surtout les complexes, augmente fortement les besoins en ressources CPU. Lutilisation des bitmaps est une bonne solution pour optimiser le rendu, par qu lexcution de lapplication, il y a besoin de moins de ressources pour dessiner des pixels sur lcran que pour le rendu de contenu vectoriel.

La qualit des Bitmaps


Pour une meilleure utilisation de la mmoire, les images opaques 32 bits sont rduites 16 bits lorsque le Player Flash dtecte un cran 16 bits. Cette baisse de qualit consomme moiti moins de ressources mmoire, et le rendu des images est plus rapide. Cette fonctionnalit est seulement disponible avec le Flash Player 10.1 pour Windows Mobile. Note : avant le Player Flash 10.1, tous les pixels crs en mmoire taient stocks sur 32 bits (4 bytes).

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 22 / 77

Un logo simple de 300x300 pixels utilisait 350 KB de mmoire (300*300*4/1024). Avec cette nouvelle option, le mme logo opaque utilise seulement 175 KB. Si le logo est transparent, il ne peut pas tre rduit 16 bits, il utilise donc la mme mmoire (350 KB). Cette fonctionnalit peut sappliquer seulement pour les bitmaps embarques ou les images charges au dmarrage (PNG, GIF, JPG). Sur les appareils mobiles, il est difficile de diffrencier un rendu dimage en 16 bits et le mme rendu en 32 bits. Avec une simple image compose de quelques couleurs, il ny a pas de diffrence visible. Pour la majorit des images plus complexes, il est difficile de dtecter une diffrence. Toutefois, il peut y avoir une dgradation des couleurs lorsquil y a un zoom sur une image, une image 16 bits peut tre moins lisse quune en 32 bits.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 23 / 77

BitmapData single reference


Une optimisation importante est dutiliser, aussi souvent que possible, les instances BitmapData. Le Player Flash 10.1 et AIR 2.5 ajoute une nouvelle fonctionnalit, pour toutes les plateformes, qui sappelle BitmapData single reference . Lorsque vous crez des instances BitmapData partir dune image embarque, une seule version de ce Bitmap est utilise toutes les instances BitmapData. Si un bitmap est modifi plus tard, cela donne un bitmap unique dans la mmoire. Limage embarque peut provenir de la bibliothque ou du tag [embed]. Note : le contenu existant profite de cette nouvelle fonctionnalit, parce que le Player Flash 10.1 et AIR 2.5 rutilise automatiquement les bitmaps.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 24 / 77

Lorsquune image est embarque, une bitmap associe est cre en mmoire. Avant le Player Flash 10.1 et AIR 2.5, chaque instance donne avait une bitmap spare en mmoire.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 25 / 77

Dans le Flash Player 10.1 et AIR 2.5, lorsque de multiples instances de bitmap sont cres, une seule version de bitmap est utilise pour toutes les instances BitmapData.

Cette approche rduit efficacement la mmoire utilise par une application avec beaucoup de bitmaps. Lexemple ci-dessous cre plusieurs instances du symbol as3 :
const MAX_NUM:int = 18; var oLogo:BitmapData; var bitmap:Bitmap; for (var i:int = 0; i<MAX_NUM; i++) { for (var j:int = 0; j<MAX_NUM; j++) { oLogo = new LogoAS3(0,0); bitmap = new Bitmap(oLogo); bitmap.x = j * oLogo.width; bitmap.y = i * oLogo.height; addChild(bitmap) } }

Et voici le rsultat de ce morceau de code :


Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 26 / 77

Avec le Player Flash 10, cette application utilise environ 1 008 KB en mmoire. Avec le Player Flash 10.1, sur le bureau ou un appareil mobile, cette application utilise seulement 4 KB de mmoire.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 27 / 77

Le code suivant modifie une seule instance BitmapData :


const MAX_NUM:int = 18; var oLogo:BitmapData; var bitmap:Bitmap; for (var i:int = 0; i<MAX_NUM; i++) { for (var j:int = 0; j<MAX_NUM; j++) { oLogo = new LogoAS3(0,0); bitmap = new Bitmap(oLogo); bitmap.x = j * oLogo.width; bitmap.y = i * oLogo.height; addChild(bitmap) } } var ref:Bitmap = getChildAt(0) as Bitmap; ref.bitmapData.pixelDissolve(ref.bitmapData, ref.bitmapData.rect, new Point(0,0),Math.random()*200,Math.random()*200, 0xffffff);

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 28 / 77

Limage ci-dessous montre la modification dune instance as3 :

En interne, le runtime assigne et cre automatiquement la bitmap en mmoire, pour prendre en compte les modifications de pixels.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 29 / 77

Lorsquune mthode de la classe BitmapData est appele, comme la modification de pixels, une nouvelle instance est cre en mmoire et les autres instances ne sont pas mises jour. La figure ci-dessous vous explique le concept :

Si un logo AS3 est modifi, une nouvelle copie est cre dans la mmoire. Le rsultat, est que lapplication utilise, environ, 8 KB de mmoire, avec le Player Flash 10.1 et AIR 2.5.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 30 / 77

Dans lexemple prcdent, chaque bitmap tait disponible individuellement pour des modifications. Pour crer un seul effet, la mthode beginBitmapFill() est la plus approprie.
var container:Sprite = new Sprite(); var source:BitmapData = new Star(0,0); // remplit le contenu avec le BitmapData d'origine container.graphics.beginBitmapFill(source); container.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight); addChild(container);

Cette technique fournit un rsultat identique avec une seule instance BitmapData Pour la rotation du logo en dcotninue, au lieu d'accder chaque instance du logo, utilisez un objet Matrix en rotation sur chaque frame.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 31 / 77

Affectez l'objet Matrix la mthode beginBitmpFill().


var container:Sprite = new Sprite(); container.addEventListener(Event.ENTER_FRAME, rotate); var source:BitmapData = new Star(0,0); var matrix:Matrix = new Matrix(); addChild(container); var angle:Number = .01; function rotate(e:Event):void { matrix.rotate(angle); // rotation du logo container.graphics.clear(); // efface le contenu // Remplit le contenu avec le BitmapData d'origine container.graphics.beginBitmapFill(source,matrix,true,true); container.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight); }

En utilisant cette technique, il ny a pas besoin de boucle en ActionScript pour crer leffet. Le runtime effectue cela en interne.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 32 / 77

Limage suivante donne le rsultat obtenu :

Avec cette technique, la mise jour du BitmapData dorigine met jour automatiquement ceux qui lutilise sur le stage, ce qui en fait une technique puissante. Note : lorsque vous utilisez plusieurs instances de la mme image, le dessin dpend de la classe associe au bitmap dorigine dans la mmoire. Si aucune classe nest associe, les images sont dessines comme des formes.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 33 / 77

Les filtres et le dchargement dynamique de bitmap


Evitez les filtres, inclut les filtres produit par Pixel Blender.

Essayez dutiliser le moins possible les filtres, y compris les filtres sur les appareils mobiles avec Pixel Blender. Lorsquun filtre est appliqu un display object, le runtime cre 2 bitmaps dans la mmoire. Ces bitmaps ont chacune la taille dun display object. La premire est une version normale de limage, la deuxime une version le filtre appliqu.

Lorsque les proprits dun filtre sont modifies, les 2 bitmaps sont mis jour pour crer le bitmap de rsultat. Ce processus utilise des ressources CPU et les 2 bitmaps utilisent une taille en mmoire significative.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 34 / 77

Le Player Flash 10.1 et AIR 2.5 possde un nouveau systme de filtre sur toutes les plateformes. Si le filtre nest pas modifi pendant 30 secondes, ou si il est cach de lcran, la mmoire utilis par le bitmap non filtr est libre. Cette fonctionnalit permet dconomiser la mmoire utilise par les filtres sur toutes les plateformes. Par exemple, prenez un objet texte avec un filtre de flou appliqu. Le texte utilis dans ce cas, pour un simple affichage nest pas modifi. Aprs 30 secondes, la version bitmap non filtre est supprime de la mmoire. Le mme principe de libration de mmoire est mis en uvre pour un texte cach pendant plus de 30 secondes, ou en dehors de lcran. Lorsquune proprit dun filtre est modifie, la version bitmap non filtre est recre. Cette fonctionnalit sappelle le dchargement dynamique de bitmap. Malgr ces optimisations, soyez prudent avec les filtres, ils ont besoin de beaucoup de ressources CPU lorsquils sont modifis. Une meilleure solution est dutiliser des bitmaps crs avec un logiciel comme Adobe Photoshop, pour simuler des filtres. vitez dutiliser la cration de bitmaps au dmarrage dActionScript. En utilisant des bitmaps externes , cela aide le runtime rduire lutilisation de ressources CPU, surtout lorsque les proprits des filtres ne changent pas continuellement. Dans la mesure du possible, crez les effets dont vous avez besoin sur un bitmap dans un logiciel comme Photoshop. Vous pouvez afficher le bitmap au runtime (dmarrage) sans utiliser de processus important, et donc cela peut tre plus rapide.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 35 / 77

Utilisation des effets 3D


Prfrez la cration manuelle des effets 3D.

Le Player Flash 10 et AIR 1.5 possde un moteur 3D qui vous permet de crer des effets de perspective sur les display objects. Vous pouvez appliquer ces transformations en utilisant les proprits rotationX et rotationY ou avec la mthode drawTriangles() de la classe Graphics. Vous pouvez modifier la profondeur avec la proprit z. Rappelez-vous que chaque transformation de perspective d'un display object est considr comme un bitmap et ncessite plus de mmoire. L'image ci-dessous montre l'anti aliasing produit lors de l'utilisation d'une perspective :

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 36 / 77

Lanti-alisasing est le rsultat dun contenu vectoriel considr dynamiquement comme un bitmap. Lanti-aliasing arrive lorsque vous utilisez des effets 3D. Si vous crez les effets manuellement, vous pouvez rduire lutilisation de la mmoire. Toute fois, les nouvelles fonctionnalits 3D de Flash Player 10 et AIR 1.5 rend la cration de texture plus facile comme avec la mthode drawTriangles(). Lorsque le CPU effectue les transformations 3D, considrez que lapplication de celles-ci ncessite 2 bitmaps dans la mmoire. Une bitmap est loriginale et la deuxime reprsente la version en perspective. Les transformations 3D fonctionnent comme les filtres. Utilisez les proprits 3D avec prcaution lorsque le CPU effectue des transformations 3D.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 37 / 77

REDUIRE LUTILISATION DU CPU


Le Player Flash possde 2 nouvelles fonctionnalits pour vous aider conomiser les ressources CPU. Elles concernent la pause et la reprise du contenu SWF lorsquil nest plus dans le focus, et en limitant le nombre dinstance du Player Flash sur une page.

Pause et reprise
La fonctionnalit pause et reprise ne sapplique pas aux applications Adobe AIR.

Pour optimiser lutilisation du CPU et de la batterie, le Player Flash 10.1 ajoute une nouvelle fonctionnalit sur les appareils mobiles (netbooks, smartphones) pour les instances inactives. Cette fonctionnalit permet de limiter lutilisation du CPU en mettant en pause puis reprise le fichier SWF lorsque son contenu est en dehors ou sur lcran. Grce cette fonctionnalit, le Player Flash libre autant de mmoire que possible, en supprimant tous les objets qui peuvent tre recrs lorsque le contenu est remis en lecture. Le SWF est considr comme teint lorsque le contenu est en dehors de lcran, du focus.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 38 / 77

2 possibilit pour que le contenu du SWF soit considr en dehors de lcran : L'utilisateur scrolle la page (avec une barre dfilante type scrollbar) et le contenu SWF se retrouve en dehors de l'cran, donc cach.

Dans ce cas, si il y a de l'audio ou de la vido, ils sont toujours en lecture, mais le rendu graphique est stopp. Si il n'y a ni audio, ni vido en lecture, pour vous assurer que l'excution de l'ActionScript ne soit pas en pause, mettez le paramtre HTML hasPrioirty true. Rappelez-vous que le rendu du contenu SWF est mis en pause lorsque le contenu est en dehors de l'cran ou cach, en fonction de la valeur du paramtre HTML hasPrioirty. Un onglet est ouvert dans le navigateur, ce qui met le SWF en fond.

Dans ce cas, en fonction du paramtre HTML hasPrioirty, le contenu du SWF est ralentit 2 fps. Laudio et la vido sont arrts et il ny a aucun calcul de rendu tant le contenu du SWF ne redevient pas visible.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 39 / 77

La gestion des instances


Note : la gestion des instances nest pas possible avec les applications Adobe AIR.

Utilisez le paramtre HTML hasPrioirty pour dcaler le chargement des diffrents fichiers SWF. Le Player Flash possde un nouveau paramtre HTML qui sappelle hasPrioirty.
<param name="hasPriority" value="true" />

Ce paramtre limite le nombre dinstances du Player Flash dmarre sur la mme page. En limitant le nombre dinstances, cela permet dconomiser le CPU et la batterie. Le principe est de dfinir des priorits dans les contenus SWF sur une page. Prenons un exemple simple : un utilisateur parcours un site web et la page daccueil a 3 fichiers SWF diffrents. Un seul est visible, un autre partiellement et le dernier nest pas visible sur la page (besoin de scroller). Les deux premires animations dmarre normalement, la dernire est dcale car elle nest pas visible. Ce fonctionnement est celui par dfaut lorsque le paramtre hasPrioirty nest pas renseign ou est false.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 40 / 77

Pour tre certain quun swf dmarre, mme sil nest pas visible, mettez le paramtre hasPrioirty true. Faites attention la valeur de hasPrioirty, un fichier SWF qui nest pas visible pour lutilisateur a toujours son rendu en pause. Note : si les ressources CPU sont faibles Les instances du Player Flash ne dmarrent pas automatiquement sauf si le paramtre hasPrioirty est mis true. Si de nouvelles instances sont cres en javascript, aprs le chargemetn de la page, ces instances ne tiennent pas compte du paramtre hasPrioirty. Egalement, les fichiers SWF peuvent tre dmarrs par un click. Cette fonctionnalit est communment appele "click to play". Les images suivantes montrent l'influence du paramtre hasPrioirty diffrentes valeurs.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 41 / 77

Le mode veille
Le Player Flash 10.1 et AIR 2.5 implmentent une nouvelle fonctionnalit sur les appareils mobiles pour conomiser des ressources CPU et la dure de vie de la batterie. Par exemple, si l'excution d'une application mobile est interrompue et arrte d'utiliser l'appareil, le runtime le dtecte la mise en veille. Alors le framerate passe 4 fps et le rendu est mis en pause. Pour les applications AIR, le mode veille dmarre lorsque l'application est mise en tche de fond.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 42 / 77

Le code ActionScript continue de s'excuter en mode veille, comme si la proprit stage.frameRate est mise 4 fps. Mais l'tape de rendu est saut, donc l'utilisateur ne voit pas que l'application tourne 4 fps. Un framerate de 4 fps est choisi, au lieu de 0, car il permet toutes les communications sortantes (NetStream, Socket et NetConnection). Le passage 0 fps ferme toutes les connections. Un rafraichissement toutes les 250 ms (4 fps) a t choisi car les constructeurs utilise cette frquence de rafraichissement. Note : lorsque le runtime est en mode veille, la proprit stage.frameRate renvoie le framerate d'origine du fichier SWF, au lieu de 4 fps. Lorsque le systme (du smartphone) sort du mode veille, le rendu reprend. Le framerate reprend sa valeur d'origine. Note : Aucun vnement ActionScript n'est envoy lorsque le runtime passe en mode veille.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 43 / 77

Cration et suppression des objets


Crez et supprimez vos objets proprement REMOVED_FROM_STAGE et ADDED_TO_STAGE. en utilisant les vnements

Pour optimiser votre code, supprimez toujours vos objets. La suppression est trs importante pour tous les objets surtout pour les display objects. Surtout si un display object n'est plus affich dans la display list et en attente du garbage collector, il continue de consommer des ressources CPU. Par exemple, il peut tre appel par Event.ENTER_FRAME. Il est donc important de supprimer les objets avec Event.REMOVED_FROM_STAGE et Event.ADDED_TO_STAGE. les vnements

Pour que la suppression d'un objet s'effectue correctement par le garbage collector, sa rfrence ne doit plus tre appele dans le code. Faites attention vos nments, notamment qui peut Event.ENTER_FRAME appeller un display object.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 44 / 77

Prenons un exemple :
// Affiche ou retire un logo en fonction du bouton cliqu showBtn.addEventListener (MouseEvent.CLICK,showIt); removeBtn.addEventListener (MouseEvent.CLICK,removeIt); function showIt (e:MouseEvent):void { addChild (logoAS3); } function removeIt(e:MouseEvent):void { if (contains(logoAS3)) removeChild(logoAS3); } // Ecoute des vnement Event.ADDED_TO_STAGE et Event.REMOVED_FROM_STAGE // sur logoAS3 logoAS3.addEventListener(Event.ADDED_TO_STAGE,activate); logoAS3.addEventListener(Event.REMOVED_FROM_STAGE,deactivate);

function activate(e:Event):void { // A chaque frame, appelle d'une fonction qui fait bouger le logoAS3. e.currentTarget.addEventListener(Event.ENTER_FRAME,handleMovement); } function deactivate(e:Event):void { // Suppression de l'vnement Event.ENTER_FRAME // logoAS3 arrte de se dplacer // la consommation du CPU baisse e.currentTarget.removeEventListener(Event.ENTER_FRAME,handleMovement); e.currentTarget.stop(); }

Lorsque l'utilisateur appuie sur le bouton showBtn, logoAS3 est ajout sur la scne et
Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 45 / 77

l'vnement Event.ADDED_TO_STAGE se dclenche. Cela appelle la fonction activate pour envoyer un vnement Event.ENTER_FRAME et donc dplacer le logoAS3 chaque image. Lorsque l'utilisateur appuie sur le bouton removeBtn, logoAS3 est supprim de la display list, ce qui dclenche l'vnement Event.REMOVED_FROM_STAGE. Puis un appel de la fonction deactivate qui supprime l'vnement Event.ENTER_FRAME sur le logoAS3 et arrte le dplacement du logoAS3. Ainsi la rfrence logoAS3 pourra tre compltement supprime au moment du passage du garbage collector. En attendant l'excution du garbage collector, l'objet logoAS3 continue d'utiliser des ressources CPU mme s'il n'est plus affich dans la display list. Sa consommation de ressources CPU est limite du fait de la suppression complte des rfrences cet objet. Avec le Player Flash 10 et AIR 1.5, si la tte de lecture rencontre une frame vide, les display object sont automatiquement supprims. Ce concept de suppression est galement trs important avec du contenu charg dynamiquement via la classe Loader. Une mthode essentielle appele unloadAndStop() permet de dcharger un fichier SWF et de supprimer toutes les rfrences l'intrieur de ce fichier SWF, tout en obligeant le passage du garbage collector.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 46 / 77

Voici un exemple d'utilisation de la mthode unloadAndStop() :


var loader:Loader = new Loader(); loader.load ( new URLRequest ( "site.swf" ) ); addChild ( loader ); stage.addEventListener ( MouseEvent.CLICK, unloadSWF ); function unloadSWF ( e:MouseEvent ):void { // Dcharge le fichier the SWF avec une dsactivation automatique des objets loader.unloadAndStop(); }

Les actions suivantes sont effectues suite l'appel de la mthode unloadAndStop() : Les sons sont stopps. Les couteurs enregistrs dans le fichier SWF sont supprims. Les objets Timer sont stopps. Les priphriques (comme la camra et le micro) sont enlevs. Tous les MovieClip sont stopps. L'envoie des vnements Event.ENTER_FRAME, Event.FRAME_CONSTRUCTED, Event.EXIT_FRAME, Event.ACTIVATE and Event.DEACTIVATE sont stopps.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 47 / 77

Les vnements Activate et deactivate


Utilisez les vnements Event.ACTIVATE et Event.DEACTIVATE pour dtecter l'inactivit d'une application et l'optimiser.

Deux vnements Event.ACTIVATE et Event.DEACTIVATE peuvent vous aider dans l'optimisation d'une application et ainsi utiliser le moins de ressources CPU possible. Ces vnements vous permettent de dtecter lorsque l'application perd le focus. En les coutant, il est possible d'optimiser votre application en l'adaptant (pour les calculs, les animations...). Le code suivant coute ces vnements et change le framerate dynamiquement 0 lorsque l'application perd le focus.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 48 / 77

Une application perd le focus lorsque l'utilisateur change d'onglet ou met l'application en tche de fond (en mode rduit).
var originalFrameRate:uint = stage.frameRate; var standbyFrameRate:uint = 0; stage.addEventListener ( Event.ACTIVATE, onActivate ); stage.addEventListener ( Event.ACTIVATE, onDeactivate ); function onActivate ( e:Event ):void { // met le framerate d'origine stage.frameRate = originalFrameRate; } function onDeactivate ( e:Event ):void { // met framerate 0 stage.frameRate = standbyFrameRate; }

Lorsque l'application reprend le focus, le framerate est remis sa valeur d'origine. En plus de changer le framerate dynamiquement, vous pouvez tout fait effectuer d'autres optimisations comme : la suppression d'objets, l'arrt d'animations...

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 49 / 77

LES PERFORMANCES ACTIONSCRIPT 3.0


L'API de dessin
Utilisez l'API de dessin pour une excution rapide du code.

Le Player Fkash 10 et AIR 1.5 fournissent une nouvelle API de dessin, qui permet une meilleure performance lors de l'excution du code. Cette nouvelle API ne donnent pas d'amlioration de performances de rendu mais elle rduit normment le nombre de lignes de code crire. Quelques lignes pour donner une meilleure performance lors de l'excution ActionScript. La nouvelle API de dessin propose ces mthodes : drawPath() drawGraphicsData() drawTriangles()

Voic un exemple de code avant cette nouvelle API de dessin :


var container:Shape = new Shape(); container.graphics.beginFill(0x442299); var coords:Vector.<Number> = Vector.<Number>([132, 20, 46, 254, 244, 100, 20, 98, 218, 254]); container.graphics.moveTo ( coords[0], coords[1] ); container.graphics.lineTo ( coords[2], coords[3] ); container.graphics.lineTo ( coords[4], coords[5] ); container.graphics.lineTo ( coords[6], coords[7] ); container.graphics.lineTo ( coords[8], coords[9] ); addChild( container );

Et un autre exemple avec lutilisation de la nouvelle API de dessin :

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 50 / 77

var container:Shape = new Shape(); container.graphics.beginFill(0x442299); var commands:Vector.<int> = Vector.<int>([1,2,2,2,2]); var coords:Vector.<Number> = Vector.<Number>([132, 20, 46, 254, 244, 100, 20, 98, 218, 254]); container.graphics.drawPath(commands, coords); addChild( container );

La mthode drawGraphicsData() fournit des amliorations de performances identiques.

La capture et diffusion d'vnements


Le systme vnementiel de l'ActionScript 3.0 propose un concept de capture et diffusion d'vnements. En utilisant cet avantage de diffusion d'vnements, cela peut vous aider optimiser l'excution de votre code ActionScript. Vous pouvez enregistrer votre vnement sur un objet, au lieu de plusieurs, pour amliorer les performances.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 51 / 77

Dans l'exemple suivant, prenez l'exemple d'un jeu, o l'utilisateur doit cliquer le plus vite possible sur des logos pour les dtruire. Le jeu supprime chaque logo de l'cran lorsqu'il est cliqu et ajoute des points l'utilisateur. Ecoutez l'vnement MouseEvent.CLICK diffus par chaque logo, avec le code suivant :
const MAX_NUM:int = 10; var sceneWidth:int = stage.stageWidth; var sceneHeight:int = stage.stageHeight; var currentLogo:InteractiveObject; var currentLogoClicked:InteractiveObject; for ( var i:int = 0; i< MAX_NUM; i++ ) { currentLogo = new LogoAS3(); currentLogo.x = Math.random()*sceneWidth; currentLogo.y = Math.random()*sceneHeight; addChild ( currentLogo ); // Ecoute l'vnement MouseEvent.CLICK sur chaque logo currentLogo.addEventListener ( MouseEvent.CLICK, onLogoClick ); } function onLogoClick ( e:MouseEvent ):void { currentLogoClicked = e.currentTarget as InteractiveObject; currentLogoClicked.removeEventListener(MouseEvent.CLICK, onLogoClick ); removeChild ( currentLogoClicked ); }

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 52 / 77

Ce code appelle la mthode addEventListener() sur chaque instance de logo. Et supprime chaque couteur lorsqu'un logo est cliqu, avec la mthode removeEventListener(). L'ActionScript 3.0 fournit une solution de capture et diffusion d'vnements qui permet d'couter les vnements directement partir de l'objet parent. Du coup, il est possible d'optimiser le code en diminuant le nombre d'appel aux mthodes addEventListener() et removeEventListener(). L'exemple de code suivant montre l'ajout de l'vnement directement l'objet parent :
const MAX_NUM:int = 10; var sceneWidth:int = stage.stageWidth; var sceneHeight:int = stage.stageHeight; var currentLogo:InteractiveObject; var currentLogoClicked:InteractiveObject; var container:Sprite = new Sprite(); addChild ( container ); // Ecoute l'vnement MouseEvent.CLICK sur le parent (container des logos) // Mise true du 3me paramtre de l'vnement pour la phase de capture container.addEventListener ( MouseEvent.CLICK, onLogoClick, true ); for ( var i:int = 0; i< MAX_NUM; i++ ) { currentLogo = new Apple(); currentLogo.x = Math.random()*sceneWidth; currentLogo.y = Math.random()*sceneHeight; container.addChild ( currentLogo ); } function onLogoClick ( e:MouseEvent ):void { currentLogoClicked = e.target as InteractiveObject; container.removeChild ( currentLogoClicked ); }

Ce code est ainsi simplifi et optimis avec un seul appel de la mthode addEventListener().
Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 53 / 77

Les couteurs ne sont plus enregistrs sur les instances de logo, du coup il n'y a plus besoin de supprimer l'vnement lorsque le logo est cliqu. La fonction qui reoit l'vnement peut encore tre optimis en supprimant la propagation de l'vnement.
function onLogoClick ( e:MouseEvent ):void { e.stopPropagation(); currentLogoClicked = e.target as InteractiveObject; container.removeChild ( currentLogoClicked ); }

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 54 / 77

Travailler avec les Pixels


Utilisez la mthode setVector() pour dessiner des pixels.

Lorsque vous ajoutez des pixels, une optimisation simple est d'utiliser la mthode adquate de la classe BitmapData. Une solution rapide pour dessiner des pixels est d'utiliser la mthode setVector().
var wdth:int = 200;// dimensions de l'image var hght:int = 200; var total:int = wdth*hght; // Pixel colors Vector var pixels:Vector.<uint> = new Vector.<uint>(total, true); for ( var i:int = 0; i< total; i++ ) { pixels[i] = Math.random()*0xFFFFFF;// sauvegarde la couleur de chaque pixel } // cration d'un objet BitmapData non-transparent var myImage:BitmapData = new BitmapData ( wdth, hght, false ); var imageContainer:Bitmap = new Bitmap ( myImage ); myImage.setVector ( myImage.rect, pixels );// dessine les pixels addChild ( imageContainer );

Lorsque vous utilisez des mthodes lentes comme setPixel() ou setPixel32(), utilisez les mthodes lock() et unlock() pour une excution plus rapide.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 55 / 77

Dans le code suivant, en utilisant les mthodes lock() et unlock(),cela amliore les performances :
var buffer:BitmapData = new BitmapData(200,200,true,0xFFFFFFFF); var bitmapContainer:Bitmap = new Bitmap(buffer); var positionX:int; var positionY:int; buffer.lock();// mise jour en lock var starting:Number=getTimer(); for (var i:int = 0; i<2000000; i++) { positionX = Math.random()*200;// positions alatoires positionY = Math.random()*200; buffer.setPixel32( positionX, positionY, 0x66990000 );// 40% de pixels transparents } buffer.unlock();// mise jour unlock addChild( bitmapContainer ); trace( getTimer () - starting ); // output : 670

La mthode lock() de la classe BitmapData "bloque" une image contre les modifications. Les objets qui la rfrence, ne peuvent pas la mettre jour lorsque l'objet BitmapData est mis jour. Par exemple, si un objet Bitmap rfrence un objet BitmapData, vous pouvez "bloquer" (lock) l'objet BitmapData, le modifier et le dbloquer (unlock). L'objet Bitmap n'est pas mis jour tant que l'objet BitmapData n'est pas dbloqu.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 56 / 77

Pour amliorer les performances, utilisez toujours cette mthode avec unlock() avec et aprs les appels aux mthodes setPixel() ou setPixel32(). L'appel de lock() et unclok() empche l'cran de se mettre jour inutilement. Les mthodes qui parcours les pixels comme getPixel(), getPixel32(), setPixel() et setPixel32() sont trs lentes, surtout sur les appareils mobiles. Dans la mesure du possible, utilisez ces mthodes pour rcuprer tous les pixels avec un seul appel. Pour lire les pixels, utilisez la mthode getVector(), qui est plus rapide que la mthode getPixel(). Aussi, rappelez-vous d'utiliser cette API avec des vecteurs lorsque c'est possible, pour une excution plus rapide.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 57 / 77

OPTIMISATIONS PLUS FINES


TextField
Pour un objet TextField, utilisez toujours la mthode appendText(), la place de l'oprateur +=.

Lorsque vous travaillez avec la proprit text de l'objet TextField, utilisez toujours la mthode appendText(), la place de l'oprateur +=. L'utilisation de la mthode appendText() donne un amlioration des performances. Dans l'exemple ci-dessous, en utilisant l'oprateur +=, l'opration prend 1120ms :
addChild ( myTextField ); myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer(); for (var i:int = 0; i< 1500; i++ ) { myTextField.text += "ActionScript 3"; } trace( getTimer() - started ); // output : 1120

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 58 / 77

Dans l'exemple ci-dessous, l'oprateur += est remplac par appendText() :


var myTextField:TextField = new TextField(); addChild ( myTextField ); myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer(); for (var i:int = 0; i< 1500; i++ ) { myTextField.appendText ( "ActionScript 3" ); } trace( getTimer() - started ); // output : 847

Le code s'excute en 847 ms.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 59 / 77

Les boucles avec TextField


Lorsque c'est possible, mettez jour votre texte en dehors des boucles.

Le code prcdent peut encore tre optimis en utilisant une technique simple. En mettant jour le texte chaque boucle, cela prend beaucoup de calculs interne. Simplement, en concatnant une chane de caractres, et l'affecter au TextField, en dehors de la boucle, le code s'excute vraiment beaucoup plus rapidement. Le code ci-dessous s'excute en seulement 2 ms:
var myTextField:TextField = new TextField(); addChild ( myTextField ); myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer(); var content:String = myTextField.text; for (var i:int = 0; i< 1500; i++ ) { content += "ActionScript 3"; } myTextField.text = content; trace( getTimer() - started ); // output : 2

Procdez de la mme faon avec un texte HTML. Utilisez une chaine de caractres concatne dans votre boucle. Puis en dehors de la boucle, affectez directement votre chaine de caractres votre texte HTML. L'excution du code sera extrmement plus rapide.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 60 / 77

Le code ci-dessous s'excute en seulement 29 ms:


var myTextField:TextField = new TextField(); addChild ( myTextField ); myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer(); var content:String = myTextField.htmlText; for (var i:int = 0; i< 1500; i++ ) { content += "<b>ActionScript<b> 3"; } myTextField.htmlText = content; trace ( getTimer() - started ); // output : 29

Note : dans le Player Flash 10.1 et AIR 2.5, la classe String a t amliore, du coup, elle utilise encore moins de mmoire.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 61 / 77

Remplacer loprateur []
Evitez dappeler des fonctions avec loprateur [].

Lutilisation de loprateur [] peut rduire les performances de votre application. Vous pouvez vitez de lutiliser en stockant une rfrence dans une variable locale. Le code ci-dessous montre la baisse de performance avec loprateur [].
var lng:int = 5000; var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true); var i:int; for ( i = 0; i< lng; i++ ) { arraySprite[i] = new Sprite(); } var started:Number = getTimer(); for ( i = 0; i< lng; i++ ) { arraySprite[i].x = Math.random()*stage.stageWidth; arraySprite[i].y = Math.random()*stage.stageHeight; arraySprite[i].alpha = Math.random(); arraySprite[i].rotation = Math.random()*360; } trace( getTimer() - started ); // output : 16

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 62 / 77

Et voici une code optimis, en rduisant lutilisation de loprateur [].


var lng:int = 5000; var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true); var i:int; for ( i = 0; i< lng; i++ ) { arraySprite[i] = new Sprite(); } var started:Number = getTimer(); var currentSprite:Sprite; for ( i = 0; i< lng; i++ ) { currentSprite = arraySprite[i]; currentSprite.x = Math.random()*stage.stageWidth; currentSprite.y = Math.random()*stage.stageHeight; currentSprite.alpha = Math.random(); currentSprite.rotation = Math.random()*360; } trace( getTimer() - started ); // output : 9

Vous pouvez remarquer un gain de performance pratiquement multipli par 2.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 63 / 77

Limiter lappel des fonctions


Lorsque cest possible, rduisez lappel des fonctions dans votre code.

Lappel de fonction cote normment de ressources. Essayez de rduire le nombre dappel de fonctions en modifiant votre code. Cest une excellente solution pour amliorer les performances de votre application. Toutefois, gardez en mmoire, que la modification de ce code est difficile rutiliser et peut augmenter la taille de votre SWF. Certaines fonctions, comme la classe Math, sont faciles modifier. Lexemple ci-dessous utilise la mthode Math.abs() pour calculer des valeurs absolues.
const MAX_NUM:int = 500000; var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true); var i:int; for (i = 0; i< MAX_NUM; i++) { arrayValues[i] = Math.random()-Math.random(); } var started:Number = getTimer(); var currentValue:Number; for (i = 0; i< MAX_NUM; i++) { currentValue = arrayValues[i]; arrayValues[i] = Math.abs ( currentValue ); } trace( getTimer() - started ); // output : 70

Le calcul de Math.abs() peut tre effectuer manuellement.


Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 64 / 77

const MAX_NUM:int = 500000; var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true); var i:int; for (i = 0; i< MAX_NUM; i++) { arrayValues[i] = Math.random()-Math.random(); } var started:Number = getTimer(); var currentValue:Number; for (i = 0; i< MAX_NUM; i++) { currentValue = arrayValues[i]; arrayValues[i] = currentValue > 0 ? currentValue : -currentValue; } trace( getTimer() - started ); // output : 15

En se passant de la mthode Math.abs(), le code devient 4 fois plus rapide lors de lexcution. Un gain de performance non ngligeable ! Il est possible dutiliser cette technique dans plusieurs projets. Mais fates attention, ce type de code est difficilement maintenable et rutilisable.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 65 / 77

Optimiser les boucles


Optimisez vos boucles.

Une autre optimisation peut seffectuer directement dans les boucles, au moment du test dincrmentation. Le code suivant effectue une itration dans un tableau, mais ce nest pas optimis car la taille du tableau est valu chaque itration.
for (var i:int = 0; i< myArray.length; i++) { // votre code }

Il est plus performant de stocker la taille du tableau et de la rutiliser.


var lng:int = myArray.length; for (var i:int = 0; i< lng; i++) { // votre code }

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 66 / 77

Les boucles inverses


Lutilisation des boucles inverses est plus optimise que les boucles normales.

Un boucle while inverse est plus optimise quune boucle normale.


var i:int = myArray.length; while (--i > -1) { // votre code }

Ces diffrentes astuces permettent doptimiser les performances de votre code ActionScript. Cela vous montre quune seule ligne de code peut affecter les performances et lutilisation de la mmoire. Dautres optimisations ActionScript sont possibles. Pour plus dinformations, consultez : http://www.actionscript-facile.com/?p=1615
Optimiser le code ActionScript 3

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 67 / 77

OPTIMISATION DE LAPPLICATION
Du contenu externe
Sparez votre application en plusieurs SWF.

Les appareils mobiles ont un accs limit au rseau. Pour charger votre contenu plus rapidement, sparez votre application en plusieurs SWF. Essayez de rutiliser le code et les lments graphiques le plus possible dans votre application. Vous pouvez diviser votre SWF en suivant cet type dorganisation : 1 SWF pour tous vos lments graphiques (boutons, bannires...). 1 SWF pour vos animations. 1 SWF qui contient votre librairie de code ActionScript (Framework Pixlib, PureMVC, AS3 Facile...). 1 SWF contenant vos polices de caractres. 1 SWF qui contient vos fichiers sons. Si votre application SWF devient imposante, comme un jeu vido par exemple, vous pouvez crer un SWF par niveau de jeu. Ce SWF niveau de jeu contient le code ActionScript du niveau et des graphismes spcifiques.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 68 / 77

En utilisant ce principe de multiples SWF, votre application charge uniquement le contenu ncessaire pour lutilisateur, comme le niveau de jeu en cours. Et au fur et mesure de la progression du joueur, de nouveaux lments sont chargs. Cest un peu comme le chargement dun niveau sur une console de jeux vidos de salon. La classe ApplicationDomain stockes toutes les dfinitions de classes qui sont charges. La mthode getDefinition() permet dutiliser ces classes. Voici un exemple de mise en pratique de la classe ApplicationDomain :
var loader:Loader = new Loader();// Cration d'un objet Loader loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingComplete ); // chargement du SWF contenant des graphismes loader.load(new URLRequest("library.swf") ); var classDefinition:String = "Logo"; function loadingComplete(e:Event ):void { var objectLoaderInfo:LoaderInfo = LoaderInfo ( e.target ); // Rcupre une rfrence travers le fichier SWF charg var appDomain:ApplicationDomain = objectLoaderInfo.applicationDomain; // Vrification si la classe est disponible if ( appDomain.hasDefinition(classDefinition) ) { // Rcupration de la classe var importLogo:Class = Class ( appDomain.getDefinition(classDefinition) ); var instanceLogo:BitmapData = new importLogo(0,0);// Nouvelle instance logo addChild ( new Bitmap ( instanceLogo ) );// ajotu la display list } else trace ("The class definition " + classDefinition + " n'est pas disponible."); }

Il est trs simple dinstancier une classe, une image... partir dun fichier SWF charg.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 69 / 77

Flash Remoting
Utilisez le Flash Remoting et lAMF pour optimiser les communications client-serveur.

Vous pouvez utiliser des fichier XML pour charger du contenu distant dans votre SWF. Le fichier XML est ainsi charg puis analys par lapplication. XML est un meilleur choix pour les applications avec peu de contenu distant charger. Le fichier XML est ainsi de petite taille, il se charge et sanalyse rapidement. Par contre, si vous dveloppez une application avec beaucoup de contenu externe charger, utilisez la technologie de flash remoting et Action Message Format (AMF). LAMF est un format binaire utilis pour partager des informations entre un serveur (php) et un client (flash). Lutilisation de lAMF rduit la taille des donnes et amliore donc la vitesse de transmission. LAMF est un format natif de Flash, lenvoie et la rception des donnes AMF vite dutiliser beaucoup de mmoire lors de la srialisation et la dsrialisation.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 70 / 77

La passerelle de remoting (gateway) soccupe de ces tches. Lorsque vous envoyez des donnes au serveur, la passerelle effectue la dsrialisation pour vous sur le serveur. La passerelle envoie galement les donnes en conservant leur type (Number, String, Object, Array). Pour effectuer du flash remoting, la passerelle la plus connue et gratuite est AMFPHP. Voici une image qui illustre le principe de fonctionnement :

Un tutoriel complet sur lchange des donnes entre PHP (et MySQL) et Flash est disponible sur ActionScript Facile : http://www.actionscript-facile.com/?p=397
Flash remoting - changer des donnes entre php mysql et flash actionscript

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 71 / 77

Voici un exemple de code ActionScript pour la mise en place de la communication remoting :


var connection:NetConnection = new NetConnection ();// Cration de lobjet NetConnection // Connection deFlash la passerelle (gateway) Remoting connection.connect ("http://www.votreserver.com/remotingservice/gateway.php"); // Fonctions pour recevoir les donnes et les erreurs function success ( incomingData:* ):void { trace( incomingData ); } function error ( error:* ):void { trace( "Error occured" ); } // Cration d'un objet pour rediriger la rponse du serveur vers les fonctions success et error var serverResult:Responder = new Responder (success, error); // Appel de la mthode remoting sur le serveur avec des paramtres connection.call ("com.votreserver.HelloWorld.sayHello", serverResult, "Hello there ?");

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 72 / 77

Utiliser le cache de Player Flash


Mettez en cache vos lments aprs les avoir chargs au lieu de les charger chaque fois travers le rseau.

Si votre application charge des lments comme des fichiers mdia ou des donnes, vous pouvez utiliser le cache en les sauvegardant sur lappareil de lutilisateur. Pour les lments mis jour frquemment, utilisez un intervalle pour mettre jour le cache rgulirement. Par exemple, votre application peut vrifier une fois par jour sil existe une nouvelle version dune image, dun fichier XML ou mettre jour ces donnes toutes les 3h00... Vous pouvez mettre en cache les lments de plusieurs faon en fonction du type et de la nature de llment : Les lments comme les images, les vidos, l'audio : sauvegardez-les sur le disque dur du client en utilisant les classes File et FileStream. Les donnes individuelles ou de petites tailles (fichiers XML) : sauvegardez leur valeur des objets partags (type cookie) en utilisant la classe SharedObject. Les donnes importantes : sauvegardez ces donnes dans une base de donnes (MySQL) ou srialisez ces donnes et stockez-les sur le disque dur du client.

Pour le cache des donnes, le projet open source AS3CoreLib comprend une classe ResourceCache qui soccupe du chargement et du cache pour vous.
https://github.com/mikechambers/as3corelib

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 73 / 77

CONCLUSION
Ce sont des optimisations trs simples qui peuvent tre appliques vos applications flash pour obtenir de meilleures performances et de rapidit. En faisant attention l'utilisation du processeur, l'exprience globale de l'utilisateur sera plus fluide et agrable. Comme nous venons de voir, les optimisations ne sont pas lies uniquement ActionScript. La plupart des optimisations efficaces, que vous pouvez appliquer vos applications flash, sont lies de simples recommandations graphiques ou ds dtails de code.

Vous trouverez un complment doptimisation dans le livret de formation : LOptimisation des Publicits Flash. A tlcharger gratuitement sur ActionScript Facile : http://www.actionscript-facile.com/? p=1257
Optimiser les publicits flash ActionScript 3

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 74 / 77

C'EST MAINTENANT !
Rendez-vous sur cette page pour me dire ce que ce livre de formation vous a apport : http://www.actionscript-facile.com/livret-optimiser-performances-plateforme-adobeflash/article1220043.html Dites-moi dans les commentaires comment je pourrais l'amliorer. Profitez-en pour poster vos exemples dapplications flash optimises ! Je compte le complter en fonction des volutions du Player Flash.

Merci pour votre lecture, Matthieu Formateur des Dveloppeurs ActionScript

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 75 / 77

PRISE DE NOTES
________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 76 / 77

Ce livret vous a t remis en complment du Programme AS3 Formation. Il vous est personnel et ne peut pas tre redistribu. Ce livret vous a t remis par le site Formation Flash ActionScript 3 Si vous souhaitez partager directement l'adresse du site web, o j'explique en vido comment crer simplement une application flash robuste et volutive, visitez :
Tutoriels Vidos gratuits pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3

Livret de Formation
Ecrit par Matthieu Deloison Formateur ActionScript

Rendez-vous sur Formation Flash ActionScript 3 pour d'autres cours en vidos.

Formations et Tutoriels pour les Technologies Adobe Flash, Adobe AIR, ActionScript 3 Formation Flash ActionScript 3

Page 77 / 77