iPhone: быстрое чтение многих изображений - PullRequest
2 голосов
/ 22 августа 2010

У меня есть приложение, над которым я работаю, где мы обрабатываем много изображений одновременно в виде прокрутки. (Вот как это выглядит, каждый синий блок на изображении в виде прокрутки расширяется вправо: http://i.stack.imgur.com/o7lFx.png) Таким образом, чтобы справиться с большой нагрузкой, это накладывает на память. Итак, я реализовал несколько методов такие как повторное использование изображений и т. д., которые все работали довольно успешно для сохранения моего использования памяти. Еще одна вещь, которую я делаю, это вместо того, чтобы сохранять фактическое изображение в памяти (что я, конечно, не мог сделать для всех из них, потому что это закончится память очень быстро) Я только сохраняю путь к файлу изображения в памяти, а затем читаю изображение, когда пользователь прокручивает область прокрутки рядом с этим изображением. Однако, хотя это эффективно для памяти, это вызывает ОЧЕНЬ задержку в просмотре прокрутки о том, что он должен постоянно читать изображения с диска. Я не могу придумать хорошее решение о том, как это исправить. По сути, сейчас приложение выводит на экран только видимые изображения uiimageviews, и пока пользователь прокручивает приложение, посмотрите, может ли он удалить другой образ поэтому ему не нужно выделять другое, и в этот момент он считывает изображение в память, но, как я уже сказал, это вызывает очень медленное действие прокрутки. Любые идеи о стратегии, чтобы использовать, чтобы исправить это? Кто-нибудь знает, что делает приложение родных фотографий, чтобы справиться с такими вещами? Большое спасибо!

Ответы [ 3 ]

1 голос
/ 16 ноября 2010

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

Лучше было бы лениво загружать запрошенные изображения в фоновом режиме, пока основной поток продолжает обрабатывать анимацию прокрутки. Библиотека, которая обеспечивает эту функциональность (помимо прочего), является библиотекой 'three20'. См. Документ Tidbits и прокрутите вниз, где описывается класс TTImageView.

1 голос
/ 22 августа 2010

Я могу предложить вам простое решение для балансировки как памяти, так и компьютерной обработки. Вы сохраняете в памяти только небольшие изображения, такие как миниатюры, и сохраняете только около 20 из них. Один проект, которым я занимаюсь, - я сохраняю 20 миниатюрных изображений (100 x 100), к которым недавно обращались, что не требует больших затрат памяти. Я считаю, что это все время стоит около 200 кб, но по сравнению с общедоступной памятью. Я думаю, что это достаточно хорошо.

Это также зависит от вашего варианта использования: если пользователь прокручивает очень быстро, и вы не знаете, когда он пойдет. Вы можете иметь даже меньшие изображения, чем thumnail, и когда вы показываете его в UIImageView, вы изменяете размер, чтобы соответствовать. Когда пользователь останавливает прокрутку на некоторое время. Вы можете начать загрузку больших изображений, и тогда у вас будут более хорошие изображения. Пользователь может даже не заметить о процессе

Я не думаю, что есть решение, которое может быть быстрым и использовать как можно меньше памяти. Потому что у нас есть память, может быть, не большая, но достаточно, если мы используем ее с умом.

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

У меня была похожая проблема со средством просмотра PDF. Рекомендованный способ сделать это - получить изображение с низким разрешением, насколько это возможно, и если вы разрешаете пользователю увеличивать / увеличивать изображение, тогда две версии или три версии этого изображения, увеличивая разрешение по мере продвижения.

Поместите столько кода, сколько вы можете избежать в методе didDecelerate (например, загрузку изображений с высоким разрешением, о которых говорит vodkhang), вместо обработки загрузок в didScroll. Утилизируйте виды из области видимости, как вы сказали. и остерегайтесь автоматически выпущенных контекстно-зависимых функций создания изображений.

Интеллектуальная загрузка изображений в фоновые потоки (в зависимости от положения смещения scrollView и уровня масштабирования), и подумайте об использовании чертежа CALayer / Tiled Layer для больших изображений.

Three20 (библиотека iOs с открытым исходным кодом) имеет великолепный просмотрщик фотографий, который можно разделить на подклассы, имеет навигацию по миниатюрам, просмотр больших изображений, кэширование и жесты прямо из коробки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...