Optimisation mémoire

Optimisation mémoire - Flash/ActionScript - Programmation

Marsh Posté le 08-12-2005 à 14:10:34    

Salut all,  :hello:  
 
J'ai réalisé mon Cv Flash mais j'ai un soucis d'optimisation mémoire.
Pour bien comprendre, je vous invite a le visiter : www.13flo.com
 
A chaque changement de page (invoquée par LoadMovieNum), la mémoire vive occupée par l'application augmente de 2 Mo... (c'est ce que je constate dans le gestionnaire des taches d'XP). Donc au bout d'un certain nombre de changement de page, la fluidité d'animation en prend un coup...
 
Voila la fonction qui s'occupe d'appeller la page :
 

Code :
  1. function boutons(acharger) {
  2. nextlevel += 1;
  3. _root.level2delete = nextlevel-1;
  4. var image:MovieClip = this.createEmptyMovieClip("image"+nextlevel, nextlevel);
  5. var mcLoader:MovieClipLoader = new MovieClipLoader();
  6. var listener:Object = new Object();
  7. listener.onLoadProgress = function(target:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void  {
  8.  progression = (bytesLoaded/bytesTotal)*100;
  9.  loading = Math.round(progression)+" %";
  10.  barreloadover._height = Math.round(progression)*2;
  11.  if (bytesLoaded == bytesTotal) {
  12.   clearInterval(interval.id);
  13.  }
  14. };
  15. mcLoader.addListener(listener);
  16. mcLoader.loadClip(acharger, image);
  17. var interval:Object = new Object();
  18. interval.id = setInterval(checkProgress, 3, mcLoader, image, interval);
  19. function checkProgress(mcLoader:MovieClipLoader, image:MovieClip, interval:Object):Void {
  20.  var progress:Object = mcLoader.getProgress(image);
  21. }
  22. }


 
Vous me direz que c'est parceque "j'empile" mes pages.. mais non ! Une fonction s'occupe de supprimer la page masquée par la nouvelle. Et cela marche j'en suis sur.
La voila, appellée quand le masque a finit son boulot :
 

Code :
  1. function supprimer_clip(id) {
  2. if (id != 0) {
  3.  removeMovieClip("container"+id);
  4. }
  5. }


 
 
Si quelqu'un est interressé par ce problème, je pourrai envoyer le fla par mp...
 
Merci beaucoup à celui qui m'aidera ou me proposera une solution mieux adaptée  :love:


Message édité par incognito13 le 08-12-2005 à 14:25:00
Reply

Marsh Posté le 08-12-2005 à 14:10:34   

Reply

Marsh Posté le 08-12-2005 à 14:53:30    

j'ai pas le temps de regarder dans le detail mais tu n'as pas besoin de recreer la classe MovieCliploader a chaque appui sur le ton bouton a charger, declare la qu'une fois et envoie des parametres plutot, si tu veux m'envoyer le fla mon adreese mail et quelque part dans mon CV sur le site du memoire (cf. signature)


---------------
D3
Reply

Marsh Posté le 08-12-2005 à 15:00:36    

Ok je vais essayer ca merci ;)

Reply

Marsh Posté le 08-12-2005 à 16:56:12    

je repond à ton mail ici, ca peut servir a d'autres  :D  
 
>Salut!
Tchô!
 
>Je suis incognito13 du forum.hardware ;)
moi c'est Mechkurt ;)
 
>Tu m'as pas conseillé de ne pas recréer la classe MovieClipLoader a  
>chaque appui de bouton mais je t'avoue que cette notion de classe  
>n'est pas très claire dans mon esprit.
>J'ai trouvé ce script dans l'aide et je l'ai adapté a ma sauce  
>jusqu'à ce que ca marche.
>Donc en fait si je comprend bien, c'est que je crée pusieurs fois la  
>meme classe pour rien ?
>Pourrais-tu me montrer ce que tu aurais fais, si ca te dérange pas  
>bien sûr.
>
>Voila le script :
>--------------------------------------------------------------
>
>function boutons(acharger) {
>    nextlevel += 1;
>    _root.level2delete = nextlevel-1;
>      var image:MovieClip =  
>this.createEmptyMovieClip("image"+nextlevel, nextlevel);
>      var mcLoader:MovieClipLoader = new MovieClipLoader();
>    var listener:Object = new Object();
>    listener.onLoadProgress = function(target:MovieClip,  
>bytesLoaded:Number, bytesTotal:Number):Void  {
>              progression = (bytesLoaded/bytesTotal)*100;
>        loading = Math.round(progression)+" %";
>        barreloadover._height = Math.round(progression)*2;
>              if (bytesLoaded == bytesTotal) {
>            clearInterval(interval.id);
>        }
>    };
>    mcLoader.addListener(listener);
>    mcLoader.loadClip(acharger, image);
>    var interval:Object = new Object();
>    interval.id = setInterval(checkProgress, 3, mcLoader, image,  
>interval);
>    function checkProgress(mcLoader:MovieClipLoader,  
>image:MovieClip, interval:Object):Void {
>        var progress:Object = mcLoader.getProgress(image);
>
>    }
>}
>--------------------------------------------------------------
 
a priori une fois déclaré ta class MovieClipLoader, comme tu lui passe en parametre ce que tu veux charger ta pas besoin de la mettre dans ta fonction bouton, car la a chaque fois que tu clic sur un bouton ca appelle la fonction bouton qui crée une nouvelle classe MovieclipLoader (ceci dit comme il la crée avec le même nom ca devrait ecraser l'ancienne donc je ne pense pas que to PB d'occupation mémoire viennent de la...)
 
je sais pas si je suis clair mais en gros: si tu mets le bloc de declaration de ta classe MovieclipLoader (tout sauf mcLoader.loadClip(acharger, image); qui bien sur doit rester dans la fonction bouton) au dessus du bloc fonction bouton ca devrait marcher aussi bien...
 
pour ton PB de memoire je vois deux possibilité:
=>soit il ne supprime pas les pages (j'ai pas compris comment est appellé ta function:

Code :
  1. function supprimer_clip(id) {
  2. if (_level0.nextlevel>2 && id != 0) {
  3.  removeMovieClip("container"+id);
  4. }
  5. }


mais deja ton occurence crée s'appelle ("image"+id); alors je suis pas sur que ca fonctionne pour verifier fait un:

Code :
  1. function supprimer_clip(id) {
  2.    if (_level0.nextlevel>2 && id != 0) {
  3.       if("image"+id) {
  4.           removeMovieClip("image"+id);
  5.           if("image"+id) {
  6.               trace("image"+id+" existe encore!" );
  7.           }else {
  8.               trace("image"+id+" supprimé!" );
  9.           }
  10.       }
  11.    }
  12. }


=>deuxiemem possibilité, c'est les setInterval du checkProgress que tu ne supprime pas et qui te bouffe des ressources (la ca devrait ramer et non pas prendre plus de memoire mais va savoir...)
vu que tu te coltine une class MovieClipLoader utilise la a fond et passe plutot par le gestionnaire onLoadProgress dédié a ca (et qui marche tres bien)
http://livedocs.macromedia.com/fla [...] 02546.html
si tu tiens vraiment a tes setInterval veille bien a faire des clearInterval quand tu en as plus besoin (et a faire un delete en plus ca ne mange pas de pain ;) )
 
>Je t'ai aussi mit la source la :
//ligne supprimé je suppose que t'as pas plus que ca que googlebot scan ton repertoire de stockage  ;)  
au fait c'était source.rar et pas source.fla mais j'ai trouvé quand même...
 
>Jte remercie d'avance ! ;)
de rien
 
>Florian, étudiant en Services et Réseaux de Comm. à Saint-Raphaël  
>(Var).
Matthieu bénévole sur hardware.fr


---------------
D3
Reply

Marsh Posté le 09-12-2005 à 17:39:26    

Salut et merci beaucoup mechkurt !
 
Je m'occupe de ca des que j'ai le temps et je post la solution pour ceux a qui ca pourrait servir !
 
See ya!

Reply

Marsh Posté le 12-12-2005 à 16:10:11    

je sais pas si t'as déja résolu ton truc...
mais je crois bien que la méthode "removeMovieClip" le dégage de la scene mais en le gardant en mémoire...
essaie de faire un unloadMovie à la place... ca devrais le décharger completemnet de l'animation et donc de la ram...

Reply

Marsh Posté le 14-12-2005 à 17:30:43    

Salut,
 
en fait tu avais bien raison mechkurt. c'est ma fonction de suppression des clips maskés qui marchait pas. En fait je passais mal la valeur "id" du cli a supprimer. Donc la ca donne ca :
 

Code :
  1. function supprimer_clip(id) {
  2. id -= 2;
  3. removeMovieClip("_level0.image.image"+id);
  4. }


 
A la premiere image clé du clip chargé :
 

Code :
  1. id = _parent._parent._parent.nextlevel;


 
A la derniere :
 

Code :
  1. _parent._parent._parent.supprimer_clip(id);


 
 

Citation :

je crois bien que la méthode "removeMovieClip" le dégage de la scene mais en le gardant en mémoire...


 
 :non: Spa vrai  :)  
 
Merci pour votre aide !  :hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed