введение
При разработке h5 нам часто нужно реализовать некоторые динамические эффекты, чтобы улучшить визуальный эффект страницы.Когда мы говорим о динамических эффектах, мы неизбежно думаем о теме динамической оптимизации производительности:
- Сократите операции DOM страницы, вы можете использовать CSS для достижения анимации без строки кода js
- Используйте абсолютное позиционирование, чтобы избавиться от DOM из потока документов, уменьшив перестановку страниц (ретрансляцию).
- Включить аппаратное ускорение с помощью свойств CSS3 3D.
Итак, какова связь между CSS3 и оптимизацией динамических эффектов?В этой статье будет описан принцип оптимизации динамических эффектов CSS3 с уровня рендеринга браузера.
Процесс отображения страницы браузера
На домашней странице нам нужно понять процесс отображения страницы в браузере:
- Javascript: в основном отвечает за логику делового взаимодействия.
- Стиль: соответствует соответствующему стилю CSS для каждого элемента DOM в соответствии с селектором CSS.
- Макет: конкретно рассчитайте размер и положение элемента DOM, отображаемого на экране.
- Paint: реализует визуальные эффекты (цвета, границы, тени и т. д.) элемента DOM, обычно выполняемые несколькими слоями рендеринга.
- Составной: когда каждый слой отрисовывается, браузер объединяет все слои в один слой в разумном порядке и отображает его на экране.
В этой статье мы сосредоточимся наComposite
Обработать.
Принцип рендеринга в браузере
в обсужденииComposite
Прежде нам также необходимо понять принцип рендеринга браузера.
Из этого рисунка мы можем найти:
-
DOM 元素
а такжеLayout Object
Есть отношение один к одному - Вообще говоря, те, с одним и тем же координатным пространством
Layout Object
принадлежат к одному и тому жеPaint Layer (渲染层)
,пройти черезposition、opacity、filter
и т. д. Свойства CSS могут создать новый слой краски - какой-то особенный
Paint Layer
будет считатьсяComposite Layer (合成层/复合层)
, составной слой имеет отдельныйGraphics Layer (图形层)
, а те слои рисования, которые не являются составными слоями, будут иметь общий родительский слой с графическим слоем.
Graphics Layer
Экранные визуальные эффекты, которые мы видим в повседневной жизни, можно понять следующим образом:GPU
Композиция отображается на экране, а наименьшая единица растрового изображения — это пиксель. Как показано ниже:
Так как же получается растровое изображение?Graphics Layer
сыграли ключевую роль, каждыйGraphics Layer
ИмеетсяGraphics Context
, растровое изображение хранится в общей памяти,Graphics Context
будет отвечать за обработку растрового изображения как纹理
загрузить наGPU
, а затем графический процессор выполняет композитный рендеринг. Как показано ниже:
Какую роль CSS играет в рендеринге браузера
Первое впечатление большинства людей от CSS3 состоит в том, что аппаратное ускорение можно включить с помощью свойств 3D (таких как преобразование).При рефакторинге проекта многие студенты склонны:
- Измените 2D-преобразование на 3D-преобразование
2. Измените движение слева (сверху, снизу, справа) на 3Dtransform.
Но с включенным аппаратным ускорением底层原理
На самом деле это将 Paint Layer 提升到了 Composite Layer
Все следующие методы используют один и тот же эффект:
- 3D-свойства включают аппаратное ускорение (3D-преобразование)
- will-change: (непрозрачность, преобразование, верх, лево, низ, право)
- Используйте фиксированное или липкое позиционирование
- Примените анимацию (активировано) или переход (активировано) к непрозрачности, преобразованию и фильтру. Обратите внимание, что анимация и переход должны быть в
激活状态
просто делать
Напишем два абзацаdemo
Код, позволяющий подробно проанализировать реальную ситуацию
demo1. 3D-свойства включают аппаратное ускорение (3D-преобразование)
.composited{
width: 200px;
height: 200px;
background: red;
transform: translateZ(0)
}
</style>
<div class="composited">
composited - 3dtransform
</div>
Вы можете видеть, что составной слой создается из-за используемого преобразования CSS 3D.
demo2. Примените анимацию (активировано) или переход (активировано) к непрозрачности, преобразованию, фильтрации
<style>
@keyframes move{
0%{
top: 0;
}
50%{
top: 600px;
}
100%{
top: 0;
}
}
@keyframes opacity{
0%{
opacity: 0;
}
50%{
opacity: 1;
}
100%{
opacity: 0;
}
}
#composited{
width: 200px;
height: 200px;
background: red;
position: absolute;
left: 0;
top: 0;
}
.both{
animation: move 2s infinite, opacity 2s infinite;
}
.move{
animation: move 2s infinite;
}
</style>
<div id="composited" class="both">
composited - animation
</div>
<script>
setTimeout(function(){
const dom = document.getElementById('composited')
dom.className = 'move'
},5000)
</script>
Здесь мы определяем дваkeyframes(move、opacity)
, и еще дваclass(both、move)
,вначале#composited
изclassName = 'both'
, после 5-секундной задержки,className = 'move'
, давайте посмотрим на фактические изменения браузера.
вначале:#composited 创建了一个复合层,并且运动时 fps 没有波动,性能很稳定
Через 5 секунд:复合层消失,运动时 fps 会发生抖动,性能开始变得不再稳定
Как просмотреть составные слои и частоту кадров
в браузереDev Tools
выберитеMore tools
и проверьтеRendering
серединаFPS meter
Оптимизация производительности анимации
Ранее мы упоминали о конвейере рендеринга, связанном с рендерингом страницы.На самом деле, с точки зрения производительности,最理想的渲染流水线是没有布局和绘制环节的
, чтобы добиться вышеуказанного эффекта, нужно использовать только те, которые вызывают толькоComposite
характеристики.
В настоящее время только два свойства удовлетворяют этому условию:transforms
а такжеopacity
(Поддерживается только некоторыми браузерами).
Связанную информацию можно найти по адресу:css Triggers
Суммировать
Вкратце, переход на композитный слой имеет следующие преимущества:
- Растровое изображение составного слоя будет составлено графическим процессором, который быстрее, чем обработка процессором.
- Когда вам нужно перекрасить, вам нужно перекрасить только себя, это не повлияет на другие слои
- Для эффектов преобразования и прозрачности некоторые браузеры не запускают Layout и Paint.Дополнительную информацию см. в следующих разделах:css Triggers
недостаток:
- Создание нового слоя композиции не бесплатно, оно потребляет дополнительную память и ресурсы управления.
- После того, как текстура будет загружена, она будет обработана графическим процессором, поэтому нам также необходимо учитывать пропускную способность между процессором и графическим процессором и сколько памяти доступно графическому процессору для обработки этих текстур.
Большинству людей нравится использовать 3D-свойство translateZ(0) для так называемого аппаратного ускорения для повышения производительности. Но нам также необходимо анализировать фактическую производительность страницы и постоянно улучшать тест, что является правильным способом оптимизации производительности.