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