#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.