Обновление сохраненных изображений для Retina Display - PullRequest
0 голосов
/ 23 ноября 2010

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 23 ноября 2010

Экраны, заполненные старыми изображениями, будут вялыми при первом просмотре, а затем - быстрее.

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

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

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

Проблемы с параллелизмом интересно отслеживать ...

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

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

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

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

Я не могу помочь вам в повышении частоты дискретизации, но где-то будет какой-то код.

Ура, Джон.

...