Passer par des LinkedList pour gagner en performances
30th mai, 2009 par FlozEn ce moment, je passe pas mal de temps à feuilleter le wiki de Joa Ebert, afin de gagner en propreté de code et en performances. Dans son wiki, il y est question de LinkedList ainsi que de Pool.
En lisant l’exemple, je ne comprenais pas vraiment à quoi cela pouvait il servir (même si, sur le papier ça avait l’air cool), ni comment s’en servir…
Puis j’ai commencé à m’y intéressé plus sérieusement et à utiliser une LinkedList en partiel de Flash.
Il nous était demandé de faire un equalizer, et j’ai choisis de jouer avec du BitmapData et des modifications de pixels. En gros, une boucle plus ou moins grosse en enterFrame à manipuler.
Sachant que les LinkedList permettent de gagner en performances car :
- Passer par ce type de structures permet de stocker des objets plus rapidement,
- Itérer au sein d’une LinkedList est plus rapide que d’itérer un tableau ou autre (ce n’est plus le cas avec le FlashPlayer 10 et les Vector typé et fixes ? cf. Away3D)
Je me suis dis que c’était le moment d’essayer. Le résultat :
Cliquez pour lancer l’anim. Recliquer pour la stopper. Sachant que le swf fait 1mo (il transporte le mp3 - Boards of Canada : Diving Station).
Bref, le rendu me plait bien, et c’est fluide. Même s’il n’y a que 256 pixels par secondes à 30FPS. Vous pouvez télécharger les sources en cliquant ici.
Bossant sur un projet en parallèle, je commencais à réfléchir en terme de réorganisation de code. Et c’est là que j’en suis revenu à ces histoires de Pool (j’en parlerai dans un autre post, je n’ai pas encore assez fouillé là dessus) et de LinkedList.
Du coup, je me suis dis que j’allais tenter de les utiliser au sein de mon effet de désintégration.
Résultat avec l’ancienne version :
Résultat avec la nouvelle version :
En fonction des pcs, les différences de résultat est plus ou moins flagrant.
Les performances sont gagnées sur le fait qu’on ne passe plus par des tableaux, et que la manipulation performante au final. Cool
Bon c’est bien tout ça, mais à quoi ça ressemble une LinkedList ? Je vous invite à regarder l’explication de Joa Ebert.
Puis, pour prendre mon equalizer comme exemple, ça donne :
En l’occurence, j’ai crée un objet Particle, qui correspond à des pixels de mon bitmapdata/equalizer :
package
{
public class Particle
{
public var px:Number = 0;
public var py:Number = 0;
public var next:Particle;
}
}
Une méthode d’instanciation de tous les objets de la LinkedList :
private function createParticles():void
{
// _particles sera la variable de référence de la LinkedList.
_particles = new Particle();
var currentParticle:Particle = _particles;
var numParticles:int = NUM_PARTICLES;
while ( --numParticles != 0 )
currentParticle = currentParticle.next = new Particle();
}
Un exemple d’itération au sein d’une LinkedList :
private function setParticlesPositions():void
{
// Comme je le disais précédemment : on crée une variable dans laquelle on stocke notre objet de référence de la LinkedList (notre point de départ, en quelque sorte).
var particle:Particle = _particles;
var px:Number = stage.stageWidth * .5;
var py:Number = stage.stageHeight * .5;
while ( particle )
{
particle.px = px;
particle.py = py;
// On passe à l'élément suivant; jusqu'à ce qu'il n'y en ait plus.
particle = particle.next;
}
}
Joa Ebert en parle aussi ici avec un superbe exemple. Il disait qu’il s’en servait aussi dans son moteur de tween qui était, grâce à tout ça, plus performant que les Tweenlite ou Tweener.
Comment créer des projets en utilisant FlashDevelop ?
26th mai, 2009 par FlozPremièrement, je vous invite à lire le premier article sur minuit4 traitant de FlashDevelop. Notamment si vous n’avez pas installé FlashDevelop. Vous y trouverez aussi quelques plugins sympa, que je vous conseille fortement.
L’introduction étant faite, regardons comment créer des projets avec FlashDevelop…
1) Sans passer par l’IDE Flash
FlashDevelop permet de créer des projets AS2/AS3, et donc de les compiler sous forme d’un SWF, sans passer par l’IDE Flash. Pour celà, il utilise le FlexSDK.
Ainsi, si l’utilisation de Flash n’est pas nécessaire (pas de gros graphisme, pas d’animation fait main), vous pouvez opter ce type de projet.
Commencons :
Lancez FlashDevelop et sélectionnez l’onglet Project, puis faites New Project -> AS3 Project.

Créer un nouveau projet sans passer par l'IDE Flash
Choississez le chemin de votre projet, un nom, puis valider. A droite, vous avez l’explorateur de votre projet. Le dossier “src” contient tous vos fichiers de code .as. Notez que vous devrez obligatoirement avoir la classe principale, le Main.as en l’occurence, de votre projet en “Always Compile” (clic droit sur le fichier, Always Compile).
Si vous avez correctement installé les Flash Player Debug, vous devriez être capable de récupérer les trace de votre projet. Si ce n’est pas le cas, clic droit sur le nom de votre projet dans l’explorateur de fichier et sélectionnez “Properties“. Ici, vous pouvez sélectionnez le PlayMode de votre SWF. Choisissez “PopUp“. Si rien vous ne recevez toujours pas les trace… Vérifiez que vous avez bien installé les versions debug du flash player.

Sélectionnez la manière dont seront lu les SWF
Félicitations ! Vous avez crée votre premier projet AS3 sans passer par l’IDE Flash
2) En passant par l’IDE Flash
Créez un nouveau projet mais cette fois sélectionnez Flash IDE Project. Répétez les manips précédentes pour initialiser le bouzin.
Pour ce tutorial, nous allons ajouter 3 dossiers à notre projet.
- src, qui contiendra les fichiers .as.
- fla, qui contiendra les fichiers .fla.
- bin, qui contiendra les fichiers .swf.
Pour les ajouter, clic droit sur le nom de votre projet dans l’explorateur.
Maintenant, lancez flash et créez un nouveau document AS3. Sauvez le dans le dossier fla et créez une classe Main.as dans votre dossier src. Si vous avez correctement effectuez ces manips, vous devriez avoir cette organisation là :

Le projet actuel vu sous FlashDevelop
Retournez dans l’IDE Flash et remplissez le champs “Classe du Document” du panneau Propriétés avec le nom de votre classe Main.as. Soit Main.
Pour tous vos projets, la syntaxe correcte sera : nom_dossier.nom_sous_dossier.nom_classe
Et n’ajoutez rien. Pas de .as, ni de… Rien.

Remplissez la Classe du document, classe mère de votre projet
Bon, c’est cool tout ça, mais actuellement Flash ne sait pas où aller cherchez vos fichiers .as s’ils ne sont pas à côté du .fla courant. On va donc l’aider à y voir plus clair. Cliquez sur le bouton “Paramètres” à droite de “Publier“.
Dans la nouvelle fenêtre, recliquez sur Paramètres, à droite de “Version d’ActionScript“.
Cliquez sur le bouton “+” pour ajouter les dossiers dans lesquels se trouvent vos fichiers .as. Ici, “../src“.

ActionScript 3 parameters
Note : Ici, je vous suggère de décocher la case “Déclarer automatiquement les occurences sur votre scène”. Ainsi, vous devrez renseigner chacune des instances d’objet, posez sur votre scène, dans la classe correspondante. Exemple, je pose sur ma scène un clip que je nomme “clip1“. Dans ma classe Main.as j’ajouterai : “public var clip1:MovieClip“, que je pourrais ainsi réutiliser avec l’autocomplétion.
Revenons à nos moutons.
Sauvegardez, et copiez le code suivant dans votre Main.as :
package
{
import flash.display.MovieClip;
public class Main extends MovieClip
{
public function Main()
{
trace( "hello world !" );
}
}
}
Maintenant, compilez en appuyant sur ctrl+entrée sous Flash ou FlashDevelop.
Tout fonctionne, mais il nous manque quelque chose… A savoir, indiquer le bon chemin pour les fichiers .swf.
Pour celà, dans la fenêtre Propriétés de Flash, cliquez sur Paramètre -> Sélectionnez l’onglet Formats -> Remplissez le bon chemin pointant vers votre dossier bin.
Pendant vos développements orienté objet, vous pourriez avoir besoin de lier un objet de votre librairie à une classe. Cette partie est très utile, voire vitale pour l’organisation de vos boulots, donc suivez la bien.
Ajoutez un objet (ex : un MovieClip nommé Symbole1) à votre librarie, et faites un clic droit dessus. Cliquez sur “Liaison” dans le menu contextuel, puis choisissez un nom de class et un chemin pour votre Symbole 1. Vous suivrez encore une fois la syntaxe suivante : nom_dossier.nom_sous_dossier.nom_classe.

Lié un objet de votre librarie à une classe
Une fois cette démarche effectuée, ajoutez la classe correspondante dans le dossier src, et commencez à coder !
Ici, vous devriez être capable de faire des projets via FlashDevelop ! ![]()
Je vous invite à aller voir le wiki pour plus de documentation sur le soft, notamment la partie des raccourcis de FlashDevelop, très très intéressante !
Guide d’installation de FlashDevelop
25th mai, 2009 par FlozFlashDevelop est un IDE open source pour les projets en AS2/AS3. Il s’agit d’une des meilleures alernatives à l’IDE Flash, qui, autant le dire, est totalement naze sur le plan du développement. Notamment pour ce qui est de l’autocomplétion de ses propres classes/classes importées. Alors que FlashDevelop lui, déchire, comme Flex Builder ou FDT; mais gratuitement. Il possède en plus une bonne colloration synthaxique, ainsi que pas mal d’autres trucs de fou. Par contre, il n’est actuellement disponible que pour Windows. Si vous êtes sous mac, jetez un oeil à Flex Builder, qui va bientôt devenir Flash builder.
1) Comment installer FlashDevelop ?
Ici rien de compliqué. D’ailleurs, c’est expliqué plutôt clairement sur le forum officiel :
- Téléchargez la dernière version de FlashDevelop (actuellement 3.0.0 RC4) et installez le. Laissez les settings par défaut.
- Téléchargez la dernière version stable du Adoble Flex SDK (environ 100mo). Dézippez le où vous le voulez sur votre HDD. Mais souvenez vous de son emplacement…
- Si vous n’avez pas la machine virtuelle java, téléchargez la et installez la ou FlashDevelop ne se lancera pas.
Vérifiez ensuite que vous ayez bien d’installé les versions debug du flash player. Elles vous serviront à récupérer les traces et les erreurs lorsque vous ne passerez pas par l’IDE Flash pour compiler votre projet. Prenez donc Windows Flash Player 10 ActiveX control debugger (for IE) et the Windows Player 10 content debugger (pour Netscape blabla). Désinstallez les anciennes versions avant d’installer les nouvelles.
2) Quelle configuration pour FlashDevelop ?
Ici, vous devriez avoir réussi à installer FlashDevelop. Maintenant, configurons le afin de l’utiliser avec l’IDE de flash, ou sans l’IDE de flash.
Premièrement, cliquez sur l’onglet Tools.

Tools -> Program Settings
Tools -> Program Settings -> AS3Context.
Ensuite, remplissez le champs “Flex SDK Location” avec le chemin vers votre dossier FlexSDK que vous avez tout à l’heure dézippé.

FlashDevelop "Path to Flash IDE" and "Flex SDK Location"
Enfin, toujours dans Program Settings, sélectionnez l’onglet “ASCompletion” et cherchez la ligne “Path to Flash IDE“. Encore une fois, remplissez la avec le chemin vers votre version de Flash. CS3 ou CS4, peut importe, c’est selon ce que vous désirez.
3) Plugins ?
Pour vous simplifiez la vie durant vos phase de débug, je vous conseille de télécharger 2 plugins, tous deux écris par Jérôme Decoster :
- Trace plugin generator
- Duplicate plugin
En bas du premier post de chacune de ces pages se trouve les fichiers à téléchargez (pas les fichiers sources, mais le plugin en .fdz).
Lancez les et rebootez FlashDevelop.
En appuyant sur F10, vous devriez voir “Duplicate” et”Trace” à la fin de la liste.
Via le raccourcis Ctrl+0 sur n’importe quel terme que vous avez écrit, vous utiliserez le trace plugin.
Via le raccourcis Ctrl+alt+d, vous utiliserez le plugin duplicate. (ctrl+maj+d pour revenir en arrière).
Sweet hein ?
Maintenant, jetons un oeil sur comment utiliser FlashDevelop avec nos projets AS3.
Comment utiliser Cron? Automatisation des tâches, lancement de script php
24th mai, 2009 par MiklCron est un programme permettant de lancer automatiquement des tâches à des moments précis ou à des intervalles réguliers. Plus précisément grâce à l’édition d’un fichier stockant toutes les tâches, il est possible d’exécuter n’importe quelle commande shell. Très pratique donc, par exemple si on désire lancer un fichier php tout les jours à une heure précise. Il tourne en fond (ce type de programme est un daemon sous linux, un processus sous windows) et ne se “reveille” que lorsqu’il doit exécuter quelque chose.
Ce programme n’est néanmoins disponible que sous linux, les utilisateurs de windows pourront se tourner vers Cygwin (qui permet d’emuler un système linux sous windows) pour pouvoir utiliser tranquillement Cron.
Le fichier qu’il faut éditer est ‘crontab’. Pour se faire, il faut tout d’abord choisir l’éditeur de texte avec lequel nous allons l’ouvrir, par la commande suivante: ‘$ export VISUAL=gedit‘ gedi’ représentant ici l’éditeur souhaité. Maintenant, lancer l’édition du fichier en tapant: ‘$ crontab -e‘ et y ajouter:
MAILTO=test@test.fr //cette première ligne permet de d’envoyer à l’email choisit un retour fait par cron.
* * * * * commande à exécuter //voici l’exemple de ligne permettant de lançer la commande que l’on désire.
Chaque étoile(*) correspond à une unité de temps: ‘Minute’ ‘Heure’ ‘Jour Du Mois’ Mois ‘Jour De La Semaine’
‘Minute’ Correspond aux minutes par heure, valeurs possibles: 00 à 59.
‘Heure’ Correspond aux heures dans la journée, valeurs possibles: 00 à 23.
‘Jour Du Mois’ Correspond aux jours dans le mois, valeurs possibles: 1 à 31.
‘Mois’ Correspond au mois dans l’année, valeurs possibles: 1 to 12.
‘Jour De La Semaine’ Correspond aux jours de la semaine, valeurs possibles: 0 à 6 ou ‘mon’, ‘tue’, ‘wed’ etc…
Si on met une ‘*’ sans mettre de valeur, Cron considérera qu’il doit lançer la tache pour chaque unité de temps qui correspond à l’étoile. Concrètement, la ligne suivante exécutera la commande choisie (lancement de ‘monscript.php’) chaque minutes et chaque heures de chaque jour de chaque mois:
* * * * * /chemin.vers.php/php mes.fichiers/monscript.php
Pour lancer une commande toutes les 20 minutes par exemple, il suffit de rajouter après l’étoile(*) correspond aux minutes ‘/20′. Il en va de même pour toutes les 20 heures, 20 jours… Il faut juste placer le ‘/20′ à coté de l’étoile correspond à l’unité de temps que l’on désire.
*/20 * * * * /chemin.vers.php/php mes.fichiers/monscript.php —> toutes les 20 minutes chaque jours chaque mois etc…
00 */5 * * * /chemin.vers.php/php mes.fichiers/monscript.php —> toutes les 5 heures de chaque jours chaque mois etc…
On notera que pour toutes les 5 heures, on rajoute 00 à la place de l’étoile(*) correspondant au minutes. En effet, si on ne le fait pas, cron exécutera la commande à chaque minutes, ce qui n’est pas du tout le résultat attendu.
Enfin, il est également possible de remplacer ‘/20′ par ‘0,20,40′, ce qui donnera:
00 0,20,40 * * * /chemin.vers.php/php mes.fichiers/monscript.php —> toutes les 20 heures de chaque jours chaque mois etc…
Une fois les modifications faites, enregistrer et le fichier puis quitter. Pour tester si tout a bien fonctionner il est possible de lister ce que crontab contient par la commande suivante: ‘crontab -l‘ Notons que si le fichier ‘crontab’ contient une erreur, il sera de toute manière impossible de l’enregistrer.
Effet de désintégration en AS3 via Bitmap et BitmapData
7th mai, 2009 par FlozJ’avais une petite idée de transition pendant le développement de mon portfolio floz.fr en as3. Cette idée m’était venu d’un travail de André Michelle, sur des effets d’explosion via des manipulations sur des objets BitmapData. Il utilise notamment les méthodes getPixel() et setPixel() de BitmapData au lieu de passer par des tweens et donc de sauver des performances.
En effet, dans mon effet de désintégration (pour le moment nommé “Rain” et “RainBack”), je manipule tous les pixels de l’image afin de les faire tomber. Une sorte de pluie de pixel :
Sur des petites images, c’est fluide sans problème. Mais plus l’image sera grande, et plus les performances chuteront. Ainsi, l’effet est à utiliser avec plus ou moins de modération en fonction de l’image sur lequel on l’applique !
Les classes sont dispos sur le google code du package minuit4, et dans un .rar les contenant. Les classes sont fonctionnelles, mais sont encore sujettes à des modifications. Non pas dans leur fonctionnement en soit, mais plutôt dans l’instanciation. Je pense les réorienter vers un fonctionnement similaire à tweenlite. A suivre !
Un petit exemple d’utilisation :
import fr.minuit4.animation.rain.Rain; var r:Rain = new Rain( new Icone( 0, 0 ) ); // Icone correspond à un DisplayObject dispo dans la bibliothèque de flash. r.addEventListener( Event.COMPLETE, onComplete ); addChild( r ); r.start();
Et l’effet sur une image plus grosse, avec l’outil de contrôle des FPS du package minuit4 afin vérifier les performances de l’application. Cliquez sur la scène pour lancer l’effet.
Grosse mise à jour au niveau des performances ici.






