В недавнем проекте было много проблем с производительностью из-за отсутствия хорошего планирования в начале и ограниченных технических возможностей персонала.Основной задачей, к которой я присоединился в этом проекте, было выполнение различных оптимизаций производительности. Среди них много оптимизаций, связанных с перестановкой и перерисовкой и аппаратным ускорением.Этот метод оптимизации имеет относительно низкую стоимость и низкий риск, а также оказывает очевидное влияние на плохо сконфигурированные устройства. эта статья взята изОригинальная ссылка
В последние годы мы слышали об аппаратном ускорении и о том, как оно может помочь нам улучшить производительность анимации наших веб-страниц, делая анимацию веб-страниц лучше и плавнее на мобильных устройствах. Но я думаю, что многие менее опытные инженеры не знают, как работает аппаратное ускорение и как мы можем использовать его, чтобы сделать анимацию более плавной.
Аппаратное ускорение звучит очень сложно, как высшая математика. В этой статье я кратко объясню, как использовать эту технику в ваших проектах.
Зачем тебе это?
Давайте рассмотрим простой пример анимации с несколькими шариками, наложенными друг на друга. Затем переместите набор шаров по четырехугольной траектории. Самый простой способ - установитьleft
а такжеtop
реализовать. мы можем пройтиJavaScript
реализовать, но мы будем использоватьcss
реализовать. Обратите внимание, что я не использую никаких вспомогательных библиотек, таких какAutoprefixer
, но рекомендуется использовать эту библиотеку в вашем проекте для автоматического дополнения префикса
.ball-running {
animation: run-around 4s infinite;
}
@keyframes run-around {
0%: {
top: 0;
left: 0;
}
25% {
top: 0;
left: 200px;
}
50% {
top: 200px;
left: 200px;
}
75% {
top: 200px;
left: 0;
}
}
Вот онлайн пример. Запустить по кнопкеJavaScript
Запустить анимацию:
CodePen Preview for Animating overlapping balls with top/left Properties
Нажмите «Начать анимацию», и вы обнаружите, что анимация не работает плавно ни в одном настольном браузере. Если вы запустите эту анимационную страницу на мобильном телефоне, вы увидите серьезное падение кадров. Для решения этой проблемы мы можем использоватьtransform
изtranslate()
функция вместо парыleft
а такжеtop
изменять.
.ball-running {
animation: run-around 4s infinite;
}
@keyframes run-around {
0%: {
transform: translate(0, 0);
}
25% {
transform: translate(200px, 0);
}
50% {
transform: translate(200px, 200px);
}
75% {
transform: translate(0, 200px);
}
}
Попробуйте запустить приведенный выше код в следующем примере:
Animating overlapping balls with CSS transforms
Анимации теперь намного плавнее, чем раньше. отлично! Так почему же это так? ха, csstransform
не действует какleft
а такжеtop
свойство, вызывающее перерисовку. покажи намChrome
серединаDevTools
вTimeline
Результат выполнения страницы (Примечание переводчика: вChrome
В новой версии инструмент становитсяperformance
).
существуетleft
а такжеtop
В этом примере мы видим, что на каждом шаге есть зеленые гистограммы. Это дорогостоящая операция. В анимации пропущены кадры, что является нашим стандартом оптимизации анимации.
внешний вид проектаcss
изtransforms
Хронология:
Как видите, зеленых полос почти не появляется.
Еще один инструмент для отслеживания процесса перерисовки:Chrome
изDevTools
серединаrendering
внутриEnable paint flashing
опции. Если этот флажок установлен, в перерисовываемой области появится зеленая рамка. существуетleft
а такжеtop
В примере, когда анимация запущена, мяч имеет зеленую рамку, поэтому мяч перерисовывается.
В другом примере перерисовка происходит только в начале и в конце анимации.
Такtransform
Как анимация не вызывает перерисовку? Самый прямой ответtransform
будет напрямую использовать аппаратное ускорение, вGPU
запустить в обход программного рендеринга.
Как работает аппаратное ускорение
Когда браузер получает информацию о странице, он интерпретирует ее какDOM
терять.DOM
дерево иCSS
Пусть браузер построит дерево рендеринга. Визуализированные книги содержат визуализированные объекты — элементы на странице, которые необходимо визуализировать. Каждый объект рендеринга назначается слою. Каждый слой обновляется доGPU
. Секрет здесь в том, чтобы пройтиtransform
слой будет использоватьGPU
Рендеринг, поэтому перерисовка не требуется, как в 3D-графике. Это преобразование обрабатывается отдельно.
В нашем случаеCSS
изtransform
существуетGPU
Создайте новый слой напрямую.Chrome
изDevTools
Опция «Показать границы слоя» может помочь нам увидеть, какие слои являются отдельными слоями.После включения этой опции отдельные слои будут иметь оранжевую рамку.
использоватьtransform
Стилизованный шар окружен оранжевой рамкой, поэтому он находится на отдельном слое:
В этот момент вы можете спросить: когда браузеры создадут такой отдельный слой?
Новый слой создается, когда:
- 3D или
CSS
изtransform
Атрибуты -
<video>
а также<canvas>
элемент -
CSS
изfilter
Атрибуты - Элементы, которые накладываются на другие элементы, такие как via
z-index
Уровень повышен
Возможно, вы думаете, «жду, этот пример использует 2D преобразования, а не 3D-преобразования». да. Вот почему на старте есть два перекраска.
Разница между 3D-преобразованием и 2D-преобразованием заключается в том, генерируется ли новый слой заранее, а если он 2D, то при его реализации. В начале анимации создается новый слой и передаетсяGPU
иметь дело с. Когда анимация заканчивается, отдельные слои удаляются, а результат перерисовывается.
существуетGPU
визуализировать элемент
не всеCSS
Изменения свойств будут непосредственно вGPU
иметь дело с. Таким образом обрабатываются только следующие свойства:
- transform
- opacity
- filter
Поэтому, чтобы сделать страницу более плавной и производительной, анимацию нужно использовать как можно больше.GPU
обрабатывать.
навязанныйGPU
оказывать
В некоторых случаях он попытаетсяGPU
Рендеринг элемента. Это помогает нам избежать перерисовки при создании новых слоев. Поэтому нам нужно использоватьtransform hack
Технология
.example1 {
transform: translateZ(0);
}
.example2 {
transform: rotateZ(360deg);
}
Это позволит браузеру знать, что мы хотим сделать преобразование в 3D, что позволит браузеру использовать его в самом начале.GPU
Обработать, включить аппаратное ускорение.
Этот метод также может быть использован на конструктивно сложных элементах. Вернемся к первому примеру, изменим его, включив в него мяч, и воспользуемсяfilter
свойство и контейнер с фоновым изображением. передача мячаleft
а такжеtop
Реализовать анимационные эффекты.
Animating a ball with top/left properties
Опять анимация начинает пропускать кадры. Потому что каждая перерисовка вызывает большое потребление производительности.
Теперь добавимtransform hack
.
Animating left/top properties with hardware acceleration
Сейчас не так плохо, как раньше. Почему? Поскольку фон теперь обрабатывается в отдельном слое, перерисовка обходится дешево.
На что следует обратить внимание при использовании аппаратного ускорения
В мире нет бесплатных обедов. Что касается аппаратного ускорения, в настоящее время существует несколько проблем.
Memory
Большинство важных вопросов касается памяти.GPU
Обработка слишком большого количества контента может вызвать проблемы с памятью. Это вызывает сбои в мобильных устройствах и мобильных браузерах. Поэтому аппаратное ускорение обычно используется не для всех элементов.
Font rendering
существуетGPU
Рендеринг шрифтов сделает сглаживание неэффективным. Это потому чтоGPU
а такжеCPU
алгоритм другой. Поэтому, если вы не отключите аппаратное ускорение в конце анимации, произойдет размытие шрифта.
The Near Future
необходимо использоватьtransform hack
Место для повышения производительности. Сам браузер также предоставляет функции оптимизации, т.е.will-change
Атрибуты. Эта функция позволяет вам сообщить браузеру, что это свойство изменится, поэтому браузер оптимизирует его перед запуском. Вот пример:
.example {
will-change: transform;
}
К сожалению, не все браузеры поддерживают эту функцию.
конец статьи
Обзор того, что мы рассмотрели ниже:
-
GPU
Рендеринг может улучшить производительность анимации -
GPU
Рендеринг увеличит количество визуализируемых кадров анимации - использование вызовет
GPU
оказанныйCSS
Атрибуты - Поймите, как заставить элемент быть в «трансформируемом хаке»
GPU
оказывать