2011-10-31 7 views
7

Po prostej rekompilacji naszego iPhone'a na nowo wydanym SDK iOS 5.0 napotkałem dziwny problem - wszystkie UIImage: imageNamed (pierwsze wywołanie z rzeczywistym ładowaniem obrazu) i UIImage: imageWithContentsOfFile zaczęło działać 10 razy wolniej niż wcześniej. udało mi się zawęzić problem: dotyczy to tylko plików jpeg i png (nie gifów!), a to nie z powodu rozmiaru pliku. nawet proste ładowanie małych 32 * 32 png trwa około 300ms ... w porównaniu do 30 ms na starszych urządzeniach (sprawdzone w wersji 3.1 i 4.3.5 z tym samym kodem)UIImage: imageWithContentsOfFile jest 10 razy wolniejsze w iOS 5.0

Próbowałem również załadować obraz przez nowo wprowadzony CIImage z ten kod

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

bez powodzenia ... to pojedyncza linia

CIImage* cii = [CIImage imageWithData:imageData]; 

wykonuje te same 300ms nawet na małych obrazów (4KB pNG). imho, nie ma nic prostego do parsowania!

Czy jest coś, co rozwiąże tak dziwne zmiany czasu ładowania? Na razie wygląda na to, że coś zmieniło się drastycznie w wewnętrznych urządzeniach sdk :(

Odpowiedz

8

.. Miałem ten sam problem i zajęło mi to kilka godzin, aby dowiedzieć się, co poszło nie tak. Nasze dwie sytuacje wyglądały dokładnie tak samo: stary projekt, który nie działał bardzo dobrze na iOS5 jeszcze więcej.

Więc wziąłem Profila Instrument's Time i zagłębiłem się w głąb mojej aplikacji tylko po to, aby dowiedzieć się, że za każdym razem, gdy aplikacja się zawiesiła, faktycznie był w trakcie otwierania plików PNG dla UIImageViews, tak samo jak się dowiedziałeś. Ale inne aplikacje, które napisałem, nie mają tego problemu i zrobiłem wszystko w taki sam sposób. Więc sądząc po tym, czego doświadczyłeś i moje inne aplikacje działały dobrze, pomyślałem, że to musi mieć coś wspólnego z plikami PNG. I zgadnij co, okazało się, że miałem rację.

Więc usiadłem i napisałem scenariusz, który wyposażył wszystkie pliki PNG w konwersję ImageMagick, aby utworzyć z nich TGA, następnie usunął PNG (tylko na dokładkę), a następnie przekonwertował tymczasowe TGA z powrotem na pliki PNG. W ten sposób upewniłem się, że nie tylko nie zostały one stworzone przez Photoshopa, ale również całkowicie przepisane.

To wystarczyło. Wszystko teraz działa płynnie, tak jak na iOS 3 i 4.

Nie jestem pewien, czy ma to coś wspólnego z Photoshopem. Inne aplikacje Ostatnio pracowałem dobrze z plikami PNG wykonanymi w Photoshopie. Być może była to wersja Photoshopa, której użyłem prawie dokładnie rok temu do stworzenia tych plików PNG w pierwszej kolejności.

A może po prostu nadpisanie starych plików graficznych było wystarczające, nie jestem pewien. Ale teraz działa dobrze.

Mam nadzieję, że to pomoże!

+0

dziękuję, na pewno spróbuję i opublikuję tutaj, jeśli to pomoże. w każdym razie wydaje mi się, że to błąd (rzeczy nie lepsze z nowym wydaniem 5.0.1) i wkrótce zgłoszę je Apple wkrótce – IPv6

+0

Czy próbowałeś już tego?Czy to też działa z tobą? - Zrobiłem jeszcze kilka testów, które potwierdziły, że miało to związek z odczytaniem PNG z dysku. Rzeczywiście, sądząc po innym śladzie Time Profiler, który zrobiłem największą część czasu, tracę przez iOS5 podczas tworzenia klasy metadanych dla odczytanego PNG. – Martin

+0

fantastyczne! Tak, to bardzo pomaga, dzięki! i masz rację - wydaje się, że za te crazyny odpowiadają zarówno metadane (zarówno dla jpeg, jak i png). po ponownym zapisaniu wszystkich pngs i jpegów bez włączonych metadanych wszystko zaczęło działać jak zwykle - obrazy ładują się w 30 ms. Wygląda na to, że pakiety SDK w wersji wcześniejszej niż 5.0 iOS po prostu zignorowały wszystkie metadane png/jpeg. – IPv6

4

Może to być błąd: zgłoś radar do Apple poprzez bug reporter. Pamiętaj, aby połączyć prosty projekt, który jasno pokazuje błąd i dołącz go do raportu o błędzie - w przeciwnym razie Apple będzie wysyłać Ci e-mail z prośbą o jeden

zamieścić swoje radaru # tutaj tak innych o podobnym numerze odsyłającego wynika, że ​​przy składaniu # podobny błąd do Apple, jak również

Powiązane problemy