2010-06-29 16 views
6

Estaba intentando reducir aún más el tamaño de archivo de un archivo SWF mediante la optimización de los gráficos PNG incrustados (utilizando la herramienta ImageOptim). Para mi sorpresa, esto no dió ningún efecto, por lo que creó dos pruebas de archivo:Flex: ¿el compilador flex optimiza automáticamente los activos incrustados de PNG?

Original (433883 bytes)

Optimized (273723 bytes)

Cuando la incrustación de cualquiera de estos activos de una forma sencilla Proyecto de ActionScript, el archivo SWF compilado tiene un tamaño de ~ 274kb. Lo que plantea la pregunta: ¿Flex optimiza los activos incrustados PNG durante el tiempo de compilación? En caso afirmativo, ¿hay alguna documentación sobre la optimización en curso? No puede ser solo por la compresión SWF, ya que comprimir las imágenes no reduce el tamaño del archivo.

Aquí está el código de integridad:

package 
{ 
    import flash.display.Sprite; 

    public class SizeTest extends Sprite 
    { 
     [Embed("/assets/original.png")] 
     private var ImageAsset:Class; 

     public function SizeTest(){ 
     } 
    } 
} 
+0

al comprimir una imagen hace que el archivo sea mucho más grande. así que una mala idea. ¿Estás usando eclipse? si es así, prueba Project> Export Release build. reducirá el tamaño de SWF – Treby

+0

Esta podría ser una pregunta tonta, pero ¿está incluyendo una referencia a SizeTest en su aplicación raíz? Si no, sizeTest no se compila y la imagen no está incrustada. –

+0

@Treby Sí, soy consciente de eso. El archivo SWF exportado se compiló en modo de lanzamiento. @Marty La clase que se encuentra arriba * es * la aplicación raíz. Es un proyecto simple de ActionScript en Flex. – bummzack

Respuesta

4

La respuesta se , el compilador Flex no comprime automáticamente los datos utilizando uno de los algoritmos inbult (probablemente ZLIB) y lo descomprime de forma transparente en el otro lado (flash player) justo antes de que le dé acceso a los datos sin comprimir.

Estaba integrando un ByteArray en un SWF, y aunque los bytes son enormes fuera (200 KB), cuando está incrustado en un SWF se convierte en 30 KB, produciendo casi exactamente los mismos resultados que comprimirlo manualmente usando ByteArray.compress("zlib").

Intenté comprimir PNG/JPEG bitmaps manualmente, y resultó más grande que incrustarlo claramente usando la etiqueta [Embed] (172 KB como ByteArray comprimido frente a 168 KB como imagen incrustada). Dejar que el compilador de Flex maneje la compresión de datos incrustados es mejor que tratar de hacer sus propios trucos en el lado de ByteArray.

Editar: Para responder a su pregunta sobre la incrustación de PNG, es difícil saber qué está pasando dentro del compilador de flex/flash player. Aunque es conocido por la documentación adecuada, Adobe también es conocido por muchas "características no documentadas". Su pregunta específica se envía mejor a un arquitecto de reproductor flash (por ejemplo, Tinic Uro) o un evangelista de adobe (por ejemplo, Lee Brimelow), a algunos de los cuales puede acceder fácilmente en Facebook (consulte este list).

+0

Interesante. Aunque me imagino que un png ya está muy comprimido y no debería ser mucho más pequeño usando zlib? – bummzack

+0

@bummzack - Vea mi publicación actualizada, y sí, parecen usar la compresión más óptima para cada formato de archivo, probablemente apagando la compresión donde no produce mejoras significativas. Descubrí que hagas lo que hagas, la configuración predeterminada de Flex [Embed] siempre funciona mejor. Supongo que aquí hay un lugar en el que Adobe realmente brilla. –

+0

Gracias por su respuesta. Sé cómo marcar una respuesta como 'aceptada' y lo haré, aunque no responde completamente mi pregunta inicial. No estoy haciendo ningún * truco en el lado de ByteArray *. Estaba usando una herramienta de compresión PNG (http://imageoptim.pornel.net/) que hace un * lote * de compresión de imagen especializada (ver: http://optipng.sourceforge.net/pngtech/optipng.html). El uso de la imagen optimizada en lugar del "no optimizado" no redujo el tamaño de archivo del 'swf' compilado. Por lo tanto, me pregunto si el compilador Flex implementa cualquiera de estas técnicas de compresión PNG (ver enlace). – bummzack

2

El formato SWF tiene internamente un formato especial para los archivos PNG de 32 bits (aquellos con un canal alfa), zona que siempre divide en un PNG de 24 bits y una máscara alfa de escala de grises , por lo que la máscara alfa se comprime JPEG. No estoy del todo seguro de si Flex Builder hace ese tipo de optimización, ya que recuerdo que al menos en una versión anterior el PNG incrustado no estaba optimizado en absoluto.

Sin embargo, si usted está buscando una herramienta que puede optimizar las imágenes incrustadas en los archivos SWF que debe salir "reductor" de Joa Ebert: http://blog.joa-ebert.com/2009/08/08/reducer/

+0

Gracias por su respuesta. Conozco la compresión PNG en Flash IDE. Pero AFAIK solo se aplica a Flash IDE y no a Flex. También conozco Reductor de Joa Ebert ... pero todavía me pregunto por qué el tamaño del archivo SWF compilado es básicamente el mismo para ambas imágenes (solo unos pocos bytes) – bummzack

+0

Me pregunto lo mismo también. Optimicé los PNG reduciendo el tamaño de la tabla de cuantificación. el resultado swfs da tamaños de archivo similares. –