Comunidad de diseño web y desarrollo en internet online

Control de objetos en memoria en AS3

En este proyecto en Actionscript 3 cuento con una lista que me va mostrando constantemente los objetos que hay en memoria. Si el objeto es borrado, desaparecerá automáticamente de la lista, además el primer item me indica la memoria utilizada.

En un juego, es muy común armar una clase Game y crear un objeto de esa clase. Y a la hora de reiniciar, o volver a jugar borrar ese objeto y crear uno nuevo. Pero muchas veces, quedan MovieClips, y objetos almacenados en memoria que no fueron bien borrados. Por esta razón, este control de memoria es muy importante.



Archivos del Tutorial

Main.as

Código :

package  
{
   import classes.RAMController;
   import flash.display.MovieClip;
   import flash.display.Sprite;
   import flash.events.Event;
   /**
    * ...
    * @author Lucas Moyano
    */
   public class Main extends Sprite
   {
      public var objectA:MovieClip;
      public var objectB:MovieClip;
      
      public function Main() 
      {
         addChild(RAMController.ins());
         
         RAMController.ins().add(objectA, "ObjectA");
         RAMController.ins().add(objectB, "ObjectB");
         
         objectA.addChild(objectB);
         
         objectA.removeChild(objectB);
         objectB = null;
         
         removeChild(objectA);
         objectA = null;
      }
   }
}


RAMController.as

Código :

package classes 
{
   import fl.controls.List;
   import flash.display.Sprite;
   import flash.events.Event;
   import flash.events.TimerEvent;
   import flash.system.System;
   import flash.utils.Dictionary;
   import flash.utils.Timer;
   /**
    * ...
    * @author Lucas Moyano
    */
   public class RAMController extends Sprite
   {
      private static var instance:RAMController;
      
      private var  objects   :Dictionary;
      private var list      :List;
      private var timer      :Timer;
      
      public function RAMController() 
      {
         objects   = new Dictionary(true);
         list       = new List();
         timer    = new Timer(1000);
         addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
      }
      
      private function onAddedToStage(e:Event):void 
      {
         removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
         show();
      }
      
      public static function ins():RAMController
      {
         if (!instance) instance = new RAMController();
         return instance;
      }
      
      public function add(object:*, reference:String):void
      {
         objects[object] = reference;
         update();
      }
      
      public function update():void
      {
         var object:*;
         var reference:String;
         
         list.removeAll();
         list.addItem( { label: Number(System.totalMemory / 1024 / 1024).toFixed( 2 ) + "Kb" } );
         
         for (object in objects)
         {
            reference = objects[object];
            list.addItem( { label:reference } );
         }
         System.gc();
      }
      
      public function show():void
      {
         timer.addEventListener(TimerEvent.TIMER, onTickTimer);
         addChild(list);
         timer.start();
      }
      
      public function hide():void
      {
         timer.removeEventListener(TimerEvent.TIMER, onTickTimer);
         removeChild(list);
         timer.reset();
      }
      
      private function onTickTimer(e:TimerEvent):void 
      {
         update();
      }
   }
}

Publica tu comentario

El autor de este artículo ha cerrado los comentarios. Si tienes preguntas o comentarios, puedes hacerlos en el foro

Entra al foro y participa en la discusión

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate