The SoraLabs model evaluates animations by measuring their intrinsic invalidation impact on the browser rendering pipeline rather than volatile frame-rate timers:
Base Score=100Single Animation Penalty=min(75,Ppipeline⋅Spaint⋅Dtime⋅Moffscreen)Single Animation Score=max(0,100−Single Animation Penalty)
Both Desktop and Mobile viewports are evaluated against identical physical frame rendering deadlines (target 60Hz = 16.67ms, 120Hz = 8.33ms), eliminating arbitrary synthetic viewport multipliers.
Informed by Chromium Blink CSSPropertyMetadata and W3C CSS Transforms / Animations specifications, the scoring model classifies properties into operational pipeline candidates. This is a heuristic classification, not a guarantee of runtime execution:
Compositor (P=0): Treated as a compositor candidate. Actual promotion and main-thread work depend on element state, browser version, and animation context.
CSS Variable (P=15): Unregistered custom properties (--*) force cascading computed style invalidation across all dependent subtree elements.
Paint (P=20): Triggers main-thread raster invalidation (PaintInvalidationReason), requiring tile re-rasterization without modifying element geometry. This includes background, border colors/radii, box shadows, text decorations, and SVG visual styling (fill, stroke-*).
Layout (P=50): Forces synchronous tree reflow (LayoutObject::UpdateLayout), cascading through style, layout, paint, and composite phases. This includes box geometry (width, height, top, left, margin, padding), flex/grid structures, and SVG path geometry (d, points, viewBox).
For paint-invalidating properties, the penalty scales with the ratio of invalidated paint surface to total viewport surface area relative to a baseline interactive component footprint (10% of viewport):
Following the Google RAIL Performance Model, micro-interactions completed under 100ms are perceived as instantaneous by human visual perception and receive a proportionate discount:
Grounded in Chromium Blink rendering pipeline mechanics:
Pre-Raster Lookahead Horizon Buffer: Modern compositors maintain a lookahead buffer around the visible viewport. Elements located within a 400px horizon buffer of the viewport boundary (−400px≤Yrect≤Hviewport+400px) are actively cached in the raster pipeline and are not classified as offscreen.
Compositor Properties (transform, opacity): Remain unpenalized (Moffscreen=1.0) even when running outside the visible viewport. Their memory footprint is already accounted for in GPU VRAM auditing; penalizing them again would constitute double-penalization.
Layout & Paint Properties: Modifying geometry (width, height, top) or rasterizing pixels outside the 400px lookahead boundary burns main-thread CPU cycles and battery without visual utility. These mutations incur an amplified penalty multiplier:
Moffscreen=1.5
Scroll responsiveness is evaluated based on main-thread decoupling and event loop dispatch queue pressure:
Off-Thread Declarative Scrolling (W3C CSS Scroll-Driven Animations & IntersectionObserver):
Runs directly on the browser compositor thread with zero script execution latency. No listener penalty is incurred.
Non-Passive Blocking Penalty: Listeners registered without { passive: true } force the compositor thread to wait on main-thread execution before scrolling:
Ppassive=min(15,Nnon_passive×5)
Frame Rate Synchronization: Handlers lacking requestAnimationFrame or debouncing lead to uncoordinated style recalculations during scrolling:
Pscheduling=min(15,Nunoptimized×3)
Synchronous Layout Invalidation: Scroll event handlers that trigger forced synchronous reflow incur a dedicated pipeline stall penalty:
Playout={200if layout thrashing detected on scrollotherwise