Comunidad de diseño web y desarrollo en internet online

Liberar memoria

Citar            
MensajeEscrito el 17 Dic 2010 12:17 am
Hola buenas creo que desde que llevo programando con as3 es lo que mas se me resiste y no lo doy conseguido. Cuando cargo algo con as3 ya sea una imagen o un swf luego al eliminarlo nunca cnsigo que se me libere de memoria eso que se cargo. Existe alguna manera? por que por ejemplo uso:

Código :

var memoryUsedInKb:Number= Number(System.totalMemory/1024).toFixed(2);


Para monitorizar el consumo de memoria pero siempre sube, no encuentro manera de hacer que baje... algun consejo?

Por n0ldor

55 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Dic 2010 03:52 pm
Es un tema muy tocado el performance del flash player, en tu caso si tu dejas todo bien liberado no te queda mas que esperar que el garbage collector haga su trabajo (cosa que no puedes forzar), consejos hay muchos, si pones en el buscador optimizacion de swf o como descargar recursos veras muchos de ellos, lo mas comun para descargar algo, es nunca dejar alguna referencia a dicho objeto, lo que pasa seguido es que tu lo quieras descargar pero le dejaste varios listener y nunca se descarga o internamente tiene codigo ejecutandose y el garbage no se lo va llevar si sigue en uso (aunque tu creas no usarlo).


Saludos

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Dic 2010 04:00 pm
Pero lo curioso es que hago pruebas simplemente cargando un swf de fuera en el que tiene una animacion con sonidos pero todo en la linea de tiempo, y no hay manera de bajar el consumo al eliminarlo, sigue subiendo y subiendo... y el codigo que uso para agregar y eliminar el objeto es:


Código ActionScript :

var miCarga:Loader = new Loader()
var miURL:URLRequest = new URLRequest()

btcargar.addEventListener (MouseEvent.CLICK, carga);
bteliminar.addEventListener (MouseEvent.CLICK, eliminar);

function eliminar (e:MouseEvent){
   miCarga.unloadAndStop();
}

function carga (e:MouseEvent){
   miURL.url = "clip.swf";
   miCarga.load(miURL)
   cont.addChild(miCarga)
}

Por n0ldor

55 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Dic 2010 05:20 am
Si quieres hacer pruebas para ver si estas liberando bien la memoria utiliza System.gc(); (creo que esa es la sintaxys), con eso se lanza el agrbage collector y puedes ver si estas liberando bien la memoria.



NOTA: Solo funciona en modo debug en la realidad esa linea de codigo no hara nada, solo utilizalo para corroborar que cuando el garbage corra tu liberas todo bien.


Saludos

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Dic 2010 10:43 pm
buenas, si ya lo estaba usando y la verdad es que no libera practicamente nada, que eso es lo que mas me mosquea...

Por n0ldor

55 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Dic 2010 11:31 pm
hola. podrias probar agregandole lo siguiente a la funcion eliminar (aunque no estoy seguro que sea necesario):

Código ActionScript :

cont.removeChild(miCarga);
miCarga = null;


Saludos

Por GustavoV

Claber

136 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 19 Dic 2010 11:58 pm
Nada tampoco... la verdad es que no se yo si estoy pidiendo imposibles... Por ejemplo de base me esta consumiendo 20 mb de ram cargo el swf y me pasa a ocupar 44, si lo elimino espero que me baje por lo menos a 20 y pico, pero no, como mucho mucho me baja a 40, por lo que si vuelvo a cargarlo ya pasa a utilizar 60 y pico, así que como cargue varios archivos al final sube muchisimo...

Le afectará que tenga sonidos en la linea de tiempo?

Por n0ldor

55 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Dic 2010 01:58 am
cont.removeChild(micarga)
miCarga=null;
System.gc()

luego en los listener , eliminas las referencia

Por xcom

Claber

530 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Dic 2010 08:51 am
Como haría para eliminar los listeners? yo normalmente para eliminarlos lo que hago es antes de eliminar el objeto por ejemplo le hago un removeEventListener para los ENTER_FRAME y demas. Existe alguna manera o se hace de esa? a parte como haría para eliminar los listener de un objeto swf cargado de fuera? Un saludo y gracias

Por n0ldor

55 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Dic 2010 04:06 pm
Efectivamente con removeEvent es la manera de deshacerte de los listeners, en el caso de remover tod l de un swf externo yo acostumbro a poner una funcion publica que se llame Kill o algo parecido y cuando lo voy a descargar antes mando llamar swf.Kill(); y alli remuevo todo lo que se necesite.

Para el tema de los sonidos en timeLine,prueba sin sonidos y si tienes un mejor resultado mejor lo smetes por codigo (yo prefiero por codigo para poder controlarlos mas facilmente)

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Dic 2010 07:13 pm
La verdad es que de ninguna manera la bajada de consumo de memoria es significativa. Probando de todo y la verdad es que baja como mucho mucho 5 megas... Si subo los fla le podeis echar un ojo? sino pues nada. Mas que nada por que es un tema que me lleva muchisimo tiempo rompiendo la cabeza y nunca he conseguido optimizar bien.

Un saludo

Por n0ldor

55 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 May 2011 04:17 pm
Hola, este tema del GC si que se puede volver un problema, segun veo el problema que tienes es que asi remuevas el objeto del escenario, la linea de tiempo de dicho MC sigue en ejecución, en la referencias de as3, dice que si una linea de tiempo aun sigue en ejecución evitara que el GC lo elimine.

Proba removiendo el objeto del escenario, poniendo wekReference en true, eliminar todos los listener a dicho objeto, parar la linea de tiempo de dicho objeto. Corriendo el GC.

Por tufik2

30 de clabLevel



 

chrome

 

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