Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1087 connectés 

  FORUM HardWare.fr
  Programmation
  Flash/ActionScript

  [flash/AS] Fuite de memoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[flash/AS] Fuite de memoire

n°1413577
Lunatik3
Serial nounours
Posté le 26-07-2006 à 09:14:00  profilanswer
 

Bonjour,  
Je viens ici pour vous demander votre aide sur un sujet un peu pointu. (étonnant non?)
 
Je vous presente mon probleme:
Je ne trouve pas le moyen de supprimer de la memoire des objets que j'instancie.
Normalement le garbage collector devrait les supprimer. Mais ce n'est pas le cas.
 
Je vous montre mon jeu de test.  
Sur un fichier .as externe:
 

Code :
  1. class ObjetTest{
  2.  
  3.   // tableau contenant tout mes objets
  4.   private static var tab:Array = new Array();
  5.  
  6.  
  7.   // methode de creation de mes innombrables objets (20000!!!)
  8.   // histoire que cela prenne un peu de place
  9.   public static function main():Void{
  10.    for(var i:Number=0; i < 20000;i++){
  11.     tab.push(new Object());
  12.    }
  13.   }
  14.  
  15.   // methode cencé detruire mes objets  
  16.   public static function destruction(){
  17.   for(var i:Number=0; i < tab.length;i++){
  18.    // remplace la reference a l'objet par null
  19.    //tab[i] = null;  
  20.    tab[i] = undefined
  21.    // delete supprime la reference à l'objet
  22.    delete tab[i];
  23.   }
  24.   }
  25.  
  26. }


les deux methodes sont appelé par des boutons crées en brutace dans le fla (pas besoin de faire les chose trop clean pour le test)
un bouton pour creer et un bouton pour detruire.  
 
Resultat: les objets prennent grosso modo 6Mo à la creation. (verification avec le gestionnaire des taches)
A la destruction, les objets sont bien déferencer, mais la memoire n'est pas vidé par le garbage collector. d'ou une fuite de memoire.  
 
Ceci est un fla de test. J'ai le même probleme sur une vraie application: un jeu en flash.
 
Voila, je vous montre les sources du test pour les curieux:
source
 
Voila si quelqu'un a une idée sur le sujet, il aura toute ma reconnaissance (je n'ai rien d'autre a offrir, desole)
 
merci d'avance.
 
pierrot la lune

mood
Publicité
Posté le 26-07-2006 à 09:14:00  profilanswer
 

n°1414092
craps_youp​la
Posté le 26-07-2006 à 20:07:16  profilanswer
 

oui effectivement, il n'y a aucune différence entre un tableau vide et un tableau vide :D là tu crées un tableau vide, que tu remplaces par un tableau vide...
 
essaie plutôt :
 
tab.push(new Object({sTest:'foobar'}));
 
ça ira beaucoup mieux...j'ai une différence de 20 megs.
 
chose à savoir, Flash remplit les tableaux vides d'undefined, essaie-ça dans l'IDE :  

Code :
  1. var aTest:Array = new Array();
  2. aTest[23] = 'foobar';
  3. trace('aTest : ' + aTest);


 
ta méthode de destruction comporte donc deux lignes redondantes.


Message édité par craps_youpla le 26-07-2006 à 20:10:26
n°1414694
Lunatik3
Serial nounours
Posté le 27-07-2006 à 16:03:38  profilanswer
 

Merci de m'avoir repondu. mais cela ne change rien au probleme.
Je ne remplace pas un tableau vide par un tableau vide. J'ajoute 2000 objet a mon tableau (j'ai fait la meme manip avec l'objet ObjetTest initialement. Je ne suis pas sur que flash remplisse les valeur par des undefined. Du moins ça n'a pas de sens vu qu'on ne connait pas lla taille initiale du tableau. Par contre vu que flash, voit que la variable tab[23] n'a jamais été initialisé alors il donne par defaut la valeur undefined.
 
Ma methode de destruction est certe quelque peu redondannte, mais au final cella ne change rien. que j'utilise delete ou undefined voir null. la memoire ,n'est pas vidé ensuite par le garbage collector.

n°1414886
craps_youp​la
Posté le 27-07-2006 à 19:28:04  profilanswer
 

tu fais une erreur triviale. essaie le code que je t'ai posté, et fait un trace() sur ta classe pour comprendre le remplissage des tableaux par undefined. tu n'as visiblement pas essayé.
 
- Flash ne remplit rien à l'instanciation du tableau,
- si arr[n], Flash remplit le tableau d'undefined jusque n,
- si delete arr[n], Flash remplace arr[n] par undefined, on ne peut effacer totalement arr[n], sinon les index se décaleraient évidemment, donc on insère une valeur nulle à la place.
 
Object() est une valeur nulle, avec une valeur residuelle, un poids effectif en mémoire, mais ça reste une valeur vide indéfinie.
 
undefined est une valeur nulle, avec une valeur residuelle, un poids effectif en mémoire, mais ça reste une valeur vide indéfinie.
 
tu viens de comparer deux tableaux strictement identiques, ton code démontre simplement que Object() = undefined.
 
ça fonctionne parfaitement avec Object({prop = 'foobar'}), là on a des objets d'un côté, et des undefined de l'autre, il y a donc une différence notable.
 
pour effacer un tableau en AS2, delete arr; ou simplement arr = new Array();
 
ou Array.pop() si tu utilises ton tableau comme une liste.
 
utilises ASDK (http://www.themidnightcoders.com/asdk/index.htm), tu retrouveras des structures de données traditionnelles un peu moins rapides mais plus faciles à saisir.


Message édité par craps_youpla le 27-07-2006 à 19:32:47
n°1414929
Lunatik3
Serial nounours
Posté le 27-07-2006 à 21:59:41  profilanswer
 

je veux bien te croire que si on asigne l'index 23 , les index précedent sont effectivement placer en undefined.
(meme si je ne vois pas le rapport avec le probleme.)
 
note: pour le remplissage de tableau par undefined je parlais de l'avant assignation de la valeur sur l'index 23.  
 
pour objet: je ne te l'ai deja dis. j'ai utilisé le meme code mais en plaçant dans le tableau l'objet ObjetTest.  
j'ai aussi essayer avec l'ajout d'un attributr a la con: {prop = 'foobar'}. Meme combat.
J'ai d'ailleur le probleme avec des objets beaucoup (mais alors vraiment beaucoup) plus complexe. C'est d'ailleur pour ça que j'en suis venu a diminuer le probleme jusqu'a ce niveau.
 
 
Et le faite est que chez moi (et sur d'autre poste de travail d'ailleur), la memoire ne se vide pas.
 
j'ai essayé aussi de supprimer la reference au tableau "delete tab", j'ai meme tenté un splice en désespoire de cause.
Toujours le meme probleme
lorsque je vais supprimer un movie clip avec removemovieclip, je n'ai pas ce probleme, par contre pour degagé un objet de base en memoire.... c'est la lutte.

n°1415543
craps_youp​la
Posté le 28-07-2006 à 19:20:55  profilanswer
 

ok, je renonce, ça devient surréaliste, la réponse est au-dessus.

n°1416168
Lunatik3
Serial nounours
Posté le 30-07-2006 à 22:23:00  profilanswer
 

Non, justement. je pense que tu n'as pas saisi le probleme de fond.
Et non au final, tout ce que tu me propose je l'ai deja essayer et sans succes.
Que ce soit en faisant un delete tab ou tab = new array() et c'est justement ça qui me desespere.
 
enfin merci quand meme d'avoir essayé :)


Message édité par Lunatik3 le 30-07-2006 à 22:25:36

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Flash/ActionScript

  [flash/AS] Fuite de memoire

 

Sujets relatifs
version evaluation flash mx2004[.NET] Objet Graphics, DrawImage et occupation mémoire
Le portage d'un tit jeu .exe pour en faire un jeu flash !!?Problème avec getURL dans une animation flash
[opengl]Pb: liberation mémoire textures [RESOLU]analyseur de code pour dépassement mémoire
Ou trouver des bons cours Pour Flash 8 et actionscript ?Débutant Macromedia Flash -> script pour faire une pause de 5s
Pb flash sur mobile 
Plus de sujets relatifs à : [flash/AS] Fuite de memoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR