UIImage: imageWithContentsOfFile работает в 10 раз медленнее в iOS 5.0

#iphone #uiimage #ios5 #imagenamed

#iPhone #uiimage #ios5 #imagenamed

Вопрос:

После простой перекомпиляции нашего приложения для iPhone на недавно выпущенном iOS 5.0 SDK я столкнулся со странной проблемой — все UIImage: imageNamed (первый вызов с фактической загрузкой изображения) и UIImage: imageWithContentsOfFile начали работать в 10 раз медленнее, чем раньше. мне удалось сузить проблему: это относится только к файлам jpeg и png (не к gif!), И это не из-за размера файла. даже простая загрузка небольшого формата png размером 32 * 32 занимает около 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 мс даже на небольших изображениях (4 КБ png). имхо, просто вообще нечего анализировать!

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

Ответ №1:

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

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

Итак, я сел и написал скрипт, который передавал все файлы PNG через программу convert ImageMagick, чтобы сделать из них TGA, затем удалил PNG (просто для пущей убедительности), а затем преобразовал временные TGA обратно в файлы PNG. Таким образом, я убедился, что они не только БОЛЬШЕ НЕ были созданы Photoshop, но и полностью переписаны.

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

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

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

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

Комментарии:

1. спасибо, я обязательно попробую и опубликую здесь, если это поможет. в любом случае, для меня это ошибка (с недавно выпущенным 5.0.1 ситуация не улучшилась), и я скоро отправлю ее в Apple

2. Итак, вы уже пробовали это? У вас это тоже сработало? — Я провел еще несколько тестов, которые подтвердили, что это связано с чтением PNG с диска. На самом деле, судя по другой трассировке профилировщика времени, которую я сделал, iOS5 теряет большую часть времени при создании класса метаданных для считываемого PNG.

3. фантастика! Да, это очень помогает, спасибо! и вы правы — похоже, что метаданные ответственны за это сумасшествие (как для jpeg, так и для png). после повторного сохранения всех файлов png и jpeg без включенных метаданных все начало работать как обычно — изображения загружаются через 30 мс. похоже, что SDK до версии 5.0 ios просто игнорировали любые метаданные png / jpeg

4. Вот скриншот единственной опции photoshop save-for-web, ответственной за эту проблему (должно быть none). Я обнаружил, что эта опция включена по умолчанию в версии Photoshop для macOS и выключена в версии Photoshop для Windows, так что на это стоит обратить внимание lh6.googleusercontent.com/-R_VCI3ky9yQ/Trenrxsl-uI/AAAAAAAAFU4 /…

Ответ №2:

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

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