2011-10-31 31 views
7

Dopo aver semplicemente ricompilato la nostra applicazione iPhone su iOS 5.0 SDK appena rilasciato ho dovuto affrontare strani problemi - tutti UIImage: imageNamed (prima chiamata con caricamento immagine effettivo) e UIImage: imageWithContentsOfFile ha iniziato a funzionare 10 tempi più lenti di prima. Sono riuscito a restringere il problema: questo è il caso solo per i file jpeg e png (non per i gif!) e questo non dipende dalle dimensioni del file. anche il caricamento diretto di piccoli 32 * 32 png richiede circa 300ms ... rispetto ai 30ms su dispositivi precedenti (verificati su 3.1 e 4.3.5 con lo stesso identico codice)UIImage: imageWithContentsOfFile è 10 volte più lento in iOS 5.0

ho anche provato a caricare l'immagine tramite CIImage appena introdotto con questo codice

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!"); 

senza alcuna fortuna ... questa singola linea

CIImage* cii = [CIImage imageWithData:imageData]; 

prende gli stessi 300ms anche su piccole immagini (4Kb PNG). imho, non c'è niente da analizzare affatto!

C'è qualcosa per risolvere questo strano cambiamento nei tempi di caricamento? Per ora sembra che qualcosa sia cambiato drasticamente in sdk internals :(

risposta

8

.. Ho avuto lo stesso problema e mi ci sono volute un paio d'ore per scoprire cosa non andava. Le nostre due situazioni sembravano essere esattamente le stesse: un vecchio progetto che non funzionava molto bene su iOS5 e y di più.

Così ho preso Instrument's Time Profiler e ho scavato nella profondità della mia app solo per scoprire che ogni volta che l'app è appesa, era in procinto di aprire file PNG per UIImageViews, proprio come hai scoperto anche tu. Ma altre app che ho scritto non hanno questo problema e ho fatto tutto allo stesso modo. Quindi, a giudicare da ciò che hai provato e che le mie altre app funzionavano bene, ho pensato che dovesse avere qualcosa a che fare con i file PNG stessi. E indovina un po ', si è scoperto che avevo ragione.

Quindi mi sono seduto e ho scritto uno script che convogliava tutti i file PNG attraverso il convertitore di ImageMagick per farne fuori TGA, quindi cancellato i PNG (solo per buona misura) e poi convertito i TGA temporanei in file PNG. In questo modo ho fatto in modo che non fossero più solo creati da Photoshop, ma anche completamente riscritti.

Questo ha funzionato. Ora tutto funziona senza problemi, proprio come ha fatto su iOS 3 e 4.

Non sono sicuro che abbia qualcosa a che fare con Photoshop. Altre app Recentemente ho funzionato bene con i PNG realizzati con Photoshop. Quindi forse era la versione di Photoshop che usavo praticamente esattamente un anno fa per creare quei PNG in primo luogo.

O forse semplicemente sovrascrivendo i vecchi file di immagine erano sufficienti, non ne sono sicuro. Ma ora funziona bene.

Spero che questo aiuti!

+0

grazie, farò sicuramente un tentativo e postare qui se aiuta. comunque mi sembra un bug per me (cose non migliori con la nuova versione 5.0.1) e lo lancerò presto ad Apple – IPv6

+0

Quindi, l'hai già provato?Ha funzionato anche con te? - Ho fatto qualche altro test che ha confermato che aveva a che fare con la lettura del PNG dal disco. In realtà, a giudicare da un'altra traccia di Time Profiler che ho fatto la parte più grossa del tempo, iOS5 si perde durante la creazione della classe di metadati per il PNG che viene letto. – Martin

+0

fantastico! Sì, questo aiuta molto, grazie! e hai ragione - sembra che i metadati siano responsabili di queste crassi (sia per jpeg che per png). dopo aver salvato tutti i PNG e JPEG senza che i metadati siano abilitati, tutti hanno iniziato a funzionare come al solito - le immagini si stanno caricando in 30 ms. sembra che gli SDK ios precedenti alla 5.0 abbiano semplicemente ignorato i metadati png/jpeg – IPv6

4

Potrebbe essere un bug inoltrare un radar ad Apple tramite lo bug reporter. Assicurati di creare un semplice progetto che mostri chiaramente il bug e collegalo al bug report - altrimenti Apple invierà una e-mail chiedendo una

Inserisci radar # qui così altri con un problema analogo si può fare riferimento al momento della presentazione che # un bug simile ad Apple come pure

Problemi correlati