DEFILEMEDIA : COMPOSANT AS3 DE GESTION DE GALERIE DE MEDIA + CLASS DEBUGTRACE DE

h1fra Messages postés 22 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 14 novembre 2010 - 2 mars 2008 à 22:14
cs_tomboul Messages postés 25 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 26 mai 2009 - 13 mars 2008 à 13:48
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45886-defilemedia-composant-as3-de-gestion-de-galerie-de-media-class-debugtrace-de-debugging-evolue

cs_tomboul Messages postés 25 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 26 mai 2009
13 mars 2008 à 13:48
Tiens marrant, mon temps d'exécution est à 1968 !! décidement ça me colle à la peau ;-)

Top30, je suis puper impressionné par ta rapidité à pisser du code !!!
Je m'incline,
OK j'ai fait une grosse erreur je devrais m'occuper de la position qu'après avoir tester la longueur et je devrais mettre un pointeur "child" sur __mediaList [i];

Mais je continue à tenir tête face aux puissant Top30 !!
Dans une de tes deux fonctions (__1condition_puisSiTrue_1seuleAutreCondition) pour rester rigoureux, si (length>0) il faut ajouter :
child.visible = true ;
Et pour être plus proche de mon composant il faut reduire l'alétoire de la longueur à 100
(longueur qui sera souvent utilisé pour un media reduit)

package
{
import flash.events.Event ;
import flash.events.TimerEvent ;
import flash.display.Sprite ;
import flash.utils.Timer ;
import flash.utils.getTimer ;
//
//
public class SpeedTest
extends Sprite
{
private var __mediaList : Array = [];
private var __testsQty : uint = 500000 ;
private var __startTime : uint = 0 ;
private var __direction : String = '' ;
private var __testName : String = '' ;
//
//
public function SpeedTest () : void
{
__mediaList = [];
while (__mediaList.length < 50 ) __mediaList.push (new Sprite ());
//
var timer : Timer = new Timer (1000, 5);
timer.addEventListener ('timer', runTests );
timer.start ();
}
//
//
public function runTests ($e : TimerEvent ) : *
{
var timer : Timer = Timer ($e.target);
switch (timer.currentCount )
{
case 1 : return __toujours2conditions ('TomBoul');
case 2 : return __1condition_puisSiTrue_3conditions ('Top30');
case 3 : return __1condition_puisSiTrue_1seuleAutreCondition ('Top30');
case 4 : return __1conditionPuis2conditions ('TomBoul');
case 5 : return __1conditionPuis2conditionsAccesPointeur ('TomBoul');
}
return null ;
}
//
//
public function __toujours2conditions ( $author:String ) : *
{
__testStart ($author, "__toujours2conditions");
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ()*100);
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
if (direction == "horizontal")
{
__mediaList [i].x = 10 ;
__mediaList [i].width = length;
} else
{
__mediaList [i].y = 10;
__mediaList [i].height = length;
}
//
if(length>0)
{
__mediaList [i].visible = true;
} else
{
__mediaList [i].visible = false;
}
}
__testEnd ();
return null ;
}
//
//
public function __1conditionPuis2conditions ( $author:String ) : *
{
__testStart ($author, "__1conditionPuis2conditions");
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ()*100);
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
__mediaList [i].visible = false;
if(length>0) {
if (direction == "horizontal")
{
__mediaList [i].x = 10 ;
__mediaList [i].width = length;
} else
{
__mediaList [i].y = 10;
__mediaList [i].height = length;
}
__mediaList [i].visible = true;
}
}
__testEnd ();
return null ;
}
//
//
public function __1conditionPuis2conditionsAccesPointeur ( $author:String ) : *
{
__testStart ($author, "__1conditionPuis2conditionsAccesPointeur");
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ()*100);
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
var child : Sprite = __mediaList [i];
child.visible = false ;
if(length>0) {
if (direction == "horizontal")
{
child.x = 10 ;
child.width = length;
} else
{
child.y = 10;
child.height = length;
}
child.visible = true;
}
}
__testEnd ();
return null ;
}
//
//
public function __1condition_puisSiTrue_3conditions ($author:String ) : *
{
__testStart ($author , "__1condition_puisSiTrue_3conditions");
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ()*100);
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
var child : Sprite = __mediaList [i];
child.visible = false ;
//
if (length > 0)
{ var isH : Boolean (direction 'horizontal' );
var axe : String = (isH? 'x' : 'y' );
var siz : String = (isH? 'width' : 'height' );
//
child [axe] = 10 ;
child [siz] = length ;
child.visible = true ;
}
}
__testEnd ();
return null ;
}
//
//
public function __1condition_puisSiTrue_1seuleAutreCondition ($author:String ) : *
{
__testStart ($author, "__1condition_puisSiTrue_1seuleAutreCondition");
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ()*100);
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
var child : Sprite = __mediaList [i];
child.visible = false ;
//
if (length > 0)
{
if (direction == 'horizontal' ) __setMediaH (child, 10, length);
else __setMediaV (child, 10, length);
child.visible = true ; // tomboul
}
}
__testEnd ();
return null ;
}
//
//
private function __setMediaH ($child : Sprite, $pos : Number, $size : Number ) : void
{
$child.x = $pos ;
$child.height = $size ;
}
//
//
private function __setMediaV ($child : Sprite, $pos : Number, $size : Number ) : void
{
$child.y = $pos ;
$child.width = $size ;
}
//
//
private function __testStart ($id : String, $fonc : String ) : void
{
__testName = $id ;
__startTime = getTimer ();
//
trace ('Test ' + $id + "(" + $fonc + ') : START');
}
//
//
private function __testEnd () : void
{
var id : String = __testName ;
var time : uint = getTimer () - __startTime ;
//
trace ('Test ' + id + ' : END');
trace ('fonction exécutée ' + __testsQty + ' fois en ' + time + ' ms.' );
trace ('' );
}
}
}

affiche :

Test TomBoul(__toujours2conditions) : START
Test TomBoul : END
fonction exécutée 500000 fois en 1781 ms.

Test Top30(__1condition_puisSiTrue_3conditions) : START
Test Top30 : END
fonction exécutée 500000 fois en 2076 ms.

Test Top30(__1condition_puisSiTrue_1seuleAutreCondition) : START
Test Top30 : END
fonction exécutée 500000 fois en 1500 ms.

Test TomBoul(__1conditionPuis2conditions) : START
Test TomBoul : END
fonction exécutée 500000 fois en 2081 ms.

Test TomBoul(__1conditionPuis2conditionsAccesPointeur) : START
Test TomBoul : END
fonction exécutée 500000 fois en 1484 ms.

En les cas tout merci à toi et BananaTree, j'apprends beaucoup avec vous ...
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
13 mars 2008 à 12:16
package
{
import flash.events.Event ;
import flash.events.TimerEvent ;
import flash.display.Sprite ;
import flash.utils.Timer ;
import flash.utils.getTimer ;
//
//
public class SpeedTest
extends Sprite
{
private var __mediaList : Array = [];
private var __testsQty : uint = 500000 ;
private var __startTime : uint = 0 ;
private var __direction : String = '' ;
private var __testName : String = '' ;
//
//
public function SpeedTest () : void
{
__mediaList = [];
while (__mediaList.length < 50 ) __mediaList.push (new Sprite ());
//
var timer : Timer = new Timer (1000, 3);
timer.addEventListener ('timer', runTests );
timer.start ();
}
//
//
public function runTests ($e : TimerEvent ) : *
{
var timer : Timer = Timer ($e.target);
switch (timer.currentCount )
{
case 1 : return __toujours2conditions ('TomBoul');
case 2 : return __1condition_puisSiTrue_3conditions ('Top30');
case 3 : return __1condition_puisSiTrue_1seuleAutreCondition ('Top30');
}
return null ;
}
//
//
public function __toujours2conditions ( $author:String ) : *
{
__testStart ($author);
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ());
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
if (direction == "horizontal")
{
__mediaList [i].x = 10 ;
__mediaList [i].width = length;
} else
{
__mediaList [i].y = 10;
__mediaList [i].height = length;
}
//
if (length > 0)
{
__mediaList [i].visible = true;
} else
{
__mediaList [i].visible = false;
}
}
__testEnd ();
return null ;
}
//
//
public function __1condition_puisSiTrue_3conditions ($author:String ) : *
{
__testStart ($author);
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ());
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
var child : Sprite = __mediaList [i];
child.visible = false ;
//
if (length > 0)
{
var isH : Boolean (direction 'horizontal' );
var axe : String = (isH? 'x' : 'y' );
var siz : String = (isH? 'width' : 'height' );
//
child [axe] = 10 ;
child [siz] = length ;
child.visible = true ;
}
}
__testEnd ();
return null ;
}
//
//
public function __1condition_puisSiTrue_1seuleAutreCondition ($author:String ) : *
{
__testStart ($author);
//
var n : Number = - 1 ;
while ( ++ n < __testsQty )
{
var i : Number = Math.floor (Math.random () * __mediaList.length );
var length : Number = Math.round (Math.random ());
var direction : String = (Math.random () > 0.5? 'horizontal' : 'vertical' );
//
var child : Sprite = __mediaList [i];
child.visible = false ;
//
if (length > 0)
{
if (direction == 'horizontal' ) __setMediaH (child, 10, length);
else __setMediaV (child, 10, length);
}
}
__testEnd ();
return null ;
}
//
//
private function __setMediaH ($child : Sprite, $pos : Number, $size : Number ) : void
{
$child.x = $pos ;
$child.height = $size ;
}
//
//
private function __setMediaV ($child : Sprite, $pos : Number, $size : Number ) : void
{
$child.y = $pos ;
$child.width = $size ;
}
//
//
private function __testStart ($id : String ) : void
{
__testName = $id ;
__startTime = getTimer ();
//
trace ('Test ' + $id + ' : START');
}
//
//
private function __testEnd () : void
{
var id : String = __testName ;
var time : uint = getTimer () - __startTime ;
//
trace ('Test ' + id + ' : END');
trace ('fonction exécutée ' + __testsQty + ' fois en ' + time + ' ms.' );
trace ('' );
}
}
}


// Affiche :

Test TomBoul : START
Test TomBoul : END
fonction exécutée 500000 fois en 1968 ms.

Test Top30 : START
Test Top30 : END
fonction exécutée 500000 fois en 1197 ms.

Test Top30 : START
Test Top30 : END
fonction exécutée 500000 fois en 916 ms.

//
Sachant que moi dans mes classes, je pratiquais la version 2 !
Dorénavant je pratiquerais la version 3....
cs_tomboul Messages postés 25 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 26 mai 2009
13 mars 2008 à 12:13
Pour la poo, je m'incline et reste à l'affut de toutes infos pouvant améliorer mes compétences d'amateur !!!
pour Cédric Tabin que je me suis empressé d'aller voir c'est la :
http://www.mediabox.fr/b_MAX+:+Optimiser+son+code+AS3+avec+C%C3%A9dric+Tabin.html
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
13 mars 2008 à 10:42
conceptuellement, les 2 codes ne sont pas optimums.
j'au toujours pas téléchargé le bidule, mais :

var hor : Boolean (sensDefilement "horizontal");
var axe : String = (hor? 'x' : 'y');
var size : String = (hor? 'width' : 'height');

normalement on devrait avoir :

private var _horizontal : Boolean;
private var _axe : String ;
private var _size : Number ;

ces valeurs devraient être mise à jour dans une action spécifique appellée par des mutateurs du type,
monBidule.horientation = monBidule.VERTICAL;

et logiquement par le constructeur pour l'initialisation des valeurs si pas déclarées par défaut...

là on est plus dans le byte code, on revient au bercail de la poo ;)
pour l'optimisation, cf. l'article de cédric tabin (perdu qq part sur la toile)
cs_tomboul Messages postés 25 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 26 mai 2009
13 mars 2008 à 10:36
Pour relativiser ma réponse précédente à Top30 ...
J'ai regardé ce que tu fais et toute ta participation impressionnante à ce site et je m'incline totalement. Je t'applaudis des deux mains et des deux pieds et je vais étudier ta classe whell de plus près.
Cependant méfie toi quand même de l'écriture hyper-compressé et réfléchis aux conséquences que cela peut avoir à la compilation

Petit conseil de vieux qui a travaillé en assembleur IBM 8080 pendant 6 ans et en assembleur 68000 pendant deux ans mais relativement novice pour les nouvelles technologies telle que le langage orienté objet et l'environnement multimédia, et peu compétent pour la géométrie et les maths ...
cs_tomboul Messages postés 25 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 26 mai 2009
13 mars 2008 à 10:16
Top30, tu ne fait que compressé l'écriture, mais ça ne change en rien la lourdeur au contraire, a y regarder de plus prés c'est ton code une fois compilé qui sera plus lourd.

Par rapport à mon code, tu utilises quatre variables supplémentaires (axe, size, hor et media) pour simplement compresser l'écriture.
Tu fais quatre tests alors que je n'en fait que deux.
Au final, le résultat compilé en assembleur sera plus lourd avec ton code, qu'avec le mien ...

J'ai travaillé dans plusieurs boites en tant que programmeur et l'écriture compressée telle que tu la préconises était déconseillée, mieux vaut un code "explicite" et plus long qu'un code court mais "tort-neurone" car souvent ça cache des lourdeurs d'exécution ...

Merci Top30 mais, ce genre de débat je connais depuis longtemps, et les arguments que je viens de te donner je les donnais déjà il y a une bonne quinzaine d'année ...
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
12 mars 2008 à 13:15
http://www.flashkod.com/codes/CLASS-WHEEL-SIDE_46028.aspx
Spécialement concue pour essayer de t'aider.

Ton code me parait "lourd".. Trop lourd. C'est très difficile à lire et surtout à relire. T'imagines pas dans 6 mois qund ton niveau sera meilleur et que tu voudras améliorer ta source...
Les commentaires expliques ce que font les fonctions, mais à mon avis celles-ci devraient être scindée en fonction encore plus petites ou utiliser du code plus simple :


Par exemple : tu devrais remplacer ------------------------------

// placement du conteneur du sprite
if (sensDefilement == "horizontal")
{
tabMedia [i].content.x = posAbs;
tabMedia [i].content.width = coteVar;
} else
{
tabMedia [i].content.y = posAbs;
tabMedia [i].content.height = coteVar;
}
// si pas de hauteur => media non visible
if (coteVar > 0)
{
tabMedia [i].content.visible = true;
} else
{
tabMedia [i].content.visible = false;
}

Qui est tres lourd ! Par : --------------------------------------

var media : *= tabMedia [i].content ;
media.visible = false ;
if ((coteVar > 0))
{
var hor : Boolean (sensDefilement "horizontal");
var axe : String = (hor? 'x' : 'y');
var size : String = (hor? 'width' : 'height');
media [axe] = posAbs ;
media [size] = coteVar ;
media.visible = visibility ;
}

Qui me semble meilleur !



Niveau graphique : no coment !
J'ai mis que 7 car je trouve que cela manque de "..." quelquechose !
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
12 mars 2008 à 10:59
Hé ben franchement bon boulot!
Pour avoir repris la programmation récemment et pondre une application aussi fonctionnelle et dans un langage encore frais et pas très documenté, chapeau :p
cs_tomboul Messages postés 25 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 26 mai 2009
10 mars 2008 à 13:01
BananaTree

J'ai bien regardé le code, et je ne comprends ce que veux tu dire par timer mal conçu ?

Mon timer est basé sur le principe de déplacer d'un pixel (paramètre incr) les conteneurs d'affichage des medias tout en réduisant leur taille aux extrémités pour donner l'impression du volume circulaire, et une fois la taille du média atteinte je fais tourner ma table des médias avec push(pop()) d'ou ce mouvement perpétuel des média.

A mon avis le problème est dans la gestion du changement des paramètres du composant.

Dans toutes mes traces j'ai ajouté un system.totalMemory (grace à ma classe debugTrace)
à la fin de la fonction draw, je prend au moins 8 méga à chaque fois ... donc au bout d'un moment c'est normal que ça ralentisse. J'ai aussi fait une fonction comptant tous les enfants présents sur la scène et ce nombre reste stable, donc mon nettoyage est opérant.

Tant qu'on ne change pas les paramètres de mon composant la quantité de mémoire occupée reste stable.

Je n'arrive pas à detecter d'ou vient cette occupation mémoire supplémentaire ...
cs_tomboul Messages postés 25 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 26 mai 2009
10 mars 2008 à 12:46
Merci Pat RB
pat RB Messages postés 30 Date d'inscription jeudi 21 septembre 2006 Statut Membre Dernière intervention 20 janvier 2010
10 mars 2008 à 10:51
Merci pour ca, en plus ca fait toujours plaisir de voir de joyeux troubadours. Je me suis bien éclaté à écouter les élucubrations d'antoine. Génial... Pour un auteur/compositeur comme moi, je trouve que la rue est toujours le meilleur endroit pour s'exprimer.
cs_tomboul Messages postés 25 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 26 mai 2009
5 mars 2008 à 09:23
Merci BananaTree pour ton commentaire ...
Effectivement, il y a quelque chose qui cloche la dedans, j'y retourne immédiatement ;-)
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
3 mars 2008 à 12:48
j'ai vagement survolé le fichier defileMedia.as (pas facile avec le moteur d'affichage de code source).
ton timer est mal conçu, le pb de "changement (horizontal -> vertical -> horizontal ect ...)" vient probablement en partie de là.
cs_tomboul Messages postés 25 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 26 mai 2009
3 mars 2008 à 10:28
L'époque du minitel est "heureusement" très révolu !!!
Mais pour l'époque c'était une petite révolution, j'avais alors travaillé (en 1985) dans la boite qui avait fait exploser les connexions (code funitel) grâce aux "chat", on programmait en assembleur IBM 8080, belle aventure !!
Aujourd'hui on est sur une autre planète !!!
Dans tous ces changement, ce que j'apprécie le plus c'est l'entre-aide énorme disponible sur le net ...

J'ai laissé des traces actives qui sont gourmandes dans le code, celles-ci se stockent en mémoire,
Pour y remédier, il faut modifier le source du calque action de TestClip,
la fonction : defileModified
supprimmer la ligne : defile.debug=true;

Après plusieurs changement (horizontal -> vertical -> horizontal ect ...) l'interface ralenti. Je n'ai pas trouvé la raison. J'ai vérifié grace à la fonction traceAllChild pour voir si j'avais bien fait le nettoyage (fin de la fonction handleMediaLoaded du calque action dans testClip), et j'ai bien toujours 18 enfants présents sur la scène ...

(bon j'arrête la, sinon je vais écrire un roman !!)
Rejoignez-nous