Skip to content

research(compositor): cubic-Hermite spring artifacts с O(h⁴) error и C¹-сегментами #231

Description

@lemone112

Пользовательский результат

Проверить, может ли compositor исполнять spring-траекторию существенно меньшим числом сегментов, если вместо piecewise-linear linear() использовать piecewise cubic Hermite, построенный по точным значениям и скоростям solver.

Это исследование representation, не заранее принятое изменение production path.

Математическая основа

На интервале [t₀,t₁], h=t₁-t₀, известны:

x₀ = x(t₀)
v₀ = x'(t₀)
x₁ = x(t₁)
v₁ = x'(t₁)

Cubic Hermite interpolant совпадает по value+velocity на обоих концах. Классический bound:

|max(f-H)| <= max|f⁽⁴⁾| · h⁴ / 384

В отличие от linear interpolation O(h²), cubic даёт O(h⁴) при точных derivatives.

Для spring в dimensionless state y=x-1, v=y':

y''   = -y-2ζv
y'''  = 2ζy + (4ζ²-1)v
y⁽⁴⁾ = (1-4ζ²)y + 4ζ(1-2ζ²)v

Нужен устойчивый local/global bound на |y⁽⁴⁾|, желательно через state/energy, а не dense heuristic.

Представление через WAAPI cubic-bezier

Для каждого сегмента значение cubic Hermite эквивалентно cubic Bézier по value-axis:

P₁ = x₀ + h v₀ / 3
P₂ = x₁ - h v₁ / 3

Если Δ=x₁-x₀ не вырожден:

cubic-bezier(
  1/3, (P₁-x₀)/Δ,
  2/3, (P₂-x₀)/Δ
)

может использоваться как per-segment easing между authored keyframes. Нужно доказать браузерную семантику для overshooting control points, exact offsets и multi-property groups во всех трёх движках.

При |Δ|≈0, экстремумах или sign change representation обязана split-нуть сегмент в критической точке либо fail-closed; деление на малый span запрещено.

Подтверждённый потенциал

Прототип при tolerance 0.0025 дал ориентировочно:

ζ=0.03: linear 684 segments -> cubic 117
ζ=0.10: 207 -> 36
ζ=0.30: 66 -> 13
ζ=0.50: 44 -> 8
ζ=0.70: 33 -> 7
ζ=0.90: 28 -> 8
ζ=1.00: 29 -> 10

При сильном overdamping простой global fourth-derivative bound может быть хуже linear; поэтому решение должно быть portfolio/conditional, не полной заменой.

Обязательные вопросы spike

  1. Поддерживают ли Chromium/Firefox/WebKit нужные per-keyframe easing и overshooting y-control points одинаково?
  2. Остаётся ли исполнение compositor-resident для transform/opacity?
  3. Что меньше фактически: число segments, serialized bytes, parsed keyframe memory и start cost?
  4. Можно ли sample/handoff получить аналитически из cubic artifact за O(log K) с точной производной?
  5. Как группировать multi-property tracks с общей spring shape без дублирования frames?
  6. Когда linear representation строго лучше?

RED / доказательства

  • independent Hermite evaluator + fourth-derivative bound;
  • exact value/velocity at every knot;
  • mandatory roots/extrema/near-zero-span split corpus;
  • under/critical/over, v₀, near-critical, large overshoot;
  • dense raw-spring error <= effective tolerance including number serialization;
  • browser differential by Animation.currentTime;
  • pause/seek/cancel/retarget handoff slope against serialized cubic, not raw spring;
  • no layout reads and zero steady-state rAF for accepted native path;
  • fallback to current linear artifact when capability/budget fails;
  • mutation on control-point factors, derivative scaling, split roots, segment offsets;
  • size/perf comparison against current adaptive linear and uniform implicit candidates.

GO

Production representation разрешена только если для определённого shape-domain она одновременно:

  • меньше по actual gzip/raw artifact bytes либо значительно дешевле browser start/memory;
  • проходит full browser/capability/C¹ matrix;
  • не повышает runtime entry budgets;
  • выбирается общим portfolio compiler, а не новым публичным API.

NO-GO

Если browser implementation уходит с compositor, artifact bytes растут из-за per-segment easing или handoff усложняется непропорционально — сохранить report/lower bounds, удалить experimental runtime.

Не входит

Зависит: #226. Родитель: #225. Связано: #223, #228, #220.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions