У меня есть пользовательский UIView, который состоит из множества изображений, их позиции меняются в зависимости от пользователя. Представление должно отслеживать пользовательское касание, и я испытываю узкое место производительности на чертеже такого вида, не позволяя мне следить за входом в реальном времени.Улучшение производительности чертежа на пользовательском UIView
В начале я рисовал все в методе [UIView drawRect:]
, и, конечно, это было слишком медленно, потому что все было перерисовано, даже если это не было необходимо. Затем я использовал больше CALayers для обновления только слоя, который менялся, и это дало мне гораздо лучшую отзывчивость. Но все же, когда мне приходится рисовать одно и то же изображение много раз на слое, он занимает до 500 мс.
Поскольку изображения размещаются на фиксированных позициях, есть способ их предварительного рисования? Должен ли я рассмотреть возможность размещения их во многих CALayers и просто скрыть/показать их? Кроме того, я не понимаю, почему существует [CALayer setNeedsDisplayInRect:]
, но у делегата (по-видимому) нет способа узнать, что недействительный rect должен оптимизировать чертеж.
Решение
Следуя совету в ответ я, наконец, создал много CALayers для изображений и установить contents
свойству первый раз слой показано на рисунке. Это ленивый компромисс: с первой попытки я устанавливал содержимое каждого слоя во время создания, но это вызвало предварительное рисование любого возможного изображения при запуске программы, замораживание приложения на несколько секунд.