2010-08-09 3 views
1

У меня есть пользовательский UIView, который состоит из множества изображений, их позиции меняются в зависимости от пользователя. Представление должно отслеживать пользовательское касание, и я испытываю узкое место производительности на чертеже такого вида, не позволяя мне следить за входом в реальном времени.Улучшение производительности чертежа на пользовательском UIView

В начале я рисовал все в методе [UIView drawRect:], и, конечно, это было слишком медленно, потому что все было перерисовано, даже если это не было необходимо. Затем я использовал больше CALayers для обновления только слоя, который менялся, и это дало мне гораздо лучшую отзывчивость. Но все же, когда мне приходится рисовать одно и то же изображение много раз на слое, он занимает до 500 мс.

Поскольку изображения размещаются на фиксированных позициях, есть способ их предварительного рисования? Должен ли я рассмотреть возможность размещения их во многих CALayers и просто скрыть/показать их? Кроме того, я не понимаю, почему существует [CALayer setNeedsDisplayInRect:], но у делегата (по-видимому) нет способа узнать, что недействительный rect должен оптимизировать чертеж.


Решение

Следуя совету в ответ я, наконец, создал много CALayers для изображений и установить contents свойству первый раз слой показано на рисунке. Это ленивый компромисс: с первой попытки я устанавливал содержимое каждого слоя во время создания, но это вызвало предварительное рисование любого возможного изображения при запуске программы, замораживание приложения на несколько секунд.

ответ

0

Из документации - [CALayer drawInContext]: реализация

По умолчанию ничего не делает. Контекст может быть обрезан для защиты действительного содержимого слоя. Подклассы, которые хотят найти фактический регион для рисования, могут вызывать CGContextGetClipBoundingBox. Вызывается методом отображения, когда свойство содержимого обновляется.

Реализация экранных вызовов по умолчанию drawInContext: в автоматически создаваемом контексте; предположительно также устанавливая ограничивающий прямоугольник (который предположительно передается drawRect :).

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

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