2009-09-01 7 views
0

У меня есть UIView с большим количеством CALayers (~ 1000), каждый из которых имеет небольшое изображение в качестве его содержимого. Этот UIView является подвидью scrollview (на самом деле это подзаголовок другого представления, которое является подвидью scrollview). Это происходит относительно быстро сначала (пара секунд). Однако, когда я просматриваю прокрутку, частота кадров очень низкая.Отключить перерисовку содержимого CALayer при перемещении (iphone)

Он пытается перерисовать содержимое каждого CALayer при каждом прокрутке? Есть ли способ отключить это? Что-то еще происходит?

Примечание: Я поставил clearsContextBeforeDrawing в Ныо н мой UIView, и это помогло несколько, но она по-прежнему очень медленно, чем я ожидал бы

+0

Зачем вам так много слоев? Можете ли вы удалить/добавить слои, поскольку они прокручиваются в/из просмотра? (1000 уровней много) – rpetrich

ответ

2

Слои не следует перерисовывать, но они будут составлены с использованием графического процессора. Попробуйте использовать инструменты Sampler и OpenGL ES в инструментах, чтобы узнать, находится ли ваше узкое место в процессоре или графическом процессоре. Вы можете регистрировать дополнительные детали в инструменте OpenGL ES, нажимая «i» рядом с названием инструмента и выбирая дополнительные параметры (использование Tiler, использование Renderer и т. Д.). Если одно из значений OpenGL составляет около 100%, то это композиция, которая удерживает вас. Однако, если в пробоотборнике отображается количество вызовов -drawRect: или аналогичных методов, тогда ваши слои перерисовываются (по какой-то причине), и это может быть проблемой.

Кроме того, вы можете использовать инструмент Core Animation для цветных непрозрачных слоев, что может снизить частоту кадров дисплея.

+0

Спасибо, Брэд. Я посмотрю, смогу ли я выяснить, является ли этап компостирования узким местом. Я предполагаю, что это так. У вас есть мысли о том, как ускорить этот этап. Мне не нужно его перекомпоновать, когда я прокручиваю - есть ли способ отключить компоновку, а затем вручную recomposite при необходимости (т. Е. Только когда одно из содержимого слоя действительно изменяется)? – 2009-09-01 21:28:22

+0

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

+0

Все это очень хорошие подсказки :) – rpetrich

0

Установите needsDisplayOnBoundsChange свойство на ваших слоев NO:

[layer setNeedsDisplayOnBoundsChange:NO]; 
+0

Спасибо, но это не делает. Я не уверен, что границы изменяются при просмотре прокрутки при прокрутке прокрутки. – 2009-09-01 18:44:25

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