Ответ 1
Внеэкранная рендеринг/рендеринг на CPU
Самые большие узкие места для графики - внеэкранная рендеринг и смешивание - они могут возникать для каждого кадра анимации и могут вызывать прерывистую прокрутку.
Экранная рендеринг (рендеринг программного обеспечения) происходит, когда необходимо сделать чертеж в программном обеспечении (вне экрана), прежде чем он может быть передан на графический процессор. Аппаратное обеспечение не обрабатывает рендеринг текста и продвинутые композиции с масками и тенями.
Следующее приведет к экранированию рендеринга:
-
Любой слой с маской (
layer.mask
) -
Любой слой с
layer.masksToBounds
/view.clipsToBounds
является истинным -
Любой уровень с
layer.allowsGroupOpacity
установлен на YES иlayer.opacity
меньше 1.0
Когда для представления (или слоя) требуется экранированная рендеринг? -
Любой слой с тенью (
layer.shadow*
).
Советы по исправлению: https://markpospesel.wordpress.com/tag/performance/ -
Любой слой с
layer.shouldRasterize
является истинным -
Любой слой с
layer.cornerRadius
,layer.edgeAntialiasingMask
,layer.allowsEdgeAntialiasing
-
Любой слой с
layer.borderWith
иlayer.borderColor
?
Отсутствует ссылка/доказательство -
Текст (любой вид, включая
UILabel
,CATextLayer
,Core Text
и т.д.). -
Большая часть рисунка, который вы делаете с
CGContext
вdrawRect:
. Даже пустая реализация будет отображаться вне экрана.
Blending
-
resizableImage
может вызвать смешение.
Избегайте смешанных слоев при использовании resizableImages в iOS -
Любой слой, который не является
opaque
и имеетbackgroundColor
сalpha
меньше 1.0 -
Любой слой с
alpha
меньше 1.0 -
Любой слой с
layer.content
или любымUIImageView
сUIImage
, имеющий альфа-канал
Layout
Следующие вещи вызовут layoutSubviews
для вызова в UIView:
-
Изменение
bounds
триггеров на том же самом представлении и супервизии -
Изменение триггеров
frame
на том же самом представлении и супервизии -
Изменение
transform
илиlayer.transform
триггеров в режиме супервизора
Примечание. Я имею в виду реальные изменения, когда значения действительно меняются.
Противоречивость этих изменений не вызывает вызов layoutSubviews
: center
, layer.position
, layer.zPosition
, layer.anchorPoint
, layer.anchorPointZ
.
Ссылка: https://github.com/hfossli/LayoutSubviewsInconsistency
Общие советы по повышению производительности
-
Часто лучше
blend
, чемrender offscreen
. -
Рассмотрите возможность использования
drawRect:
вместо представления с несколькими ярлыками и подвью. -
Нарисуйте фоновую очередь на
UIImage
илиCGImageRef
. -
Нарисуйте
CGLayer
(который лучше кэшируется наGPU
по сравнению сUIImage
) и нарисуйте все, что вы хотите в нем.
Обновите, не делайте: http://iosptl.com/posts/cglayer-no-longer-recommended/ -
Сгладьте иерархию
-
Повторное использование - не создавать и добавлять новые при прокрутке
-
Имеют
opaque
виды с сплошным цветом фона -
Избегайте установки
alpha
иlayer.opacity
менее 1.0 -
Включить
layer.shouldRasterize
(используйте с осторожностью). Мне нравится избегать этого лично, но он работает быстрее в некоторых случаях, так как растры слоя будут кэшироваться и повторно использоваться. Помните, если вы включитеshouldRasterize
на слоях, которые часто меняют содержимое или содержимое подслоев, это приведет к снижению производительности, поскольку iOS будет сохранять растеризацию слоя при каждом изменении.