UIImage: imageWithContentsOfFile в 10 раз медленнее в iOS 5.0 - PullRequest
7 голосов
/ 31 октября 2011

После простой перекомпиляции приложения iPhone на недавно выпущенном iOS 5.0 SDK я столкнулся со странной проблемой - все UIImage: imageNamed (первый вызов с фактической загрузкой изображения) и UIImage: imageWithContentsOfFile начали работать в 10 раз медленнее, чем раньше.Мне удалось сузить проблему: это касается только файлов JPEG и PNG (не GIF!), и это не из-за размера файла.даже простая загрузка небольших 32 * 32 PNG занимает около 300 мс ... по сравнению с 30 мс на старых устройствах (проверено на 3.1 и 4.3.5 с точно таким же кодом)

Я также пытался загрузить изображение через недавно введенныйCIImage с этим кодом

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

без всякой удачи ... эта единственная строка

CIImage* cii = [CIImage imageWithData:imageData];

занимает те же 300 мс даже на небольших изображениях (4Kb png).imho, парсировать вообще нечего!

Есть ли что-нибудь, чтобы разрешить такое странное изменение времени загрузки?На данный момент похоже, что что-то кардинально изменилось во внутренних документах SDK: (

Ответы [ 2 ]

8 голосов
/ 04 ноября 2011

У меня была такая же проблема, и мне потребовалось несколько часов, чтобы выяснить, что пошло не так. Наши две ситуации казались совершенно одинаковыми: старый проект, который больше не работал на iOS5.

Таким образом, я взял инструмент профилирования времени Instrument и углубился в мое приложение, чтобы выяснить, что каждый раз, когда приложение зависало, оно фактически находилось в процессе открытия файлов PNG для UIImageViews, как вы тоже узнали. Но другие приложения, которые я написал, не имеют этой проблемы, и я сделал все так же. Поэтому, судя по тому, что вы испытали, и что мои другие приложения работали нормально, я решил, что это как-то связано с самими файлами PNG. И угадайте что, оказалось, что я был прав.

Поэтому я сел и написал сценарий, который передавал все файлы PNG через преобразование ImageMagick, чтобы сделать из них TGA, затем удалял PNG (просто для примера), а затем преобразовывал временные TGA обратно в файлы PNG. Таким образом я убедился, что они не только больше не созданы Photoshop, но и полностью переписаны.

Это добилось цели. Теперь все идет гладко, как на iOS 3 и 4.

Я не уверен, было ли это как-то связано с Photoshop. Другие приложения, с которыми я недавно работал, отлично работают с PNG, созданными с помощью Photoshop. Так что, возможно, это была версия Photoshop, которую я использовал ровно год назад для создания этих PNG.

Или, может быть, достаточно просто перезаписать старые файлы изображений, я не уверен. Но теперь все работает отлично.

Надеюсь, это поможет!

4 голосов
/ 31 октября 2011

Это вполне может быть ошибкой. Отправьте радар в Apple через репортера . Обязательно соберите простой проект, который наглядно демонстрирует ошибку, и приложите его к отчету об ошибке - в противном случае Apple отправит вам электронное письмо с просьбой об одном.

Опубликуйте свой радар # здесь, чтобы другие пользователи с похожей проблемой могли ссылаться на # при отправке аналогичной ошибки в Apple.

...