2010-11-23 1 views
0

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

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

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

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

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

ответ

-1

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

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

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

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

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

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

Cheers, John.

+1

-1. Изображения эффективно обрабатываются как текстуры на графическом процессоре, и (насколько мне известно) используют бикубическую интерполяцию по умолчанию. – 2010-11-23 03:38:09

Смежные вопросы