CALayer оптимизации? - PullRequest
       4

CALayer оптимизации?

7 голосов
/ 31 января 2011

Я добавляю несколько CALayers в качестве подслоев слоя UIView. Содержимое каждого слоя представляет собой отдельное изображение, загруженное с сервера. Каждый слой анимируется от закадрового до случайно сгенерированной позиции. Данные изображения загружаются асинхронно. Каждое изображение размером примерно 300x300 или меньше.

В результате случайного размещения слои перекрываются, а некоторые перекрываются слоями над ними. Это все хорошо.

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

У меня есть UIPanGestureRecognizer, который позволяет пользователю перетаскивать слои вокруг экрана.

Я сталкиваюсь с проблемой производительности, когда количество добавляемых слоев приближается к 25-30 и постепенно ухудшается. Анимации становятся прерывистыми и часто полностью отсутствуют (вновь добавленные слои просто появляются в своей конечной позиции). А жесты панорамирования либо игнорируются, либо приводят к прерывистому перемещению выбранного слоя.

Я предполагаю, что убиваю графический процессор со всеми перекрывающимися слоями и анимацией другого слоя выше?

Есть предложения по улучшению производительности?

Рекомендации по работе с большим количеством слоев?

Лучше ли анимировать начало слоя в отдельном слое view.layer, чем ранее добавленные слои?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 01 февраля 2011

Пара быстрых вещей, чтобы проверить.

Запустите Core Animation Instrument и посмотрите на непрозрачность. Просто установить непрозрачный флаг слоя на YES недостаточно, если базовое изображение имеет альфа-компонент, слой примет это во внимание.

Если данные, которые вы получаете с вашего сервера, имеют альфа-формат, то вам следует перерисовать с помощью Quartz и сохранить файл локально в новом формате, не включающем альфа.

Удостоверьтесь вдвойне, что вы не помещаете 1-мегапиксельные изображения в плитки размером 100x100. Также Core Animation Instrument, включающий «Color Misaligned Images» и ищите желтый.

от 30 до 50 слоев должны быть без проблем.

3 голосов
/ 01 февраля 2011

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

...