Forums Développement Multimédia

Aller au contenu

Libération de mémoire

CODE Actionscript

6 réponses à ce sujet

#1 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 07 July 2013 - 20:14 PM

Bonjour à tous.

Un soucis de libération de mémoire se pose à moi. Dans le jeu que je suis en train de faire, je crée des objets par lots puis les détruit au fur et à mesure que leur utilité n'est plus. Lorsque je détruis ces objets, je pense les détruire correctement afin de supprimer l'instance ainsi créée, mais je me rends compte grâce au profiler que ces instances existent toujours en mémoire, et ceci cause évidement une fuite mémoire progréssive...

Voici quelques extraits de code :

la classe principale de la zone de jeu

private var lineNumber             :uint         = 20;
private var lineNumberList       :Array  = [];
private var displayedItemList :Array  = [];
private var toTrashItems                :Array = [];

public function startTheGame (): void
{
                //Pour chaque ligne prévue, je crée un sprite vide qui sert de conteneur, puis je le stocke dans un array pour y acceder                 facilement
                for (var j:int = 0; j < lineNumber; j++)
                {
                  var s:Sprite = new Sprite();
                  addChildAt(s, j);
                  linelineNumberList.push(s);
                }
}

private function createItem():void
{
         // on crée un item et on lui assigne une position random
         var gameItem :Game_Item   = new Game_Item ();
         var newY       :uint   = Math.random() * lineNumber;
         gameItem.y = newY;
         // j'utilise la position Y pour définir quel conteneur utiliser
         // puis je stocke cette position dans une variable de cet objet           //afin de le supprimer facilement plus tard
         var targetContainer :Sprite = lineNumberList[Math.floor(newY) - 1] as Sprite;
         targetContainer.addChild(gameItem );
         copy.creationYPos = newY;
         // j'ajoute l'item créé a la liste d'items présentement a l'ecran
         displayedItemList.push(gameItem);
}
public function moveItems(moveSpeedX:Number):void
{
                // je déplace chaque objet a l'ecran
                for (var i:int = 0; i < displayedItemList.length; i++)
                {  
                          displayedItemList[i].x -= moveSpeedX;

                          // si l'objet est a une certaine position, je le detruis
                          if (displayedItemList[i].x + displayedItemList[i].width < 0)
                          {
                                 trashItem(displayedItems[i]);
                                 displayedItems.splice(i, 1);
                          }
           }
}
private function trashItem (toTrash:*):void
{
                // je récupere l'objet et son conteneur, je retire l'objet et supprime tout ce qui peut faire appel a cette instance
                var targetContainer:Sprite;
 
                targetContainer = lineNumberList[uint(toTrash.creationYPos)] as Sprite;
                targetContainer.removeChild(toTrash);
                toTrash.disposeView();
                toTrash = null;
}
 


extrait de la classe Game_Item

public  var item_loader  :Item_Loader;
private var character  :Game_Character;

public var skin :Image;
public var shadow   :Image;

public var isShadow              :Boolean;
public var isCollectable                 :Boolean;
public var creationRules                 :ItemCreationRules;
public var creationYPos  :Number;

public function disposeView ():void
{
                // je supprime tout ce qui pourrait garder l'instance active
trace ('item disposed');
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
 
removeChild(skin);
removeChild(shadow);
 
character        = null;
creationRules  = null;
item_loader  = null;
shadow  = null;
skin    = null;
}
 


Il s'agit d'extraits simplifiés, ne prenez pas peur si par erreur j'ai fait une faute de frappe, ou un point virgule qui manque. Je ne sais pas si cela change quelque chose, j'utilise Starling, si cela rajoute une couche pour supprimer les instances.

En tout cas, d'après mes controles, les fonctions trashItem() et les fonctions disposeView() sont bel et bien appellées, pourtant le profiler de Flash Builder m'indique bien que les instances des Game_Items ne sont pas supprimées, je remarque de même une augmentation de la latence en cours de jeu qui me confirme que cette suppression n'est aps réalisée.

#2 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 07 July 2013 - 21:21 PM

Salut,

Si je ne m'abuse, tu ne les supprimes pas les sprites de lineNumberList du coup les instances sont toujours référencées dans ce tableau et le GC n'opère pas.

(J'ai peut-être mal vu)
Word hard, play hard.

#3 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 07 July 2013 - 21:44 PM

Coucou

Merci pour ta réponse.
Je ne supprime pas les sprites conteneurs stockés dans lineNumberList car je ne crée ces conteneurs qu'une seule et unique fois au lancement du jeu, ensuite j'utilise ces conteneurs pour afficher correctement les objets que je crée tout au long du jeu.

Il est donc normal que je ne supprime pas ces conteneurs, je souhaite seulement supprimer correctement toutes les instances d'objets que je crée au fil du jeu et que j'ajoute a ces même conteneurs tout au long de la partie.

#4 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 07 July 2013 - 21:59 PM

Je pense avoir trouvé, dans la fonction trashItem, je ne ciblait pas correctement les conteneurs :

targetContainer = lineNumberList[toTrash.creationYPos] as Sprite;
doit en fait être
targetContainer = lineNumberList[toTrash.creationYPos - 1] as Sprite;

Les items n'etaient donc pas correctement retirés du parent conteneur ! Merci pour ta réponse Galacta qui m'a fortement mis sur la piste !

#5 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 07 July 2013 - 22:07 PM

Et avec un skin.dispose() dans disposeView ?
Word hard, play hard.

#6 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 07 July 2013 - 22:32 PM

Hum, à présent les instances se détruisent correctement d'après ce que je peux observer dans le profiler. Penses-tu que je doive tout de même ajouter cette fonction dispose dans les skin afin de faire les choses proprement jusqu'au bout ?

#7 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 08 July 2013 - 09:31 AM

Je dirais que oui, essaye et vois la différence avec un appel à dispose(), qui est fait pour libéré la mémoire utilisée en interne par Starling.
Word hard, play hard.



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP