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
