Как управлять памятью на iPhone при обработке множества изображений - PullRequest
0 голосов
/ 28 июля 2010

У меня есть какая-то уникальная проблема в проекте, в котором я работаю. Я создаю своего рода «стену» прокручиваемых изображений, которые загружаются с сервера, который наш пользователь может пролистать на iPhone , Но проблема в том, что у нас возникают проблемы при разработке хорошего плана управления памятью. Сейчас у нас работает класс подклассов UIImageView, который используется для хранения каждого изображения, которое мы загружаем с сервера (хотя эти изображения сохраняются в каталоге документов приложения), а затем мы также добавляем метаданные данные к нему (то есть описание, теги и т. д.). Затем мы сохраняем это в NSMutableArray, который затем перебираем все изображения, чтобы разместить их в нашей стене. Как вы можете себе представить, наличие всех этих изображений в памяти - огромная огромная память. Нам трудно найти способ сделать это без использования такого большого количества памяти. Одна из самых больших проблем, которая усложняет задачу, заключается в том, что при размещении изображения должны сообщать о них при касании. Поэтому я не думаю, что мы можем просто освободить их после размещения. Кто-нибудь из вас имел опыт работы с объектами любого вида с большим размером, подобным этому, и должен был иметь их под рукой, чтобы рисовать на экране, играть и т.д.? Какой тип техники или подход вы предлагаете? Я читал о CoreData, но не знаю, ищу ли я это. Цени любую помощь.

Вот основной метод рисования для справки:

РЕШЕНИЕ: Видео сессия WWDC # 104!

Ответы [ 4 ]

1 голос
/ 28 июля 2010

Это в основном было решено для вас Дэвидом Голайти .Мы успешно использовали код ImageCache для 600+ изображений без проблем.Из-за того, как работает кэширование, мы легко пролистываем 300 изображений PNG 512x512 на iPhone и iPad с высокой частотой кадров в секунду.

1 голос
/ 28 июля 2010

Пока изображения поступают с диска и считываются одним из удобных методов UIImage, UIImage будет сохраняться в файле и при необходимости освобождает память.Он будет перечитывать файл при необходимости.Это все только в UIImage документах между прочим.

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

1 голос
/ 28 июля 2010

Так что на самом деле, вам нужна система постановки и снятия представления с экрана, когда они приходят и уходят.

Простой пример, на который вы должны обратить внимание, - это приложение Photos, которое уже существует на вашем iPhone. Хотя у вас может быть миллион изображений на «стене», вы можете видеть только столько изображений одновременно на вашем экране. Это означает, что вам не нужен миллион UIImageViews для всех изображений на стене, только около 20, которые умещаются на экране.

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

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

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

0 голосов
/ 28 июля 2010

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

Кроме того, создайте пользовательский вид (подкласс UIView), который рисует изображение (в drawRect), когда оно видно, и выгружает изображение, когда оноэкран.

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