2011-01-31 2 views
7

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

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

Я удаляю слои, поскольку они полностью закрываются из вида, используя предложение в the answer to this question Расчеты для определения покрытия происходят в отдельной теме.

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

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

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

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

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

Лучше ли начать анимацию слоя в отдельном окне просмотра, чем ранее добавленные слои?

Спасибо!

ответ

4

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

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

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

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

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

+0

Спасибо, Билл. Я сделаю это. У меня создалось впечатление, что непрозрачность игнорируется при поставке layer.contents (используется только при наложении слоя)? Альфа-бит будет более сложным - я использую прозрачную рамку шириной 2 пикселя вокруг края изображений, чтобы сгладить вращающиеся края. Выключить на инструменты! – TomH

+0

Привет, Tom-yep opaque игнорируется, если вы не рисуете, вы можете думать о нем как о 2-ом аргументе для UIGraphicsBeginImageContextWithOptions, если у вас есть альфа-канал, тогда слой будет прозрачным - если у вас есть время, пожалуйста, напишите об ошибке edgeAntialiasingMask –

+1

Потрясающие.Я добавлял альфа-канал к моему UIImage, добавляя прозрачную границу 2px, а затем используя изображение в качестве содержимого слоя. Perf значительно улучшается за счет добавления альфа-и прозрачной границы - никаких проблем с> 30 уровнями. К сожалению, edgeAntialiasingMask, похоже, не имеет никакого эффекта. Я напишу ошибку. – TomH

3

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