Оптимизация сложных масок

Сложные маски в Lottie Web становятся одним из главных источников падения производительности при анимациях высокой плотности: пересечение нескольких matte-слоёв, многослойные альфа-композиции и маски на основе сложных векторных путей приводят к резкому росту нагрузки на рендер и CPU.

В основе механизма масок лежит постобработка пикселей слоя после применения всех трансформаций. Каждый masked layer фактически рендерится в offscreen буфер, после чего к нему применяется операция отсечения:

  • Alpha matte вычисляет прозрачность пикселей по яркости другого слоя
  • Luma matte использует яркостную составляющую
  • Shape mask использует векторный путь как область ограничения

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

Основные причины деградации производительности

Наиболее критичные факторы связаны не с количеством слоёв, а с характером их пересечений:

  • пересекающиеся matte-слои с высокой частотой пересчёта
  • маски с большим количеством узлов Bezier-кривых
  • анимированные path data внутри масок
  • использование feather (размытия границ маски)
  • частое изменение transform у маскирующего слоя
  • вложенные precomposition с собственными масками

Особенно дорого обходится комбинация animated path + blur + alpha matte, поскольку каждый кадр требует полного пересчёта растеризации.

Упрощение геометрии масок

Снижение количества точек в векторной маске даёт непропорционально большой выигрыш. Lottie Web не использует GPU-тесселяцию для сложных путей, поэтому каждый сегмент кривой обрабатывается CPU.

Оптимизация строится вокруг следующих принципов:

  • уменьшение количества anchor points перед экспортом
  • замена сложных кривых на приближённые формы
  • отказ от избыточных внутренних контуров
  • объединение пересекающихся форм в один path

Даже сокращение пути с 300 точек до 80 даёт заметное снижение времени рендеринга одного кадра при анимации маски.

Замена масок на track matte

Track matte в Lottie Web часто работает быстрее, чем сложные shape masks, поскольку слой используется как готовая текстура без дополнительной геометрической обработки.

Ключевое отличие:

  • shape mask требует вычисления геометрического пересечения
  • track matte использует готовый растеризованный слой как stencil

При сложных сценах переход на matte-слои снижает количество геометрических операций и переносит часть нагрузки в bitmap-композицию.

Предварительная компоновка слоёв

Precomposition позволяет «заморозить» внутреннюю структуру композиции до одного рендера. Это особенно эффективно при масках, которые не изменяются динамически.

Оптимизационный эффект достигается за счёт:

  • сокращения числа одновременно активных слоёв
  • уменьшения количества mask evaluation per frame
  • кеширования промежуточного результата

Однако чрезмерная вложенность precomp может дать обратный эффект из-за увеличения количества offscreen canvas.

Отказ от feather и мягких границ

Feather в масках приводит к необходимости вычисления градиентного перехода на уровне пикселей. Это переводит задачу из векторной в растровую область.

Влияние feather:

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

В большинстве случаев аналогичный визуальный результат достигается через:

  • заранее размытые формы в редакторе
  • использование готовых blur-слоёв вместо runtime feather
  • замена мягких краёв на градиентные shape overlays

Снижение частоты обновления масок

Маска, привязанная к анимированному пути или transform, пересчитывается каждый кадр. Если анимация маски не требует 60 fps точности, её можно дискретизировать.

Подходы:

  • keyframe reduction (снижение количества ключевых кадров)
  • easing вместо continuous path morphing
  • фиксация маски на нескольких состояниях с переключением

Даже переход с непрерывной анимации на ступенчатую модель уменьшает нагрузку на геометрический pipeline.

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

Lottie Web поддерживает частичное кеширование отрисованных слоёв через canvas. Маскируемые слои, которые не изменяются, могут быть закешированы как bitmap.

Эффективность кеширования возрастает при следующих условиях:

  • отсутствие transform animation
  • статическая геометрия маски
  • отсутствие blend mode, зависящего от соседних слоёв

При соблюдении этих условий повторная отрисовка заменяется копированием готового изображения.

Избежание вложенных масок

Наиболее дорогой сценарий — каскадная система масок:

Layer A → mask B → matte C → precomp D → mask E

Каждый уровень добавляет отдельный render pass. Вместо вложенности эффективнее использовать:

  • объединение масок в один path
  • flattening структуры в AE перед экспортом
  • перенос логики в один composited layer

Flattening снижает глубину рендер-графа, что напрямую уменьшает количество промежуточных буферов.

Сокращение количества одновременно активных масок

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

Технические приёмы:

  • conditional rendering на уровне логики приложения
  • отключение масок вне viewport
  • сегментация анимации на состояния

Снижение количества одновременно активных mask layers с 10 до 3 часто даёт кратный прирост FPS.

Замена масок композитингом

Некоторые сценарии использования масок могут быть заменены операциями композиции:

  • clip-path на уровне DOM вместо canvas mask
  • opacity blending вместо alpha matte
  • заранее подготовленные PNG/WebP слои

Это уменьшает нагрузку на Lottie runtime, переносит вычисления в браузерный compositor и снижает количество canvas redraws.

Оптимизация при использовании blur-масок

Blur внутри маски особенно дорог, поскольку требует свёртки ядра размытия по каждому кадру. При сложных сценах используется стратегия предрасчёта:

  • bake blur в статичную текстуру
  • использование нескольких уровней размытия вместо continuous blur
  • ограничение радиуса размытия

Каждое увеличение радиуса blur увеличивает количество пиксельных операций нелинейно, что критично при больших разрешениях.

Контроль overdraw при масках

Overdraw возникает, когда один пиксель перерисовывается несколько раз в процессе применения масок и слоёв. В Lottie Web это особенно заметно при пересекающихся matte-слоях.

Снижение overdraw достигается через:

  • минимизацию пересечений масок
  • упрощение stacking order
  • объединение слоёв с одинаковыми mask regions

Снижение overdraw напрямую уменьшает нагрузку на fill-rate canvas.

Баланс между качеством и вычислительной стоимостью

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

  • геометрического упрощения
  • статических pre-rendered слоёв
  • отказа от динамических path-based масок

Оптимизация строится вокруг принципа минимального числа пиксельных операций на кадр при сохранении визуальной идентичности на уровне восприятия.