AS3. Liberar la memoria de recursos cargados externamente es un infierno
Nos encontramos con una aplicación de tantas en la que debemos cargar contenidos externos por demanda del usuarÃo: una galerÃa de fotos, un catálogo de productos, etc, etc.
Vamos cargando esas imágenes o swf´s en nuestra aplicación y todo es muy bonito y fabuloso… hasta que algo empieza a fallar, se ralentiza o simplemente deja de funcionar. !Mierda! mi pc no vale para nada! Lo tiras por la ventana y te compras uno nuevo… pero a ver, si en mi ordenador que es un pepino, no funciona, los clientes lo van a flipar más aún.
Fuera de bromas, todo esto pasa porque lo que vamos cargando se almacena en memoria, y cuando hacemos desaparecer un contenido, no lo estamos aniquilando debidamente.
Resulta que el tÃpico MovieClip.unloadMovie() de AS2 ha desaparecido en el olvido. Ese método se cargaba cualquier cosa que hubiera cargado externamente, liberando asà la memoria y haciéndonos más felices y contentos. En cambio, en AS3 la cosa se complica mucho. Según leo en el blog de gSkinner, éstos son los motivos del problema, y por los cuáles serÃa imposible “descargar” algo:
- Cualquier listener, timer, o variable que haga referencia al contenido cargado
- Un contenido cargado con la lÃnea de tiempo reproduciéndose
- Un contenido cargado con algún listener que se refiera al stage, o a cualquier cosa fuera de su ámbito
Y creo que no podrÃa explicarlo mejor que gskinner en este párrafo:
“In AS3, calling Loader.unload() simply removes the reference to the loaded movie. If any other references exist to the loaded content, it will not be unloaded. Even when all references are removed, it only frees the content for collection by the garbage collector at some indeterminate point in the future. This means that even if everything worked as expected the loaded content will continue to execute, and remain in memory for an indeterminate amount of time after you unload it. This is problematic in many ways, but it is made worse by a bug in the player.“
Parece mentira que a estas alturas con un señor Flash Player 9 y el tan supuestamente mejorado y todo poderoso ActionScript 3.0, nos encontremos con que la gestión de memoria es lo más decadente que nos podamos echar encima.
Aunque no todo es feo y negativo. Por lo visto con Flash Player 10 está medio resuelto el problema, y esperemos que este player se extienda rápido para poder producir con él.
Otro buen artÃculo sobre gestión de recursos, tambien de Grant Skinner.
Ala! a disfrutar con Adobe

July 25th, 2008 at 3:27 am
Buenas !! al parecer no somos pocos los que estamos esperando que solucionen este agujero del Flash player.
Vamos a que que tal funcionan las posibilidades que ofrecera FP10..
Saludos!
July 25th, 2008 at 11:38 am
Buena pinta tiene… toda la información que hay sobre las nuevas caracterÃsticas me parece muy interesante, sobre todo el acceso a disco duro del usuario sin necesidad de pasar por servidor, soporte para 3D (muy limitado por cierto), efectos mucho más potentes, soporte para hydra, etc. Pero creo que lo más importante serÃa que arreglaran todos los bugs conocidos que nos quitan mucho tiempo y energÃas, en lugar de hacer fuegos artificiales. No me gusta cuando se dejan lagunas por el camino.
Un saludo