Compositor-friendly свойства

Природа compositor pipeline в браузере

В современных браузерах процесс отрисовки кадра разбивается на несколько ключевых этапов:

  • Style recalculation — пересчёт CSS-стилей
  • Layout (reflow) — вычисление геометрии элементов
  • Paint — отрисовка пикселей
  • Composite — сборка слоёв на GPU

Последний этап — composite — выполняется графическим процессором и не требует пересчёта геометрии или перерисовки пикселей. Это делает его самым дешёвым с точки зрения производительности.

Именно на этом этапе становятся критически важными compositor-friendly свойства — CSS-свойства, которые могут изменяться без запуска layout и paint.


Что означает compositor-friendly

Свойство считается compositor-friendly, если:

  • не вызывает перерасчёт layout
  • не инициирует repaint
  • может быть обработано GPU как изменение слоя

Такие свойства позволяют выполнять анимации с высокой частотой кадров (60 FPS и выше), минимизируя нагрузку на main thread.

В контексте Motion One это ключевая оптимизация: библиотека стремится переводить максимальное количество анимаций в compositing layer.


Основные compositor-friendly свойства

transform

Главное свойство для производительных анимаций.

transform: translateX(100px) scale(1.2) rotate(45deg);

В Motion One трансформации разбиваются на отдельные атомарные свойства:

  • x / y / z
  • scale / scaleX / scaleY
  • rotate / rotateX / rotateY / rotateZ
  • skew / skewX / skewY

Причина эффективности: transform применяется на уровне compositing layer без изменения layout дерева.


opacity

opacity: 0.5;

Изменение прозрачности полностью обрабатывается GPU.

Особенности:

  • не влияет на layout
  • не вызывает repaint соседних элементов
  • идеально подходит для fade-анимаций

filter (частично compositor-friendly)

filter: blur(10px);

Поддержка зависит от браузера и сложности фильтра.

Часто:

  • blur
  • brightness
  • contrast

могут переводиться в GPU-пайплайн, но при сложных комбинациях возможен fallback на paint.


will-change

will-change: transform, opacity;

Это не анимационное свойство, а подсказка браузеру.

Функции:

  • создание compositing layer заранее
  • снижение cost первого кадра анимации
  • предотвращение jank при старте анимации

Используется умеренно, так как чрезмерное применение увеличивает память GPU.


Свойства, НЕ являющиеся compositor-friendly

Motion One автоматически старается избегать анимации следующих свойств, так как они вызывают layout или paint:

Layout-triggering свойства

  • width
  • height
  • padding
  • margin
  • top / left / right / bottom
  • display
  • position (в некоторых изменениях контекста)

Любое изменение этих параметров запускает reflow, что критично снижает производительность.


Paint-heavy свойства

  • box-shadow
  • border-radius (в сложных сценах)
  • background-image
  • text-shadow

Они требуют перерасчёта пикселей и перерисовки слоя.


Подход Motion One к оптимизации

Motion One использует Web Animations API и собственный слой нормализации свойств, который:

  • преобразует transform-значения в атомарные компоненты
  • группирует compositor-friendly свойства отдельно
  • минимизирует обращение к layout-свойствам
  • использует requestAnimationFrame и native timing engine браузера

Автоматическое преобразование transform в Motion One

Motion One позволяет работать с более абстрактными свойствами:

animate(element, {
  x: 100,
  y: 50,
  rotate: 180,
  scale: 1.2
});

Эти значения автоматически трансформируются в:

transform: translateX(100px) translateY(50px) rotate(180deg) scale(1.2);

Преимущество такого подхода:

  • исключение ручного управления transform-строкой
  • гарантированное использование compositor-friendly pipeline
  • предотвращение конфликтов между transform-функциями

Слои композитинга и их влияние

Когда элемент становится анимируемым через transform или opacity:

  • браузер выделяет его в отдельный compositing layer
  • слой рендерится независимо
  • GPU объединяет слои в финальный кадр

Важно учитывать:

  • слишком большое количество слоёв увеличивает память GPU
  • каждый слой имеет стоимость хранения текстур
  • неправильное использование will-change может ухудшить производительность

Сравнение compositor-friendly и layout-анимаций

Тип свойства Pipeline Производительность
transform composite высокая
opacity composite высокая
filter paint/composite средняя
width layout + paint низкая
margin layout низкая

Практика Motion One: выбор оптимальных свойств

Перемещения элементов

Наиболее оптимальный вариант:

animate(element, { x: 200 });

Альтернатива, менее эффективная:

animate(element, { left: 200 });

Причина: left вызывает перерасчёт layout.


Масштабирование

animate(element, { scale: 1.5 });

Полностью compositor-friendly операция.


Плавное исчезновение

animate(element, { opacity: 0 });

Обрабатывается GPU без участия layout.


Комбинированные трансформации

animate(element, {
  x: 100,
  y: 50,
  rotate: 45,
  scale: 1.1
});

Все изменения объединяются в один transform pipeline, что минимизирует количество слоёв и операций.


Внутреннее поведение Motion One

При запуске анимации происходит несколько этапов:

  1. Анализ свойств объекта keyframes

  2. Разделение на:

    • compositor-friendly
    • non-compositor-friendly
  3. Преобразование transform-значений

  4. Передача в Web Animations API

  5. Фоллбек на JS-анимацию при необходимости

Особое внимание уделяется тому, чтобы compositor-friendly свойства всегда оставались в GPU pipeline.


Типичные ошибки при работе с анимациями

Анимация layout вместо transform

Использование:

animate(element, { marginLeft: 100 });

Проблема:

  • вызывает layout recalculation
  • увеличивает время кадра
  • блокирует main thread

Избыточное использование will-change

will-change: transform;
will-change: opacity;

Ошибка:

  • постоянное использование на большом количестве элементов
  • рост GPU памяти
  • деградация производительности вместо улучшения

Смешивание layout и transform в одной анимации

animate(element, {
  x: 100,
  width: 200
});

Результат:

  • часть анимации уходит в composite
  • часть вызывает layout
  • возникает рассинхронизация кадров

Оптимизационная стратегия Motion One

Подход библиотеки строится на принципах:

  • приоритет transform и opacity
  • минимизация paint operations
  • избегание layout animation
  • использование native browser compositor
  • агрегация transform в единый слой

Значение compositor-friendly подхода в интерфейсах

Использование compositor-friendly свойств напрямую влияет на:

  • стабильность FPS
  • отзывчивость интерфейса
  • снижение jank при скролле
  • плавность микровзаимодействий
  • энергоэффективность на мобильных устройствах

Motion One использует эти свойства как базовую единицу производительности, а не как дополнительную оптимизацию.