Что запускает экранирование рендеринга, смешивания и layoutSubviews в iOS?

Какую производительность я должен иметь для критических вещей?

Мне нужен список с максимально возможным количеством примеров. Или список лучших практик.

Ответ 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


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 будет сохранять растеризацию слоя при каждом изменении.


Ссылки