Какую производительность я должен иметь для критических вещей?
Мне нужен список с максимально возможным количеством примеров. Или список лучших практик.
Какую производительность я должен иметь для критических вещей?
Мне нужен список с максимально возможным количеством примеров. Или список лучших практик.
Самые большие узкие места для графики - внеэкранная рендеринг и смешивание - они могут возникать для каждого кадра анимации и могут вызывать прерывистую прокрутку.
Экранная рендеринг (рендеринг программного обеспечения) происходит, когда необходимо сделать чертеж в программном обеспечении (вне экрана), прежде чем он может быть передан на графический процессор. Аппаратное обеспечение не обрабатывает рендеринг текста и продвинутые композиции с масками и тенями.
Следующее приведет к экранированию рендеринга:
Любой слой с маской (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:
. Даже пустая реализация будет отображаться вне экрана.
resizableImage
может вызвать смешение.
Избегайте смешанных слоев при использовании resizableImages в iOS
Любой слой, который не является opaque
и имеет backgroundColor
с alpha
меньше 1.0
Любой слой с alpha
меньше 1.0
Любой слой с layer.content
или любым UIImageView
с UIImage
, имеющий альфа-канал
Следующие вещи вызовут 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 будет сохранять растеризацию слоя при каждом изменении.