UIImageView против UIView W / Image - эффективность - PullRequest
8 голосов
/ 12 января 2012

Это на самом деле не вопрос решения конкретной проблемы, а скорее запрос, направленный в правильном направлении.

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

Я попытался загрузить 30 изображений с разрешением 800px * 600px наивнодумая, что он загружает только «сжатый» размер изображений в память (это около 200 КБ) - итого 6 МБ?Конечно, несколько предупреждений памяти позже, я понял, насколько я был глуп.Теперь я изменил их размер примерно до 400 * 300 пикселей каждый, и мой iPhone 4S почти полностью соответствует требованиям к памяти.

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

Подобные «открытия» заняли у меня часы, и мне было интересно, есть ли определенные шаблоны проектирования или ресурсычто я могу использовать для максимально эффективной загрузки изображений на экран;главным образом в отношении использования как можно меньшего количества памяти - есть ли хорошие практические правила?Почему использование UIImageView против UiView с изображением имеет такое значение?

Буду очень признателен, если кто-то сможет помочь.

Спасибо.

Ответы [ 2 ]

9 голосов
/ 12 января 2012

Реализация -drawRect: заставляет систему выделять растровое изображение того же размера, что и ваш вид (в конце концов, вам нужен буфер для рисования). Если все, что вы делаете, это рисуете изображение, которое вы уже загрузили, то одним махом вы удвоили использование памяти для этого изображения (потому что у вас есть загруженная копия и вторая копия, которую вы только что нарисовали).

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

Основное правило: не делай лишней работы. Использование -drawRect: для рисования изображения - дополнительная работа. Растеризация слоя - это дополнительная работа (хотя, в зависимости от того, что это за слой, это может быть разовая стоимость производительности (и постоянная стоимость памяти), чтобы впоследствии сэкономить на производительности, например, если это CAShapeLayer или если рисование теней). Хранение больших изображений в памяти, которые вы всегда уменьшаете, перед рендерингом на экран - дополнительная работа (просто уменьшите их один раз, когда вы загружаете изображение, и сохраняйте масштабированную копию).

Еще одна вещь, которую нужно иметь в виду: если ваша цель - рисовать изображения, вы должны попытаться использовать UIImageView, если это возможно. Как правило, это самый быстрый и дешевый способ вывести изображение на экран, и он достаточно гибкий.

8 голосов
/ 12 января 2012

Шаблон дизайна в основном, используйте UIImageView. Apple потратила много времени, чтобы сделать это быстро, и Apple разрешено использовать частные API, которые у вас нет.

Тем не менее, если вы хотите сделать это самостоятельно, попробуйте использовать один CALayer для каждого изображения. Вы просто загружаете изображение и устанавливаете его как content свойство CALayer. CALayer может кэшировать его содержимое в памяти графического процессора и может выполнять другие оптимизации, которые вы не можете сделать с общедоступными API.

Вы можете многое узнать о том, как сделать свой пользовательский интерфейс быстрым, посмотрев видео разработки Apple. Они включают в себя множество советов и «внутреннюю информацию», которых либо нет в письменной документации, либо которые трудно найти / просто пропустить в документации. Видеоролики о разработке находятся здесь: http://developer.apple.com/videos/. Некоторые хорошие, имеющие отношение к вашему вопросу:

  • iOS - «Понимание iOS View Compositing»
  • WWDC 2011 - «Понимание рендеринга UIKit»
  • WWDC 2011 - «Практическое рисование для разработчиков iOS»
  • WWDC 2011 - «Основы анимации»
  • WWDC 2010 - «Основная анимация на практике»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...