[1]
S'assurer qu'un objet n'occupe plus l'espace mémoire est une chose souvent négliger par les développeurs qui débutent en programmation Flash. Depuis CS3 et son langage AS3, nous devrons dès les débuts nous préoccuper de ce point important.
Évidemment nous pourrions nous dire à quoi sert d'optimisé les petits programmes. C'est qu'en fait l'optimisation du programme est une bonne habitude à prendre et ce dès le début de notre apprentissage. Même si nous développons des petits programmes, cette bonne habitude nous suivras toujours. Et lorsque nous serons plus habile à écrire de plus gros programmes, nous ne regretterons pas d'avoir pris une si bonne habitude.
[2]
Le programme qui suit contient deux classes : Design et Interface. Ces classes sont placer dans un package nommé icom.design.communication. Un fichier .fla contient la code d'instanciation de la classe Interface.
Nous aurons donc à la suite du topic trois zones de codes : Une pour chaque classe : Design et Interface et une troisième pour le fichier .fla. Nous n'aurons qu'à copier/coller. La seule attention sera de nous assurez que nous placons les deux classes dans des répertoires préparer à cette fin. N'oublions pas que nos répertoires réflètent notre package tel que défini dans les scripts.Voici un exemple des répertoires :
répertoire : icom
'celui-ci contient le répertoire design.
répertoire design
'celui-ci contient le répertoire communication.
répertoire communication
'celui-ci contient les deux classes : Design et Interface.
Ceci dit nous placons notre fichier .fla à côté de notre répertoire icom.
Si nous nommons nous même nos fichiers classes nous leurs donnons le même nom que le nom de la classe.
[3]
La classe Design.as
La classe Interface.as
Notre fichier interface_01.fla
[4]
L'exercice qui suit est simple. Ne nous fions pas aux classes qui ne servent que de prétexte. La classe Interface, de même, ne doit pas nous influencer quoique nous sommes inviter à l'ouvrir. Celle-ci gère la construction et la destruction d'un objet visuel important. Cette exercice ne répond qu'au besoin du topic libérer la mémoire d'un objet.
Nous aurons donc un résultat visuel et nous nous servirons de ces éléments pour interroger notre programme. Nous aurons donc les résultats au Output Panel. En effet l'exercice n'est conçu que pour les développeurs ayant le logiciel CS3 ou CS4. Ce script n'est pas conçu pour les utilisateurs.
La classe Interface implémente les résultats visuels de l'exercice. Celui-ci importe la classe Design et tous les objets visuels proviennent de cette classe. Déjà dans dans la classe Interface nous paramètrons les données des méthodes issus de la classe Design. Création et destruction même d'un objet nommé ' baseZone '.
De plus, l'interactivité d'un seul élément visuel, nommé ici ' footer ' apportera les résultats écrits au Output Panel.
Nous n'aurons donc qu'à cliquer sur le footer autant de fois que l'on veut pour voir tracé les données.
[5]
Le fichier .fla est sans contredit le plus important. Celui-ci contient une fonction de traçage. C'est cette fonction qui témoigne si l'un des objets [ 2 objets ici ], est libérer de la mémoire.
Ce qu'il faut comprendre c'est lorsqu'un objet est créer, il est placer en mémoire mais n'est pas encore afficher. C'est avec la méthode addChild ( objet ) Que vous l'afficher à l'écran. Par contre si vous enlever l'objet de l'affichage avec removeChild ( objet ), celui-ci est enlevé de l'affichage mais pas de la mémoire. Il est cependant important de libérer la mémoire de tous les objets qui n'entrent plus en scène. C'est ce que l'on nomme l'optimisation.
Création et mise en mémoire : var forme:Sprite = new Sprite ( ) ;
affichage au player : addChild ( forme ) ;
On l'enlève de l'affichage : removeChild ( forme ) ;
À ce stade l'objet n'est plus afficher visuellement mais subsiste en mémoire. Si donc nous écrivons :
trace ( forme is Sprite ) ; ou encore trace ( forme ) ; Nous verrons que le programme reconnait encore l'objet.
Au premier trace : true et au deuxième trace : [object Object]. Donc si nos objets n'ont plus de visibilité ceux-ci occupent toujours la mémoire et utilisent les ressources.
Voici un façon simple de s'en rendre compte : Ce script ne génère pas de visuel. Que des données.
Seul le script du fichier .fla comptera pour cet exercice. Un simple rectangle placer en scène aurait répondu aux mêmes attentes. Question de faire shape j'y ai inclu les deux classes.
Voici deux captures explicatifs :
Le footer est la barre en bas du module. Celui-ci est interactif.
Ici un aperçu du module lorsque le footer a été cliquer. Il ouvre. Si nous cliquons encore il ferme.
Comme nous pouvons le voir rien de particulier, le visuel n'est qu'un prétexte puisque sans aucun élément visuel j'aurais pu faire ce genre d'exercice. Dès que nous cliquons sur le footer les données sur la libération de la mémoire est tracé au Output Panel. Comprenons ici qu'il s'agit vraiment de la construction d'un objet visuel lorsque que l'on ouvre le module, et de sa destruction lorsque l'on ferme le module. Lorsque fermer, l'objet visuel n'est pas cacher mais il n'existe plus tout simplement. Le Output Panel donne les résultats, celà ne trompe pas. Si donc nous donnions un nom aux objets visuels et que nous écrivions après la destruction trace (objet.name), le résultat serais une erreur à la compilation. Ici j'utilise uniquement un Boolean : true - L'objet existe : false - L'objet n'existe pas.
Je le répète, seul le fichier .fla est important De même que la classe Interface. Nous avons une fonction nommé activation. Si nous comprenons bien le script attardons nous à cette fonction. Surtout la partie false du switch. Ce n'est que lorsque nous paramètrons la fonction à false que nous comprendros le sens profond de la libération de la mémoire d'un objet. La destruction totale de l'objet visuel.
Ici il y a deux objets qui sont appelés à libérer la mémoire. L'objet baseZone [Objet:Design] et l'objet baseConteneur [Objet:Sprite]. C'est le conteneur. Celui-ci contient tous les objets visuels. Donc lorsque nous paramètrons à false il n'y a plus rien au player sauf évidemment les données au Ouput Panel. Pour ce qui est du script de libération de la mémoire de l'objet baseZone, nous le verrons dans le script Interface.as. Il est du même genre que le script en .fla, il s'agit d'un switch case.
Suggestion : Téléchargement : celui-ci est complet et effectif.
La manière que nous avons explorer la libération ici laisse le programme Flash entièrement autonome quand au moment où le garbage collector agira. D'autres façons sont disponibles en AS3. System.gc ( ) force le programme Flash à libérer immédiatement la mémoire. La classe Bitmap possède une méthode dispose ( ) comme on en voit dans d'autres langage : Java ou CSharpe.
La manière dont nous avons procéder est basique, Nous libérons la mémoire en deux phases distinctent. La première enlève l'objet de l'affichage ; removeChild ( objet:DisplayObject ) removeChildAt ( niveau:Number ). Ensuite nous nous rendons compte que l'objet est encore mémorisé en interrogant notre programme : traceDonnees ( ).
Cependant à la deuxième phase nous écrivons : objet = null. Encore une fois nous interrogons notre programme et nous constatons que l'objet n'existe plus. C'est un Boolean en retour : true ou false. À la deuxième phase la mémoire est enfin libérer. N'utilisez ce genre que pour les petits programmes.
[1] Un objet qui n'est pas en scène n'a pas de raison d'exister.
[2] Un objet doit être créer au moment même ou il est appeller. Pas avant.
[3] N'utilisons jamais des artifices pour cacher des objets aux yeux des utilisateurs.
---> Exemple d'un objet que nous ne voulons plus à un moment du script :
---> monObjet.visible = false; ou encore monObjet.alpha = 0.0;
---> Ce genre de pratique n'est pas conforme à une écriture qui se veut optimiser.
[4] Nous procédons toujours par création et destruction d'un objet
---> Création lorsque utilisé : Destruction lorsque non utilisé.
---> Ainsi nous agissons en professionnel et optimisons notre programme.
Voilà c'est tout : Retenons ceci.
Ce que nous cachons aux yeux utilisateurs est encore visible aux yeux processeurs.
amicalement
zardoz
S'assurer qu'un objet n'occupe plus l'espace mémoire est une chose souvent négliger par les développeurs qui débutent en programmation Flash. Depuis CS3 et son langage AS3, nous devrons dès les débuts nous préoccuper de ce point important.
Évidemment nous pourrions nous dire à quoi sert d'optimisé les petits programmes. C'est qu'en fait l'optimisation du programme est une bonne habitude à prendre et ce dès le début de notre apprentissage. Même si nous développons des petits programmes, cette bonne habitude nous suivras toujours. Et lorsque nous serons plus habile à écrire de plus gros programmes, nous ne regretterons pas d'avoir pris une si bonne habitude.
Programmation niveau débutant
[2]
Le programme qui suit contient deux classes : Design et Interface. Ces classes sont placer dans un package nommé icom.design.communication. Un fichier .fla contient la code d'instanciation de la classe Interface.
Nous aurons donc à la suite du topic trois zones de codes : Une pour chaque classe : Design et Interface et une troisième pour le fichier .fla. Nous n'aurons qu'à copier/coller. La seule attention sera de nous assurez que nous placons les deux classes dans des répertoires préparer à cette fin. N'oublions pas que nos répertoires réflètent notre package tel que défini dans les scripts.Voici un exemple des répertoires :
répertoire : icom
'celui-ci contient le répertoire design.répertoire design
'celui-ci contient le répertoire communication.répertoire communication
'celui-ci contient les deux classes : Design et Interface.Ceci dit nous placons notre fichier .fla à côté de notre répertoire icom.
Si nous nommons nous même nos fichiers classes nous leurs donnons le même nom que le nom de la classe.
[3]
La classe Design.as
- Code: Tout sélectionner
package icom.design.communication
{
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.filters.BlurFilter;
// -- Déclaration de la classe Design --
public class Design extends Sprite
{
// -- Objets Visuelles --
private var nom:String;
private var posx:Number;
private var posy:Number;
private var radius:Number;
private var largeur:Number;
private var hauteur:Number;
private var couleur:uint;
private var ligneGrosseur:Number;
private var ligneCouleur:uint;
private var trans:Number;
private var filtre:Boolean;
private var flou:BlurFilter;
private var matrice:Array;
// --
public function Design ()
{
// -- Constructeur par défaut --
}
public function rectangleDesign($nom:String,$posx:Number,$posy:Number,$largeur:Number,
$hauteur:Number,$couleur:uint,$ligneGrosseur:Number,$ligneCouleur:uint,
$trans:Number,$filtre:Boolean):void
{
nom=$nom;
posx=$posx;
posy=$posy;
largeur=$largeur;
hauteur=$hauteur;
couleur=$couleur;
ligneGrosseur=$ligneGrosseur;
ligneCouleur=$ligneCouleur;
trans=$trans;
filtre=$filtre;
// --
this.graphics.lineStyle (ligneGrosseur,ligneCouleur,trans);
this.graphics.beginFill (couleur,trans);
this.graphics.drawRect (posx,posy,largeur,hauteur);
this.graphics.endFill ();
// --
if (filtre == true)
{
flou=new BlurFilter ;
flou.blurX=12;
flou.blurY=0;
matrice=[flou];
this.filters=matrice;
}
else if (filtre == false)
{
matrice=[];
}
}
// -->
public function cercleDesign ($nom:String,$posx:Number,$posy:Number,
$radius:Number,$couleur:uint,$ligneGrosseur:Number,
$ligneCouleur:uint,$trans:Number,$filtre:Boolean):void
{
nom=$nom;
posx=$posx;
posy=$posy;
radius=$radius;
couleur=$couleur;
ligneGrosseur=$ligneGrosseur;
ligneCouleur=$ligneCouleur;
trans=$trans;
filtre=$filtre;
// -->
this.graphics.lineStyle (ligneGrosseur,couleur,trans);
this.graphics.beginFill (couleur,trans);
this.graphics.drawCircle (posx,posy,radius);
this.graphics.endFill ();
// --
if (filtre == true)
{
flou=new BlurFilter ;
flou.blurX=12;
flou.blurY=0;
matrice=[flou];
this.filters=matrice;
}
else if (filtre == false)
{
matrice=[];
}
}
}
}
La classe Interface.as
- Code: Tout sélectionner
package icom.design.communication
{
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.MouseEvent;
import flash.events.Event;
//.
import icom.design.communication.Design;
//.
public class Interface extends Sprite
{
//.
//.. Membre de la classe
//.
private var largeur:Number;
private var hauteur:Number;
private var onOff:Boolean;
private var couleur:uint;
//.
private var header:Design;
private var centre:Design;
private var footer:Design;
private var baseZone:Design;
//.
public function Interface ()
{
//..Constructeur sans paramètre
}
//.
public function interfaceDesign ():void
{
header = new Design();
addChildAt (header, 0);
header.rectangleDesign ('header', 10, 10, 580, 14, 0xCCCCCC, 2.0, 0xFFFFFF, 1.0, true);
//.
centre = new Design();
addChildAt (centre, 1);
centre.rectangleDesign ('centre', 10, 28, 580, 120, 0xD4D0C8, 2.0, 0xFFFFFF, 1.0, true);
//.
footer = new Design();
addChildAt (footer, 2);
footer.rectangleDesign ('footer', 10, 152, 580, 14, 0xCCCCCC, 2.0, 0xFFFFFF, 1.0, true);
footer.addEventListener (MouseEvent.CLICK, ouvrirFermer);
footer.buttonMode = true;
}
public function ouvrirFermer (e:MouseEvent):void
{
var message:String = "L'objet 'baseZone' de la classe 'Design' est-il en mémoire ? :";
var ouvert:int = 70;
var fermer:int = 0;
//.
switch (true)
{
case footer.y == fermer :
footer.y = ouvert;
baseZone = new Design();
addChildAt (baseZone, 3);
baseZone.rectangleDesign ('baseZone', 10, 153, 580, 64, 0x000000, 2.0, 0xFFFFFF, 1.0, true);
//.
//.. L'objet 'baseZone' est placer en mémoire.
//.. Interroger le programme pour vérification.
//.
trace(message, baseZone is Design);
break;
case footer.y == ouvert :
footer.y = fermer;
//.
//.. Éliminer de la mémoire l'objet 'baseZone'.
//.. Interroger le programme pour vérification.
//.
removeChildAt(3);
baseZone = null;
trace(message, baseZone is Design);
break;
default :
}
}
}
}
Notre fichier interface_01.fla
- Code: Tout sélectionner
import icom.design.communication.Interface;
//.
//.. J'oblige à un background de couleur noir.
//.. Pour un meilleur rendu des filtres lorsqu'ils sont à true.
//.
var plan:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0xff000000);
var b:Bitmap = new Bitmap(plan, 'always', true);
//.
//.. On affiche l'objet.
//.
addChild (b);
//.
//.. On construit un conteneur : Il contient l'objet instanciant la classe Interface.
//.
var baseConteneur:Sprite = new Sprite();
//.
//.. On affiche l'objet
//.
addChild (baseConteneur);
//.
//.. On créé un objet d'instanciation de la classe interface.
//..
var s1:Interface = new Interface();
//.
//.. On ajoute l'objet au conteneur 'baseConteneur'.
//.. Attention il s'agit de addChildAt(param:Objet, param2:Entier).
//.
baseConteneur.addChildAt (s1, 0);
s1.interfaceDesign ();
baseConteneur.x = 110;
//.
function traceDonnees ()
{
trace ("L'objet 'Sprite : baseConteneur' est-il en mémoire ? :", baseConteneur is Sprite);
}
//.
//.. Variable de controle.
//.
var active:Boolean;
function activation ($active:Boolean):void
{
active = $active;
//.
switch (active)
{
case true :
//.. On interroge le programme
// .. Afficher l'objet et mise en mémoire.
traceDonnees ();
trace ("Cliquez sur le footer pour ouvrir|fermer l'objet 'baseZone'");
break;
//.
case false :
//.
//.. On interroge le programme
//.. l'objet n'est pas afficher mais toujours en mémoire.
//..
removeChild (baseConteneur);
traceDonnees ();// true
//.
//.. L'objet n'est pas afficher et la mémoire libérer.
//.
baseConteneur = null;
//.
//.. On interroge encore une fois
//.
traceDonnees ();// false
trace("Prenez soin de comprendre la partie 'case false :' de la fonction 'activation($active:Boolean)'");
break;
}
}
//.
//.. On appelle la fonction avec son paramètre '$active:Boolean'.
//.. C'est à 'false' que vous pourrez mieux comprendre la façon
//.. de libérer totalement l'objet de la mémoire.
//.
activation (true);
[4]
L'exercice qui suit est simple. Ne nous fions pas aux classes qui ne servent que de prétexte. La classe Interface, de même, ne doit pas nous influencer quoique nous sommes inviter à l'ouvrir. Celle-ci gère la construction et la destruction d'un objet visuel important. Cette exercice ne répond qu'au besoin du topic libérer la mémoire d'un objet.
Nous aurons donc un résultat visuel et nous nous servirons de ces éléments pour interroger notre programme. Nous aurons donc les résultats au Output Panel. En effet l'exercice n'est conçu que pour les développeurs ayant le logiciel CS3 ou CS4. Ce script n'est pas conçu pour les utilisateurs.
La classe Interface implémente les résultats visuels de l'exercice. Celui-ci importe la classe Design et tous les objets visuels proviennent de cette classe. Déjà dans dans la classe Interface nous paramètrons les données des méthodes issus de la classe Design. Création et destruction même d'un objet nommé ' baseZone '.
De plus, l'interactivité d'un seul élément visuel, nommé ici ' footer ' apportera les résultats écrits au Output Panel.
Nous n'aurons donc qu'à cliquer sur le footer autant de fois que l'on veut pour voir tracé les données.
[5]
Le fichier .fla est sans contredit le plus important. Celui-ci contient une fonction de traçage. C'est cette fonction qui témoigne si l'un des objets [ 2 objets ici ], est libérer de la mémoire.
Ce qu'il faut comprendre c'est lorsqu'un objet est créer, il est placer en mémoire mais n'est pas encore afficher. C'est avec la méthode addChild ( objet ) Que vous l'afficher à l'écran. Par contre si vous enlever l'objet de l'affichage avec removeChild ( objet ), celui-ci est enlevé de l'affichage mais pas de la mémoire. Il est cependant important de libérer la mémoire de tous les objets qui n'entrent plus en scène. C'est ce que l'on nomme l'optimisation.
Création et mise en mémoire : var forme:Sprite = new Sprite ( ) ;
affichage au player : addChild ( forme ) ;
On l'enlève de l'affichage : removeChild ( forme ) ;
À ce stade l'objet n'est plus afficher visuellement mais subsiste en mémoire. Si donc nous écrivons :
trace ( forme is Sprite ) ; ou encore trace ( forme ) ; Nous verrons que le programme reconnait encore l'objet.
Au premier trace : true et au deuxième trace : [object Object]. Donc si nos objets n'ont plus de visibilité ceux-ci occupent toujours la mémoire et utilisent les ressources.
Voici un façon simple de s'en rendre compte : Ce script ne génère pas de visuel. Que des données.
- Code: Tout sélectionner
var forme:Sprite = new Sprite();
forme.name = 'Forme';
trace(forme); // Objet Sprite
trace(forme is Sprite); // true
trace(forme.name); // Forme
// On ajoute l'objet
addChild(forme);
// On enlève l'objet
removeChild(forme);
// l'objet existe encore en mémoire
trace(forme); // Objet Sprite
trace(forme is Sprite); // true
// C'est à ce stade que nous libérons les ressouces
forme = null;
// L'objet n'existe plus en mémoire.
trace(forme); // null
trace(forme is Sprite); // false
// Lève une erreur à la compilation.
trace(forme.name);
Seul le script du fichier .fla comptera pour cet exercice. Un simple rectangle placer en scène aurait répondu aux mêmes attentes. Question de faire shape j'y ai inclu les deux classes.
Voici deux captures explicatifs :
Le footer est la barre en bas du module. Celui-ci est interactif.
Ici un aperçu du module lorsque le footer a été cliquer. Il ouvre. Si nous cliquons encore il ferme.
Comme nous pouvons le voir rien de particulier, le visuel n'est qu'un prétexte puisque sans aucun élément visuel j'aurais pu faire ce genre d'exercice. Dès que nous cliquons sur le footer les données sur la libération de la mémoire est tracé au Output Panel. Comprenons ici qu'il s'agit vraiment de la construction d'un objet visuel lorsque que l'on ouvre le module, et de sa destruction lorsque l'on ferme le module. Lorsque fermer, l'objet visuel n'est pas cacher mais il n'existe plus tout simplement. Le Output Panel donne les résultats, celà ne trompe pas. Si donc nous donnions un nom aux objets visuels et que nous écrivions après la destruction trace (objet.name), le résultat serais une erreur à la compilation. Ici j'utilise uniquement un Boolean : true - L'objet existe : false - L'objet n'existe pas.
Je le répète, seul le fichier .fla est important De même que la classe Interface. Nous avons une fonction nommé activation. Si nous comprenons bien le script attardons nous à cette fonction. Surtout la partie false du switch. Ce n'est que lorsque nous paramètrons la fonction à false que nous comprendros le sens profond de la libération de la mémoire d'un objet. La destruction totale de l'objet visuel.
Ici il y a deux objets qui sont appelés à libérer la mémoire. L'objet baseZone [Objet:Design] et l'objet baseConteneur [Objet:Sprite]. C'est le conteneur. Celui-ci contient tous les objets visuels. Donc lorsque nous paramètrons à false il n'y a plus rien au player sauf évidemment les données au Ouput Panel. Pour ce qui est du script de libération de la mémoire de l'objet baseZone, nous le verrons dans le script Interface.as. Il est du même genre que le script en .fla, il s'agit d'un switch case.
Suggestion : Téléchargement : celui-ci est complet et effectif.
La manière que nous avons explorer la libération ici laisse le programme Flash entièrement autonome quand au moment où le garbage collector agira. D'autres façons sont disponibles en AS3. System.gc ( ) force le programme Flash à libérer immédiatement la mémoire. La classe Bitmap possède une méthode dispose ( ) comme on en voit dans d'autres langage : Java ou CSharpe.
La manière dont nous avons procéder est basique, Nous libérons la mémoire en deux phases distinctent. La première enlève l'objet de l'affichage ; removeChild ( objet:DisplayObject ) removeChildAt ( niveau:Number ). Ensuite nous nous rendons compte que l'objet est encore mémorisé en interrogant notre programme : traceDonnees ( ).
Cependant à la deuxième phase nous écrivons : objet = null. Encore une fois nous interrogons notre programme et nous constatons que l'objet n'existe plus. C'est un Boolean en retour : true ou false. À la deuxième phase la mémoire est enfin libérer. N'utilisez ce genre que pour les petits programmes.
Points important à retenir
[1] Un objet qui n'est pas en scène n'a pas de raison d'exister.
[2] Un objet doit être créer au moment même ou il est appeller. Pas avant.
[3] N'utilisons jamais des artifices pour cacher des objets aux yeux des utilisateurs.
---> Exemple d'un objet que nous ne voulons plus à un moment du script :
---> monObjet.visible = false; ou encore monObjet.alpha = 0.0;
---> Ce genre de pratique n'est pas conforme à une écriture qui se veut optimiser.
[4] Nous procédons toujours par création et destruction d'un objet
---> Création lorsque utilisé : Destruction lorsque non utilisé.
---> Ainsi nous agissons en professionnel et optimisons notre programme.
Voilà c'est tout : Retenons ceci.
Ce que nous cachons aux yeux utilisateurs est encore visible aux yeux processeurs.
amicalement
zardoz






