Производительность при использовании blend modes

В библиотеке Lottie Web режимы смешивания (blend modes), экспортируемые из After Effects, транслируются в механизмы композитинга браузера. В зависимости от выбранного рендерера — SVG или Canvas — поведение и стоимость вычислений существенно различаются.

В Canvas-рендерере каждый слой с blend mode отображается через globalCompositeOperation, что переводит смешивание в пиксельную операцию на уровне растрового буфера. В SVG-рендерере аналогичный эффект достигается через фильтры и режимы смешивания SVG, которые часто оказываются более затратными из-за участия layout и filter pipeline браузера.

Композитинг и внутренняя модель выполнения

Каждый кадр Lottie-анимации формируется как последовательность слоёв, где порядок отрисовки строго соответствует структуре композиции. При наличии blend modes процесс усложняется:

  • базовый слой рендерится в offscreen buffer или текущий canvas context
  • следующий слой накладывается с применением режима смешивания
  • результат фиксируется в промежуточном буфере

При большом количестве слоёв возникает цепочка зависимых операций, исключающая эффективную параллелизацию.

Canvas-рендеринг и globalCompositeOperation

Canvas-движок браузера реализует blend modes через растровый композитинг. Основные режимы, такие как multiply, screen, overlay, требуют пост-пиксельной обработки:

  • multiply: поканальное умножение значений пикселей
  • screen: инверсия с последующим умножением и обратной инверсией
  • overlay: комбинация multiply и screen с условной логикой

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

При высокой плотности слоёв возникает рост fill-rate нагрузки, где узким местом становится не CPU-логика Lottie, а GPU/CPU композитинг.

SVG-рендеринг и фильтровый pipeline

SVG-режим использует фильтры (feBlend, feComposite), что переносит часть работы в графический pipeline браузера. Однако:

  • фильтры могут инвалидировать кеш рендера
  • любые изменения трансформов пересчитывают filter region
  • сложные сцены приводят к частичному fallback в растровизацию

В результате SVG при активных blend modes часто становится менее предсказуемым по производительности, чем Canvas.

Стоимость overdraw и перекрытий

Основной фактор деградации производительности — overdraw. Blend modes фактически увеличивают стоимость каждого перекрытия слоёв.

Если сцена содержит N слоёв с пересечениями, итоговая нагрузка приближается к:

  • O(N × pixel_area_overlap)

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

Особенно критичны:

  • большие полупрозрачные слои
  • анимированные маски + blend mode одновременно
  • пересекающиеся precomposition

Влияние масок и track mattes

Комбинация масок и режимов смешивания формирует многослойный композитинг:

  • сначала применяется маска (alpha или luma)
  • затем выполняется blend operation
  • затем результат участвует в следующем слое

Такой порядок исключает возможность оптимизации слоя как единого bitmap cache. Каждое изменение маски приводит к пересчёту всего стекa.

Precomposition и его влияние

Precomposition в Lottie может частично снизить нагрузку, но при наличии blend modes эффект неоднозначен.

Если blend mode находится внутри precomp:

  • часть операций изолируется в локальный контекст
  • возможен кеш промежуточного результата

Если blend mode применяется между precomps:

  • кеширование почти полностью теряет эффективность
  • происходит повторная растеризация каждого кадра

Таким образом, вложенные композиции не гарантируют снижение стоимости при активных режимах смешивания.

Кэширование и его ограничения

Lottie Web использует несколько уровней кэширования:

  • кэш растровых слоёв
  • кэш path-геометрии
  • кэш precomp bitmap

Blend modes часто инвалидируют эти кэши, поскольку результат слоя зависит от контекста нижележащих пикселей. Это приводит к повторной отрисовке даже статических элементов.

Особенно критично:

  • изменение прозрачности родительских слоёв
  • анимация transform у нижнего слоя
  • изменение порядка слоёв

GPU-поведение и браузерные ограничения

Несмотря на использование GPU в canvas pipeline, доступ к нему косвенный. Blend modes не всегда полностью аппаратно ускорены:

  • простые режимы могут выполняться на GPU
  • сложные или комбинированные режимы вызывают readback в CPU
  • readback блокирует pipeline и снижает FPS

На мобильных устройствах это проявляется особенно резко из-за ограниченной памяти видеобуфера.

Частые источники деградации FPS

Основные паттерны, приводящие к падению производительности:

  • большое количество пересекающихся слоёв с blend modes
  • анимация больших областей экрана одновременно
  • сочетание blur + blend mode
  • использование масок с мягкими краями
  • одновременное использование нескольких precomp уровней

Оптимизация порядка слоёв

Порядок отрисовки напрямую влияет на стоимость композитинга. Более дешёвые слои должны располагаться выше или ниже так, чтобы минимизировать площадь пересечения с blend layers.

Эффективный порядок снижает:

  • количество пикселей в composite operation
  • число промежуточных буферов
  • частоту перерасчёта стеков

Упрощение режимов смешивания

Некоторые режимы имеют значительно более высокую стоимость:

  • overlay и soft-light требуют условных вычислений
  • difference и exclusion увеличивают стоимость цветовых операций
  • multiply и screen относительно стабильны, но чувствительны к площади

Снижение количества уникальных blend modes в одной сцене уменьшает фрагментацию pipeline.

Растровизация как стратегия стабилизации

Фиксация сложных групп слоёв в bitmap-кэш снижает нагрузку:

  • сцена превращается в единый слой
  • blend modes применяются один раз к итоговому изображению
  • исключается промежуточный композитинг

Однако это увеличивает потребление памяти и снижает гибкость анимации.

Ограничения масштабирования

При масштабировании canvas или SVG сцены с blend modes происходят дополнительные пересчёты:

  • изменение devicePixelRatio пересоздаёт буферы
  • трансформации вызывают invalidation filter regions
  • resize приводит к полной переработке стеков

Поведение при высокой частоте кадров

При 60 FPS каждая операция blend mode выполняется в рамках жёсткого временного бюджета ~16 мс. При превышении этого бюджета:

  • начинается пропуск кадров
  • происходит деградация плавности
  • увеличивается нагрузка на garbage collector из-за промежуточных буферов

Итоговая модель стоимости

Суммарная стоимость сцены с blend modes определяется не количеством слоёв как таковых, а следующими факторами:

  • площадь перекрытия слоёв
  • число уникальных режимов смешивания
  • наличие масок и фильтров
  • глубина precomposition
  • возможность кеширования промежуточных результатов