Когда я должен установить layer.shouldRasterize в YES

Я видел исправления для некоторых проблем с запаздыванием, устанавливая свойство слоя представления

view.layer.shouldRasterize = YES;

Я увидел большую разницу в производительности при использовании UICollectionView, подготовке ячеек и настройке правильности.

Не уверен, что это означает.

Было бы здорово получить объяснение. Спасибо!

2 ответа

Решение

В видео WWDC 2012 Polishing Your Interface Rotations (необходима платная подписка для разработчиков), они рассказывают о преимуществах и последствиях растеризации слоев. Это видео на другую тему (хотя и интересную), но они говорят о плюсах и минусах растеризации по сравнению со снимками (начиная с 8 минут видео, они дают некоторое представление об отношениях между UIView иерархия, дерево презентации и дерево рендеринга, а затем погрузитесь в обсуждение растеризации еще через 6 минут видео).

Итог, если у вас есть сложное представление (т.е. относительно дорогое для повторного рендеринга), которое вы анимируете, но для которого анимированное представление не изменяется само по себе, растеризация слоя может улучшить производительность, не повторяя рендеринг слоя все время, Но это происходит за счет памяти (сохранение растрового изображения в памяти).

Но если вы анимируете изменение внутри слоя, shouldRasterize может отрицательно повлиять на производительность (потому что он собирается повторно растеризовать слой для каждого кадра анимации).

Как правило, если анимация сложного набора слоев, которые сами по себе не меняются, то вы можете установить shouldRasterize в YES, сделайте анимацию, а затем выключите shouldRasterize,

iOS должен растеризовать

[Цвет отладки iOS соответствует зеленому и пропускает красный]

      Rasterization = off-screen Rendered + off-screen buffer(cache)

Преимущество - Для сложного слоя (с подвидами, подслоями и другими эффектами), который будет перемещаться (прокрутка и т. Д.). Просто работать с кешем, а не перерисовывать его каждый раз

Недостаток - не динамичный. Если представление изменяет границы (ширину, высоту, тень, угол, радиус, цвет, внутреннее содержимое...), это требует дополнительной работы - кеш регенерируется . Частая регенерация кеша влияет на производительность

Предварительно визуализированный UIKit вид вне экрана (будут учитываться подслои, подвиды, и будет создано одно растровое изображение, после чего будут применены все остальные эффекты (такие как непрозрачность, маска...) и сохранены (кешированы) в ОЗУ (пока не нужно обновить), когда положение слоя изменено - UIKit считывает его (кэшированный слой) из ОЗУ напрямую (без рендеринга с нуля (это непростая задача, например, вычисление слоев смешивания цветов...))

Он перемещает фокус с графического процессора на оперативную память, что требует дополнительной работы при запуске, но вызовет раздражение во время использования.

      view1.layer.shouldRasterize = true
view1.layer.rasterizationScale = UIScreen.main.scale

Другой пример — использование в, когда у вас сложный вид с большим количеством теней и т. д. + прокрутка, это создает спад производительности, поэтомуимеет место быть. Здесь вы увидите, что ячейки обналичены, но будет создана новая.

Также обратите внимание, что каждый кеш имеет:

  • размер
  • устаревшее имущество. Если кеш не использовался, его можно удалить
Другие вопросы по тегам