2011-10-31 19 views
7

Después de simplemente recompilar nuestra aplicación de iPhone en iOS 5.0 SDK recientemente lanzado me enfrenté a un problema extraño - todos UIImage: imageNamed (primera llamada con carga de imagen real) y UIImage: imageWithContentsOfFile comenzó a funcionar 10 tiempos más lento que antes. Logré reducir el problema: este es el caso solo para archivos jpeg y png (¡no gif!) y esto no se debe al tamaño del archivo. incluso la carga directa de 32 * 32 png pequeños toma alrededor de 300ms ... comparado con 30ms en dispositivos más antiguos (revisado en 3.1 y 4.3.5 con el mismo código exacto)UIImage: imageWithContentsOfFile es 10 veces más lento en iOS 5.0

También traté de cargar imágenes a través de CIImage recientemente introducido con este código

WLLog(@"Data loading..."); 
NSData *imageData = [NSData dataWithContentsOfFile:path]; 
WLLog(@"CIImage creation..."); 
CIImage* cii = [CIImage imageWithData:imageData]; 
WLLog(@"CIImage creation ok..."); 
float scle = 1.0; 
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000 
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
    scle = [[UIScreen mainScreen] scale]; 
} 
#endif 
CIContext *context = [CIContext contextWithOptions:nil]; 
UIImage* res5 = [[UIImage alloc] init]; 
WLLog(@"UIImage creation..."); 
[res5 initWithCGImage:[context createCGImage:cii fromRect:cii.extent] scale:scle orientation:UIImageOrientationUp]; 
WLLog(@"Done!"); 

sin ninguna suerte ... esta sola línea

CIImage* cii = [CIImage imageWithData:imageData]; 

toma los mismos 300ms incluso en pequeñas imágenes (4 Kb PNG). ¡Enhorabuena, no hay nada fácil de analizar en absoluto!

¿Hay algo para resolver un cambio tan extraño en los tiempos de carga? Por ahora parece que algo cambió drásticamente en sdk internals :(

Respuesta

8

.. Tuve el mismo problema y me llevó algunas horas descubrir qué fue lo que salió mal. Nuestras dos situaciones parecían exactamente iguales: un proyecto antiguo que no funcionaba muy bien en iOS5 y y más

Así que tomé Instrument's Time Profiler y profundicé en la profundidad de mi aplicación solo para descubrir que cada vez que colgaba la aplicación, en realidad estaba en el proceso de abrir archivos PNG para UIImageViews, tal como descubrió también. Pero otras aplicaciones que escribí no tienen este problema, e hice todo de la misma manera. Entonces, a juzgar por lo que experimentaste y porque mis otras aplicaciones funcionaban bien, pensé que debía tener algo que ver con los archivos PNG. Y adivina qué, resultó que tenía razón.

Así que me senté y escribí un script que canalizaba todos los archivos PNG a través de la conversión de ImageMagick para hacer TGAs de ellos, luego borraba los PNG (solo para una buena medida) y luego convertía los TGA temporales a archivos PNG. De esa manera, me aseguré de que no solo NO fueran creados por Photoshop, sino que también fueran completamente reescritos.

Eso hizo el truco. Todo funciona sin problemas ahora, al igual que en iOS 3 y 4.

No estoy seguro de si tuvo algo que ver con Photoshop. Otras aplicaciones Recientemente funcioné bien con PNG hechos con Photoshop. Así que tal vez fue la versión de Photoshop que usé hace exactamente un año para crear esos PNG en primer lugar.

O tal vez simplemente sobrescribir los viejos archivos de imagen fue suficiente, no estoy seguro. Pero ahora funciona bien.

Espero que esto ayude!

+0

gracias, definitivamente intentarlo y publicar aquí si ayuda. de todos modos parece un error para mí (las cosas no son mejores con el recién lanzado 5.0.1) y lo archivaré a Apple pronto – IPv6

+0

Entonces, ¿ya lo has probado?¿Funcionó con usted también? - Hice algunas pruebas más que confirmaron que tenía que ver con leer el PNG desde el disco. De hecho, a juzgar por otra huella de Time Profiler que hice, se pierde la mayor parte del tiempo en iOS5 al crear la clase de metadatos para el PNG que se lee. – Martin

+0

¡fantástico! Sí, esto ayuda mucho, ¡gracias! y tienes razón, parece que los metadatos son los responsables de estas locuras (tanto para jpeg como para png). después de volver a guardar todos los archivos png y jpegs sin metadatos habilitados, todos comenzaron a funcionar como siempre: las imágenes se cargan en 30 ms. parece que los SDK pre-5.0 ios olvidaron cualquier metadato png/jpeg. – IPv6

4

Podría ser un error. Envía un radar a Apple a través del bug reporter. Asegúrate de juntar un proyecto simple que demuestre claramente el error y adjúntalo al informe de fallo - de lo contrario de Apple le enviará un correo electrónico pidiendo una

Publica tu radar # aquí para que otros usuarios con un problema similar que puede hacer referencia a # al presentar un error similar a la de Apple, así

Cuestiones relacionadas