¿Por qué las imágenes PNG son más grandes en el package de aplicaciones iOS que en mi proyecto?

Estoy en el process de actualizar Hungry Helga (versiones de iPhone y iPad) para iOS 6, y todos los files PNG en los files de mi nuevo package de aplicaciones son entre un 20 y 40 por ciento más grandes que en mis versiones anteriores. Por supuesto, esto me está poniendo sobre el límite de descarga 3G de 50 MB, así que realmente me gustaría descubrir qué está pasando.

Actualmente estoy usando la versión 4.5 de Xcode en OSX 10.7.5. Si recuerdo correctamente, la versión anterior fue construida con Xcode 4.2. Intenté encender y apagar la compression PNG en la configuration de compilation pero eso no tuvo efecto en los tamaños de image en el package.

Para dar un ejemplo concreto, mi image PNG más grande es de 1,9 MB como recurso de origen. Es 2.1 MB en el package de la aplicación anterior y 2.5 MB en el package de la nueva aplicación.

¿Apple cambió la forma en que funciona el compresor PNG o tal vez hay una configuration que me falta o algo así?

No trabajo para Apple ni tengo información privilegiada; sin embargo, hice algunas cosas y tengo algunas teorías. Si usas un terminal, puedes usar cd en Xcode.app y encontrar pngcrush allí:

$ encontrar -name pngcrush ./Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush

Si luego ejecutas:

./pngcrush -? 

encuentras algunas curiosidades interesantes:

| Fue comstackdo con LLVM 4.2.1 Apple Clang 4.0 compatible (tags / Apple / clang-420.0.12) y modificado por Apple como se indica en las fonts.

y

-iphone (optimice para iPhone OS)

Como yo también vi que algunos png grandes, también mucho más grandes en el package que el original (¡que yo mismo había aplastado previamente!), Quería ver cómo Xcode usa pngcrush. Utilicé un viejo truco de UNIX:

  • mover pngcrush a xpngcrush
  • cree un nuevo file de shell ejecutable que llame a pngcrush con la misma list de arguments
  • registra los arguments en un file de text en / tmp

Lo que encontré fue que Apple llama pngcrush como:

pngcrush -q -iphone oldFile newFile

Se puede inferir de esto que esta característica específica de Apple de pngrush fue diseñada específicamente para adaptar la image para iOS. Digo sastre, no aplasto.

¿A Apple realmente le importa si su PNG es el file más pequeño posible, para ahorrar la mayor cantidad de espacio? Discutiría, en realidad no, los dispositivos tienen un espacio de almacenamiento de files bastante grande. ¿Realmente les importa si su aplicación descarga realmente rápido? Una vez más, no discutiría realmente, ya que el usuario asumirá que el time está relacionado con el tamaño de la aplicación y que está bajo el control de los desarrolladores.

Sin embargo, lo que el usuario va a responsabilizar a Apple es la velocidad de lanzamiento. Desde el primer toque hasta cuando la aplicación comienza a hacer algo, la gente creerá que es toda la velocidad del dispositivo (que los desarrolladores sabemos que no es estrictamente cierto). Con el nuevo iPad3, algunas de las imágenes de lanzamiento ahora son realmente grandes, ¿qué se puede hacer para cargarlas lo más rápido posible?

No sé la respuesta a esa pregunta, pero puedo imaginar que Apple descomprime la image original, luego la vuelve a comprimir con configuraciones que hacen que se cargue en el dispositivo lo más rápido posible.

PD:

1) Acabo de deshabilitar la opción de aplastar y he observado que Xcode 4.5 copy mis files png sin modificación.

2) Para networkingucir el tamaño de la aplicación, ¿ha intentado utilizar files JPEG con una configuration de alta calidad, incluso 1? Estas imágenes se verán muy bien y serán mucho más pequeñas. Prácticamente todas las imágenes en mi aplicación son JPEG. Puede experimentar con Vista previa para hacer las conversiones.

EDITAR: se me ocurrió que puede haber una solución elegante a esto. Es decir, para imágenes realmente importantes, las que desea que aparezcan lo más rápido posible, utilice pngcrush con el indicador '-hiphone'. Para otros, utilice más opciones de pngcrush estándar.

Una forma de hacerlo es crear un nuevo directory de imágenes y escribir un file de shell que procese todos los png con una trituradora real o una bandera tje '-iphone', colocando la salida en la carpeta de la image original (donde Xcode puede getlos ) A continuación, desactive la opción 'Archivos PNG Crush'.

EDIT2: ingresé un error en bugreporter.apple.com y publiqué en el listserv de Xcode, si tiene interés en este marcador, la pregunta y volverá cuando esté actualizada.

EDIT3: alguien me dio un enlace que explica con más detalle el cómo y el por qué de la opción '-hiphone' de Apple ImageOptim

EDIT4: Apple respondió a mi informe de errores, confirmando que modifican las imágenes para que sean más fáciles de procesar por iOS, lo que puede hacerlas más grandes, por intención.

Usando el script de David H, encontré que Xcode también está pasando el parámetro de línea de command "-f 0" a pngcrush. La página man indica que "-f 0" deshabilitará cualquier filtrado IDAT antes de la compression, lo que puede resultar en un file PNG más grande. La testing en mi file de ejemplo de 1.9 MB desde arriba confirma:

pngcrush -iphone in.png out.png da el resultado de 2.1 MB que estoy buscando

pngcrush -iphone -f 0 in.png out.png produce el resultado no deseado de 2,5 MB

Ahora las preguntas son: ¿Por qué Apple cambió esto? ¿Rompe la carga de imágenes de alguna manera si trabajo alnetworkingedor? Si no, ¿hay alguna configuration para esto en Xcode o siempre tendré que usar un script para filtrar el argumento "-f 0"?

Xcode 5 ahora tiene cambios en las compresiones de imágenes. Lo mejor y más comprimido es utilizar catálogos de activos.

Si incluso el uso de Xcode 5 y los catálogos de activos no resultan bien para su aplicación, consulte el otro problema relacionado con la optimization de PNG con la herramienta pngcrush para get más respuestas.