[flash/AS] Fuite de memoire

Fuite de memoire [flash/AS] - Flash/ActionScript - Programmation

Marsh Posté le 26-07-2006 à 09:14:00    

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

Reply

Marsh Posté le 26-07-2006 à 09:14:00   

Reply

Marsh Posté le 26-07-2006 à 20:07:16    

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
Reply

Marsh Posté le 27-07-2006 à 16:03:38    

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.

Reply

Marsh Posté le 27-07-2006 à 19:28:04    

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
Reply

Marsh Posté le 27-07-2006 à 21:59:41    

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.

Reply

Marsh Posté le 28-07-2006 à 19:20:55    

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

Reply

Marsh Posté le 30-07-2006 à 22:23:00    

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
Reply

Sujets relatifs:

Leave a Replay

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