Problème animation chute de neige en boucle

Messages postés
6
Date d'inscription
vendredi 19 novembre 2010
Statut
Membre
Dernière intervention
23 novembre 2010
- - Dernière réponse : dj_ouf
Messages postés
221
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
6 septembre 2011
- 24 nov. 2010 à 10:19
Bonjour,

Etant complètement novice dans le codage AS3, j’ai donc utilisé le code suivant tirer d’un tutoriel.
//Nbr de flocon à générer
var quantite:uint=3000;
//Taille de la scene
var LargeurScene:uint=stage.stageWidth;
var HauteurScene:uint=stage.stageHeight;
for (var i:uint = 0; i<quantite; i++) {
//création du nouveau flocon
var FloconNouveau:Flocon = new Flocon();
//Propriété nom
FloconNouveau.name='Flocon'+i;
modifierAspect(FloconNouveau,true);
//La fonction onEnterFrame simule le déplacement de la tête de lecture
FloconNouveau.addEventListener(Event.ENTER_FRAME,animation);
}
//Fonction pour modifier l'aspect des flocons
function modifierAspect(FloconActuel:MovieClip,origine:Boolean):void {
//Positionnement sur la scene et dimension
with (FloconActuel) {
x=Math.random()*LargeurScene;
//si true donc début de l'animation le flocon apparait n'importe ou verticalement
if (origine) {
y=Math.random()*HauteurScene;
} else {
//si false en cours d'animation le flocon demarre en haut de l'écran
y=0;
}
/*scaleX scaleY alpha prennent des valeurs de 0 a 1 en AS3 */
scaleX=scaleY=alpha=.1+Math.random()*.8;
}
/*Gestion du déplacement pour chaque flocon
La vitesse est déterminé au hasard*/
FloconActuel.VitesseVerticale=2+Math.random()*5;
//Affiche le flocon sur la scene
addChild(FloconActuel);
}
//fontion pour animer les flocons
function animation(NomParticule:Event):void {
//Recupere le nom du flocon
var FloconActuel:MovieClip=NomParticule.currentTarget as MovieClip;
//trace(FloconActuel.name);
FloconActuel.y+=FloconActuel.VitesseVerticale;
//si nous atteignons le bas de la scene
if (FloconActuel.y>=HauteurScene) {
modifierAspect(FloconActuel,false);
}
}


Le problème que je rencontre survient lorsque le swf (paramétré pour une lecture en boucle) se relance, c’est-à-dire au niveau du départ du second cycle.

Ce problème est un ralentissement considérablement de mon animation donnant l’impression que mes 6 Go de Ram ne suffisent plus à la faire tourner. Mes clips s’affichent à la vitesse approximative de 1/s, de même pour la chute de mes flocons.

Je souhaiterai qu’il n’y ai aucun changement dans la vitesse d’exécution de l’animation après la lecture complète du premier cycle.

En espérant avoir été claire dans la description.

Merci de votre aide.
Afficher la suite 

13 réponses

Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
0
Merci
Bonjour,

En réduisant le nombre de flocons, ça donne le même résultat ?

Peg'
Commenter la réponse de pegase31
Messages postés
6
Date d'inscription
vendredi 19 novembre 2010
Statut
Membre
Dernière intervention
23 novembre 2010
0
Merci
j'ai fait le test avec 1000 flocons

je constate une accélération de toute mon animation mais aussi un phénomène qui pourrait s'apparenter à un additionnement à chaque cycle de 1000 flocons. ce qui me donne le bon rythme à partir du 3e cycle.
Commenter la réponse de mavrick117
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
0
Merci
C'est donc que ton animation est trop lourde pour ton ordinateur.
Flash devient vite une usine à gaz quand on démultiplie les objets animés à l'écran.

Peg'
Commenter la réponse de pegase31
Messages postés
6
Date d'inscription
vendredi 19 novembre 2010
Statut
Membre
Dernière intervention
23 novembre 2010
0
Merci
Une usine à gaz ... ça c'est certain
mais je pense qu'elle devient lourde à cause des flocons...

voici deux liens :
[www.rmirre.com/1000.html 1000 flocons]
[www.rmirre.com/3000.html 3000 flocons ]

on observe clairement la multiplication des flocons dans "1000 flocons" et je pense que c'est de la que vient le problème.

J'ai testé ces deux animations sur un mac puissant et après quelques cycles le nombre de flocons ralenti quand même le swf...

une idée pour éviter cette multiplication de flocons après chaque cycles.
Commenter la réponse de mavrick117
Messages postés
221
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
6 septembre 2011
0
Merci
Salut

Y'a moyen d'optimiser à fond ton anim...

Déjà, que les flocons soient des sprites au lieu de MovieClip. (flash.display.Sprite dans le panel propriété du symbole dans le biblio), si il ne contient pas d'anim bien-sûr. Ça vire tous les fonctions inutiles.
Ensuite cacheAsbitmap = true en propriété lors de sa création dans dans ton code.

Et je vois aussi qu'a chaque fois qu'un flocon sort de la scène, on refait x fois un Math.random(), ce qui est très pompeux. Pourquoi ne pas stocker leurs position d'origine qu'on re-set tout simplement ?
flocon.x = flocon.initX;
...


Et tu es à quel framerate ? (12 fps, 30 fps ?)

ça n'est pas normal que flash rame à ce point au lancement pour quelques flocons de neige...

Ah je vois voir un gros soucis là :
Un addEventListener(Event.ENTER_FRAME,animation) sur chaque objet flocon ???? ne cherche plus c'est ça aussi.
Il en faut un seul sur le stage, et à l'intérieur tu boucle seulement sur le nombre d'enfants sur la scène, ce qui a pour effet de récupérer chaque flocon.
(for var i:uint=0; i<scene.numChildren; i++) {
     var flocon:Sprite = scene.getChildAt(i) as Sprite;
}
Commenter la réponse de dj_ouf
Messages postés
6
Date d'inscription
vendredi 19 novembre 2010
Statut
Membre
Dernière intervention
23 novembre 2010
0
Merci
les liens ne fonction pas donc :

1000 flocons
www.rmirre.com/1000.html

3000 flocons
www.rmirre.com/3000.html
Commenter la réponse de mavrick117
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
0
Merci
Moi ce que je peux te conseiller c'est de placer toutes les instances de flocons dans un Vector (cs4 uniquement) et de faire tourner l'enterframe sur le tableau.
Ensuite, tu peux aussi utiliser un bitmap qui prennent moins de place qu'un Sprite niveau gestion de la transparence. (contrairement à l'as2, le bitmap et manipulable directement)

Bref, c'est très simple d'optimiser tout ça.

Peg'
Commenter la réponse de pegase31
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
0
Merci
Ah oui, j'oubliais que pour les liens il faut mettre le "http://" devant, sinon ça ne fonctionne pas.

Peg'
Commenter la réponse de pegase31
Messages postés
221
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
6 septembre 2011
0
Merci
Peg' a très bien complété les dernières atuces.. avec tout ça, cela devrait vraiment être fluide!
3000 flocons de 4x4 pixels, c'est vraiment pas le st graal !

Sinon moi sur mon pc, avec ton lien ça tourne déjà pas mal.
Commenter la réponse de dj_ouf
Messages postés
6
Date d'inscription
vendredi 19 novembre 2010
Statut
Membre
Dernière intervention
23 novembre 2010
0
Merci
Avant tout merci de passer du temps sur mon projet !!

Alors je pense que tu dois avoir raison de A à Z mais je suis vraiment débutant dans ce domaine... j'ai appris tout seul la mise en scène de calques dans un scénario "whaou!^^" et là tu me propose de modifier un code que j'ai plagié sur un tuto... j'en perds mes cheveux...

J'ai bien sur tenté de modifier le code avec tes propositions et Flash Pro cs5 m'avertit d'une dizaine d'erreur de syntaxe ! Ce qui est normal vu que je ne connais pas ce langage ...

J'ai aussi tenté de convertir les MovieClips en sprites mais en vain ...

Désolé de t'infliger mon manque de connaissance mais tu es mon seul espoir !
Commenter la réponse de mavrick117
Messages postés
221
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
6 septembre 2011
0
Merci
Tout d'abord, félicitations pour la mise en scène de calques

Alors pour les MovieClip à transformer en calques, va dans la bibliothèque, tu clique droit sur le symbole incriminé (Flocon) -> propriétés -> et là tu as un chap classe de base qui est à "flash.display.MovieClip", et tu changes en "flash.display.Sprite".
Commenter la réponse de dj_ouf
Messages postés
6
Date d'inscription
vendredi 19 novembre 2010
Statut
Membre
Dernière intervention
23 novembre 2010
0
Merci
Merci dj_ouf

J'ai donc suivi tes indications pour transformer les MovieClip ... Merci beaucoup !

J'ai essayé d'introduire les règles que tu m'as gentiment conseillé mais je rencontre quelques difficultés :

-la première est l'introduction de
flocon.x = flocon.initX;

pour remplacer x=Math.random():

dois-je faire ceci ? :
//Positionnement sur la scene et dimension
with (FloconActuel) {
flocon.x = flocon.initX;


-le seconde est l'introduction de
(for var i:uint=0; i<scene.numChildren; i++) {
     var flocon:Sprite = scene.getChildAt(i) as Sprite;
}

Je ne sais vraiment pas quoi en faire ...

-la troisième est l'introduction de
cacheAsbitmap = true


je l'ai introduit comme cela
//Propriété nom
FloconNouveau.name='Flocon'+i;
modifierAspect(FloconNouveau,true);
cacheAsbitmap = true

mais je suis quasi sûr que j'ai totalement faux!!

et pour finir j'ai remplacé tous les MovieClips par Sprite dans le code... est-ce bon ?

Merci!
Commenter la réponse de mavrick117
Messages postés
221
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
6 septembre 2011
0
Merci
Salut,

Alors pour le initX, c'est ça. L'astuce est simplement de stocker avant sa valeur en X de départ, pour éviter d'exécuter des Math.random() très souvent.
Ne pas oublier de définir initX par contre :
flocon.initX = flocon.x
(pendant la création des flocons).

Pour parser le liste des flocons sur la scène, tu avais ceci :
FloconNouveau.addEventListener(Event.ENTER_FRAME,animation);


Il faut désormais le faire sur le stage, pour qu'on ai qu'une unique boucle enterFrame. Et la boucle permet de récupérer tous les flocons, à placer dans l'écouteur animation.

En enfin :
flocon.cacheAsbitmap = true

C'est une propriété de flocon (movieClip ou sprite, pour simplement en faire une "rasterisation", c-a-d transformer en bitmap pour gagner en perf.
Commenter la réponse de dj_ouf