Отключить перерисовку содержимого CALayer при перемещении (iphone) - PullRequest
0 голосов
/ 01 сентября 2009

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

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

Примечание. Я установил для clearsContextBeforeDrawing значение NOo n в моем UIView, и это несколько помогло, но все еще намного медленнее, чем я ожидал

Ответы [ 2 ]

2 голосов
/ 02 сентября 2009

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

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

0 голосов
/ 01 сентября 2009

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

[layer setNeedsDisplayOnBoundsChange:NO];
...