Blog

Precarga en Flash aparece a la mitad - 856 visitas

Seguramente te haya pasado que, al ver tu película Flash en un navegador, un rectángulo blanco sustituye por un tiempo a lo que debería ser tu película y, un tiempo después, aparece la precarga directamente en el 60% o en cualquier otro valor inusualmente alto, en lugar de empezar por el 0% que sería lo ideal. Este es un problema que se consulta constantemente en todos los foros de Flash, y que, en mi opinión, está muy mal documentado en castellano para ActionScript 3 en concreto. Por esa razón, y más si te encontraste con este tipo de problema al usar mi Precarga en ActionScript 3, voy a dar unos pequeños consejos para, en la medida de lo posible, evitar que la precarga aparezca incompleta.1

1. ¿Por qué mi precarga aparece incompleta?

Fig. 1

Fig. 1

La precarga aparece incompleta debido al proceso de carga que sigue Flash Player. Diversos elementos de la película (clases importadas mediante import y símbolos exportados para ActionScript, fundamentalmente) se cargan en el primer fotograma de la película, para así poder ser usados en toda la línea de tiempo sin ningún error en tiempo de ejecución. No obstante, hasta que Flash no carga un fotograma, no puede mostrarlo; si estamos hablando del primer fotograma, tan sólo veremos un rectángulo blanco donde debería estar la película hasta que ese fotograma se cargue por completo. Si hay muchos elementos que se tienen que cargar en el primer fotograma y su tamaño es muy grande con respecto al de la película completa, tendremos que, para cuando la precarga aparezca, le faltará muy poco para terminar.

2. ¿Cómo puedo evitar que mi precarga aparezca incompleta?

Algunos de los elementos que se exportan en el primer fotograma pueden ser movidos para que se exporten en otro distinto; esto es lo único que podemos controlar. Las clases que importemos mediante la sentencia import siempre se cargarán en el primer fotograma. No obstante, liberar el primer fotograma de todos los símbolos de la biblioteca puede mejorar notablemente el tiempo inicial de carga de la película. Después de todo, nadie quiere que el usuario vea un espacio blanco durante demasiado tiempo.

Fig. 2

Fig. 2

Los símbolos que exportamos para ActionScript y que, por defecto, se cargan en el primer fotograma, son los que tienen activada la casilla “Exportar para ActionScript” (Fig. 1).
Si tienes la configuración por defecto, debajo aparece otra casilla titulada “Exportar en fotograma 1“. Desactivar esta casilla tan sólo tiene utilidad cuando el símbolo se coloca directamente en la línea de tiempo en tiempo de creación (la clase correspondiente se exportaría en el mismo fotograma en el que aparece el símbolo), pero no tiene ninguna utilidad cuando este se instancia dinámicamente; por tanto, vamos a prescindir de esta opción.

Así pues, vamos a cambiar el fotograma de exportación de clases. Para ello, en la versión CS4 nos dirigimos a Archivo –> Configuración de publicación … –> Configuración… (Script). En esta ventana (Fig. 2), en el recuadro “Exportar clases en fotograma:” escribimos un número distinto de 1 (si el fotograma no existe, el compilador emitirá un error), y ya tenemos solucionados gran parte de nuestros problemas. Esta medida sólo requiere la precaución de no hacer referencia por código a ningún símbolo de la biblioteca hasta que se cargue el fotograma 2. Por ello, todo el código del tipo

var foo:Square = new Square();

Que nosotros tuviéramos en el primer fotograma, tendremos que moverlo al segundo. Si este código estaba en la función constructora de una clase, tendremos que colocarlo en una función init() e invocarla cuando el segundo fotograma esté cargado, simplemente llamándola en ese momento.

3. Mi precarga aparece antes, pero no desde el 0%. ¿Por qué?

Como dije, no todos los elementos que se cargan en el primer fotograma pueden ser controlados por nosotros. Aun así, puedo dar algunos consejos prácticos para reducir el tamaño de ese primer fotograma:

  • Cuidado con los objetos 3D en la línea de tiempo. Poner manualmente la propiedad z de un objeto en 1 (!) puede aumentar en un muchicientos por cien el peso del primer fotograma, mientras que colocándolo mediante código, ese aumento es mucho menos acusado.
  • Los paquetes que no se utilizan no se añaden a la película, pero trata de optimizar tu código para que los que utilices estén eficientemente aprovechados.
  • Aprovecha la carga de archivos externos. Esto, aparte de reducir peso en tu película, te permitirá obtener otras ventajas a la hora de actualizarla. Es una muy buena práctica.

Sin embargo, hay que notar también que el tiempo de espera antes de la aparición de la película y el porcentaje en el que comienza la precarga no van unidos. Por ejemplo, puede haber 300 KiB para cargar en el primer fotograma, pero si la película completa ocupa 600 KiB, entonces empezará en el 50%. No obstante, si ocupara 2 MiB, empezaría mucho antes.

4. Quiero una solución definitiva para este problema

No la hay. Hay una alternativa, que es cargar el SWF externamente, usando una película como contenedor. Esto ahorraría el espacio en blanco y haría que la precarga comenzara en el 0%. No obstante, esto no siempre es posible; por ejemplo, puede ser que enviemos un juego a una página de juegos en Flash, en cuyo caso sólo podríamos enviar un SWF (que yo sepa; nunca lo he probado, si dejaran enviar dos la solución consistiría en lo que acabo de decir).

Y eso es todo. Acuérdate de suscribirte a mi blog por correovía RSS.

¡Muchas gracias!

Notas

  1. Gran parte de la información contenida aquí procede de mi investigación personal, así que no aseguro su fiabilidad []

PenosoMaluchoAceptableBuenoBrillante 3 valoraciones - ¡Vota!

¿Te ha gustado esta entrada?

¡Suscríbete al Feed RSS o, si lo prefieres, suscríbete por correo para leer más como esta! También puedes valorar esta entrada más arriba, dejar tu comentario personal o enviar un trackback. ¡Muchas gracias!

Comentarios - 4 hasta ahora

  1. AndyX® dijo:
    Miércoles, 25 Marzo de 2009 a las 00:35 |

    Hola amigazoooo!!!!!!!

    En el caso de que la pagina web solo te permita enviar un SWF, puedes decirle al SWF CONTENEDOR, que cargue el otro SWF desde otra web, jajaj.

    Todavía no probé este método del todo. Pero en cuánto termine el nivel 1. Lo pruebo y te digo.

    Un abrazo.

    Saludos.

    AndyX®
    AndyX©
    AndyX™

    Utiliza Google Chrome Google Chrome 1.0.154.53 bajo Windows Windows XP
    1. Juanlu001 dijo:
      Miércoles, 25 Marzo de 2009 a las 15:27 |

      ¡Buenas!

      También lo había pensado, pero con las nuevas políticas de seguridad de Flash Player 10 (las cuales no controlo mucho, para ser sincero) podrían hacer el proceso más complicado de lo que parece.

      ¡Saludos!

      Utiliza Google Chrome Google Chrome 2.0.170.0 bajo Windows Windows XP
  2. Franco dijo:
    Domingo, 3 Mayo de 2009 a las 10:27 |

    Genial me funciono! muchas gracias man!

    Utiliza Mozilla Firefox Mozilla Firefox 3.0.10 bajo Windows Windows XP
  3. Juanlu001 dijo:
    Domingo, 3 Mayo de 2009 a las 22:41 |

    ¡Me alegro, no hay de qué! :)

    Utiliza Mozilla Firefox Mozilla Firefox 3.0.10 bajo Ubuntu Linux Ubuntu Linux

¡Deja un comentario!

XHTML: Puedes usar las siguientes etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped=""> . Para incluir un avatar (imagen a la izquierda del comentario), accede a http://gravatar.com