Comunidad de diseño web y desarrollo en internet online

Sobre el Garbage Collector en FP 9

Citar            
MensajeEscrito el 08 Dic 2008 12:58 am
Hola a todos,
Teniendo una clase con sus variables y eventos(dentro de un proyecto), luego de terminar de usarla reseteamos las variables con null y removemos los eventos para luego esperar que el Garbage Collector(GC) actue. Conocen alguna otra forma de optimizar su código(AS3) ? .He leido que generan por ejemplo new TextField() para forzar a que el GC pase y elimine definitivamente lo aún queda(Flash player 9).

Por emedinaa

196 de clabLevel

2 tutoriales

Genero:Masculino  

Lima Perú

firefox
Citar            
MensajeEscrito el 10 Dic 2008 07:21 pm
este tema no creo q sea TABU...
Skinner habla de esto y creanme que no es muy alentador :(

Por emedinaa

196 de clabLevel

2 tutoriales

Genero:Masculino  

Lima Perú

firefox
Citar            
MensajeEscrito el 11 Dic 2008 12:34 pm
Coolin Moock le dedica casi un capítulo, donde dice mas o menos eso, quitar toda referencia, no cargar la CPU y gritar bien fuerte a ver si el GC viene :)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 11 Dic 2008 01:33 pm
sip ese lo revise y luego me fuí donde skinner :), pero el resultado es el mismo... sigue quedando en memoría, hasta cuando??..ah esperara nomas asl GC :(

Por emedinaa

196 de clabLevel

2 tutoriales

Genero:Masculino  

Lima Perú

firefox
Citar            
MensajeEscrito el 11 Dic 2008 01:41 pm
Así es, no se puede forzar el correr el GC

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 11 Dic 2008 01:44 pm
eso es un gran dilema y problema ... :(

Por emedinaa

196 de clabLevel

2 tutoriales

Genero:Masculino  

Lima Perú

firefox
Citar            
MensajeEscrito el 11 Dic 2008 08:52 pm
En un proyecto muy sobrecargado de TODO, mucho me ayudo en la optimizacion y liberacion de memoria el uso de Weak Reference.
Es algo asi:

Uso normal -
loader.addEventListener(Event.COMPLETE, ejecutarMetodo);

Con Weak Reference -
loader.addEventListener(Event.COMPLETE, ejecutarMetodo, false, 0, true);

estos 3 ultimos parametros estan dentro del listener, pero al no asignarlos se autosetean en null automaticamente.
Segun lei cuando lo encontre decia algo como,
"Una vez recibido el evento se depura la memoria hasta la proxima recepcion del evento"
Para mayor informacion consulte a si programador de cabecera, pero era algo asi, a mi me funciono

Slds!

Por Creattive

120 de clabLevel

1 tutorial

Genero:Masculino  

Adobe AIR/Flex developer

chrome
Citar            
MensajeEscrito el 11 Dic 2008 08:58 pm
Sip con las referencias debiles te habla en el essential, como el uso de variables dinámicas (skinner). Indirectamente te dicen: "OPTIMIZA TODO Y PROGRAMA BIEN... " jajaja
A esperar q mejoren el Garbage Collector :) ya que en el flashplayer 10 solo te ayudan en los eventos

Gracias a todos por los comentarios.

Por emedinaa

196 de clabLevel

2 tutoriales

Genero:Masculino  

Lima Perú

firefox
Citar            
MensajeEscrito el 11 Dic 2008 11:10 pm
En el debug player de fp9 y en cualquier fp10 podes usar esto , forzando el paso del GC
flash.system.System.gc();

Saludos

Por EzeQL

3 de clabLevel



Genero:Masculino  

Buenos Aires , Argentina. Third World.

firefox
Citar            
MensajeEscrito el 12 Dic 2008 02:30 am
Hola

El GC se ejecuta automaticamente cuando el bloque de memoria q el SO le asigna al FP le queda corto... o sea... si el SO le asigna 20 mb, hasta el el FP no los utilice no va a ejecutar el GC.... en ese solo caso si la liberacion de memoria no fue la suficiente, el FP le solicita nuevamente 20mb de memoria al FP y aunq en un futuro de la vida de la aplicacion el uso de memoria baja a 3mb el FP nunca libera los 40mb hasta q no es cerrado totalmente el browser.

Por otro lado fijate q si habris varias pag con flash la cantidad de memoria es compartida por todas las instancias de FP que se estan ejecutando, asi q tenes q tener en cuenta la acumulacion.

Lo mejor es llevar un control de los listener q se crean y de las referencias sucias que quedan. Lo mejor es utilizar el Profiler de Flex para revisar paso por paso q hay en la memoria y ver donde queda "pegada" la referencia sucia o el listener no borrado.

Puntos a revisar para optimizaciones:
1. referencias sucias y referencias cruzadas
2. Al utilizar diccionarios ver si se pueden usar referencias debiles
3. Listeners no borrados
4. Alto acoplamiento entre clase
5. Funciones en los handlers de los eventos
6. Funciones anonimas
7. Separar la aplicacion en varias aplicaciones chicas (varios swf en flash o modulos en flex).
8. No sobrecargar en cantidad de objetos, imagenes gigantes, animaciones pesadas

Por otro lado, el FP10 hay una nueva funcion para descargar swf q automaticamente borra todas las referencias y todos los listeners, cosa q no hace el unload() comun.

Aca te dejo unos liks de mis delicios sobre optimizacion
http://delicious.com/tag/flex_tutoriales_optimizacion
http://delicious.com/tag/flex3_tutoriales_optimizacion
http://delicious.com/tag/as3_tutoriales_optimizacion
http://delicious.com/tag/flex_recursos_optimizacion

Espero q te sirva de ayuda, saludos!

Por alfathenus

833 de clabLevel

5 tutoriales

 

buenos aires || Argentina

firefox
Citar            
MensajeEscrito el 12 Dic 2008 05:04 am
flash.system.System.gc(); esto es solo para air :(

Muy interesante la última respuesta,= al final llegamos a que hay q optimizar...
Muchas gracias :)

Por emedinaa

196 de clabLevel

2 tutoriales

Genero:Masculino  

Lima Perú

firefox
Citar            
MensajeEscrito el 15 Dic 2008 11:17 am

Código ActionScript :

System.gc.call();

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Dic 2008 02:34 pm
Podrías poner un ejemplo :)

Por emedinaa

196 de clabLevel

2 tutoriales

Genero:Masculino  

Lima Perú

firefox
Citar            
MensajeEscrito el 15 Dic 2008 02:47 pm
Es parte de una Clase que estaba haciendo: el típico banner de imágenes con una transición _alfa en cada imagen
Aviso que le faltan cosas como, p.e. hacerlo Clase, y aviso que es un "tocho".
Al final del todo, en la función removeImage, llamo al "garbage recolector"

Código ActionScript :

package  
{
   import fl.transitions.Tween;
   import fl.transitions.TweenEvent;
   import flash.display.Bitmap;
   import flash.display.BitmapData;
   import flash.display.DisplayObject;
   import flash.display.Sprite;
   import flash.events.Event;
   import flash.display.Loader;
   import flash.display.LoaderInfo;
   import flash.net.URLRequest;
   import flash.net.URLLoader;
   import flash.events.IOErrorEvent;
   import fl.transitions.Tween;
   import fl.transitions.easing.Elastic;
   import fl.transitions.easing.None;
   import flash.utils.Timer;
   import flash.events.TimerEvent;
   import flash.system.System;
   public class Banner extends Sprite 
   {
      private var actual:DisplayObject;
      private var activo:DisplayObject;
      private var galeriaXML:XML=new XML();
      private var index:Number = 0;
      private var loader:Loader;
      private var myTween:Tween;
      private var myTween2:Tween;
      

      public function Banner() 
      {
         var loaderXML:URLLoader  = new URLLoader();
            loaderXML.addEventListener(Event.COMPLETE, completeHandlerXML);
            loaderXML.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            var request:URLRequest = new URLRequest("galeria.xml");
         loaderXML.load(request);

         loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler,false,0,true);
            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler,false,0,true);

      }
      public function buscarImagen(url:String):void
      {
            var request:URLRequest = new URLRequest(url);
         loader.load(request);
      }
      private function completeHandlerXML(event:Event):void {
         var loader:URLLoader = URLLoader(event.target);
         galeriaXML = new XML(loader.data);
         buscarImagen(galeriaXML.imagen[index].@url);
      }
      private function completeHandler(event:Event):void {
         activo = DisplayObject(addChild(loader.content));
         myTween= new Tween(activo, "alpha", None.easeNone, 0, 1, 1, true);
         myTween.addEventListener(TweenEvent.MOTION_FINISH, pausarImagen,false,0,true);
         if (actual)
         {
            myTween2= new Tween(actual, "alpha", None.easeNone, 1, 0, 1, true);
            myTween2.addEventListener(TweenEvent.MOTION_FINISH, removeImage,false,0,true);

         }
         loader.unload();
      }
      public function pausarImagen(e:Event):void 
      {
            var myTimer:Timer = new Timer(500, 1);
            myTimer.addEventListener("timer", nextImage,false,0,true);
            myTimer.start();
         
      }

      private function ioErrorHandler(event:IOErrorEvent):void {
            trace("Fichero no encontrado");
        }
      private function nextImage(e:Event):void
      {
         index++;
         index %= galeriaXML.elements("imagen").length();
         buscarImagen(galeriaXML.imagen[index].@url);
         actual = activo;
         trace(System.totalMemory.toString());

      }
      private function removeImage(e:Event):void
      {
         var tween:Tween = (Tween)(e.target);
         var bitmap:Bitmap = Bitmap(tween.obj);
         bitmap.bitmapData.dispose();
         removeChild(bitmap);
        //<----AQUI-----//
       //si comentamos la línea veremos que la memoria va aumentando
         System.gc.call();
      }
   }
}

El fichero XML es de la forma

Código :

<galeria>
<imagen id="0" url="images/img01.jpg"/>
<imagen id="1" url="images/img02jpg"/>
<imagen id="2" url="images/img03.jpg"/>
<imagen id="3" url="images/img04.jpg"/>
<imagen id="4" url="images/img05.jpg"/>
</galeria>

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Dic 2008 02:57 pm
Quizá necesite algo de explicación al código. Básicamente lee de un fichero XML y llama a la función "buscarImagen". Esta función, cuando ha cargado la imagen, Hace un fade in sobre la imagen cargada y un fade out sobre la imagen que hubiera anteriormente.
cuando acaba el fade in espera un tiempo para la siguiente imagen, cuando acaba el fade out "remueve" el dato que hubiera.
Lo he tratado de optimizar al máximo (aunque se admiten sugerencias). El caso es que sin la línea

Código ActionScript :

System.gc.call();

veía que cada vez aumentaba más la memoria usada y no veía el momento de que viniera el GC

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Feb 2010 12:31 pm
Yo os aconsejo que dejéis de creer lo que leéis en foros y realicéis pruebas para comprobarlo.

Hazte un sencillo programa que haga un addChild de 10.000 Sprites con listeners, luego los eliminas y comparas la memoria.

Mis resultados han sido estos:

"Usar referencias débiles en vez de fuertes ayuda a liberar memoria" -> FALSO, le da igual
"Eliminar los listeners cuando ya no vamos a usar el objeto" -> FALSO, ocupa hasta más memoria
"Asignar null al objeto" -> FALSO, ocupa hasta más memoria también

Lo único que realmente libera memoria, en Flash 10, es llamar al GC y aún así nunca libera toda la que puede.

Si no se lo creen, probarlo.

Por angel.sanchez

0 de clabLevel



 

chrome
Citar            
MensajeEscrito el 06 Feb 2010 11:52 pm
System.gc.call(); no fuerces esto mejor trabaja con modulos y limpia bien las referencias como dijo alguien..

Por xcom

Claber

530 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.