Обновление сохраненных изображений для отображения сетчатки

StackOverflow https://stackoverflow.com/questions/4251950

Вопрос

У меня есть приложение для iPhone, среди прочего, позволяет пользователям хранить фотографии. Когда новое фото добавляется в хранилище данных приложения, я кэширую эскизную версию изображения, так что фотография миниатюрных решеток загружается в разумное количество времени.

Проблема в том, что эти эскизы выглядят великолепно на экране дисплея Pre-Retina, но они выглядят немного размыты на RD-дисплее. Не так плохо, что изображения являются непригодными, но мне очень хотелось бы получить полное преимущество Retina Display для изображений, которые пользователи, сохраненные с более старыми версиями моего приложения.

Проблема в том, что повторно создание всех этих миниатюр вступает слишком долго. В моих тестах потребовалось около полутора минут, чтобы переинтересовать базу данных образца к миниатюрам High-Res (по общему признанию большой) на моем iPhone 4. Это будет еще хуже на старом оборудовании.

Как я могу обойти это? Одноразовая миграция кажется вне вопроса, учитывая результаты производительности выше. Другие варианты сокращают эскиз лениво (то есть как они отображаются на экране), а затем сохраняют их в базу данных в этой точке. Экраны, полные старых изображений, будут вялыми, впервые их просматриваемые, а затем Snappier после этого.

Есть ли другие подходы для рассмотрения? Кто-нибудь еще столкнулся с этой проблемой?

Это было полезно?

Решение

Экраны, полные старых изображений, будут вялыми, впервые их просматриваемые, а затем Snappier после этого.

Это не нужно быть вялым.

Это кусочек боли, но вы можете сделать большую часть вашей обработки в фоновом потоке. Установите приоритет потока на что-то низкое (например, 0,1), чтобы не заставить пользовательский интерфейс слишком медленно. Самый простой способ сделать это - настроить Nappation для каждого изображения, необходимое для преобразования и добавления их в NSOPERURICUEUE с MaxConcurrentOperationCount = 1.

Если пишеты не атомные, в -aplicationDiodenterBackgroundground: или -ApplicationWillterminate: (или в чем-то слушании для соответствующих уведомлений об уведомлениях), сделайте что-то вроде [queue cancelAllOperations]; for (NSOperation * operation in queue) { [operation setThreadPriority:1]; } [queue waitUntilAllOperationsAreFinished];; Вы получаете около 10 секунд или около того, что должно быть достаточно для преобразования изображения, чтобы закончить запись на диск (и, таким образом, избегать полуписовных файлов). Для дополнительной защиты проверьте [operation isCancelled] непосредственно перед записью, если бы она займет больше 10 секунд. Очевидно, в -aplicationWillenterforeglege :, вы должны перезапустить преобразование (вспоминание, что некоторые из изображений уже были преобразованы).

Вопросы параллелизма веселые, чтобы отслеживать ...

(Обратите внимание, что [data writeToFile:path atomically:YES] Не достаточно - это, вероятно, оставит временные файлы, лежащие, если приложение будет убито во время записи. Я бы порекомендовал хранить эскизы в основных данных, если вы можете, но это может быть выйти из вопроса для существующих приложений.)

Другие советы

  1. Мне не нравится идея, которую вы пытаетесь преобразовать изображения.
  2. Пользователь быстро будет нетерпелив и сказать, что приложение багги и занимает века для загрузки.
  3. Я думаю, что вы решаете ситуацию без какой-либо переработки полноразмерных изображений.
  4. На более старом аппаратном обеспечении у вас не было бы отображения сетчатки (поэтому не нужно использовать изображения). Если у них есть отображение сетчатки, у них есть Fast iPhone iPod.

Я бы предложил вам графически решить проблему тем, как вы отображаете изображения миниатюр. Таким образом, вместо полноэкранного экрана поместите границу вокруг этого изображения и показать ее в своем истинном разрешении (не выделяйте его). Или показать 4 изображения, где вы обычно показываете 1 (поскольку экран iPhone 4x разрешение).

Вместо того, чтобы повторить исходное массивное изображение, вы можете сделать бикубический разъем миниатюр, что делает его 4x размер. Это сделает его слегка размытым, но он должен выглядеть лучше, чем масштабирование iPhone, которое будет выглядеть очень плохо. Упразмерный ультра будет быстро, так как его работает с небольшим изображением.

Я не могу помочь вам на подъеме, но где-нибудь будет какой-то код.

Ура, Джон.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top