docs: record scrolling mask performance investigation
This commit is contained in:
54
docs/performance/2026-09-05-scroll-investigation.md
Normal file
54
docs/performance/2026-09-05-scroll-investigation.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# Scrolling performance investigation
|
||||||
|
|
||||||
|
Production baseline: `f3f2b03` on `codex/portfolio-performance`.
|
||||||
|
|
||||||
|
Hardware: ASUS ROG Strix SCAR 16 G635LX, Intel Core Ultra 9 275HX,
|
||||||
|
hardware-backed ANGLE Intel Mesa ARL graphics, Chrome 152. Viewport
|
||||||
|
1440 × 900, DPR approximately 1, canvas 1425 × 900. Effective High
|
||||||
|
and Medium tiers were recorded throughout each measurement. Phone testing
|
||||||
|
is deferred.
|
||||||
|
|
||||||
|
## Findings
|
||||||
|
|
||||||
|
Matched 45-second High-quality scrolling runs after five seconds of warm-up:
|
||||||
|
|
||||||
|
| Condition | Presented frames/second | p95 presentation interval |
|
||||||
|
| --- | ---: | ---: |
|
||||||
|
| Normal page | 71.4 | 25 ms |
|
||||||
|
| Chapter masks disabled | 116.1 | 12.5 ms |
|
||||||
|
|
||||||
|
The 3D scene, render resolution, bloom, and motion were unchanged. Disabling
|
||||||
|
masks changes the appearance and was diagnostic only. Native wheel scrolling
|
||||||
|
reproduced the pattern. A separate 32-second Medium comparison measured
|
||||||
|
80.2 versus 142.4 animation callbacks/second, with p95 intervals of 20.9
|
||||||
|
versus 12.4 ms.
|
||||||
|
|
||||||
|
Full traces showed approximately 8,800 versus 840 page raster operations.
|
||||||
|
Static masks performed substantially better than continually changing masks.
|
||||||
|
Layer promotion, paint containment, and viewport-sized mask images did not
|
||||||
|
resolve the slow frames. Whole-world GPU samples had a median of 2.7 ms;
|
||||||
|
JavaScript scene submission was approximately 0.7 ms. Removing the entire
|
||||||
|
car or terrain did not resolve the 25 ms p95 scrolling intervals. Bypassing
|
||||||
|
bloom helped less than disabling masks and still exceeded the 60 FPS budget.
|
||||||
|
|
||||||
|
The absolute rate in this session exceeded the earlier approximately 45 FPS
|
||||||
|
control, including when rerunning the original measurement harness. The
|
||||||
|
reason for that session difference was not isolated. These are matched
|
||||||
|
same-session diagnostic comparisons, not newly shipped improvements.
|
||||||
|
Detailed tracing adds overhead; GPU timer intervals may include stalls and
|
||||||
|
cannot be added directly to displayed frame intervals.
|
||||||
|
|
||||||
|
## Implementation direction
|
||||||
|
|
||||||
|
Keep the fades visually close while separating the stationary reading edge
|
||||||
|
from scrolling content, allowing rasterized content and mask data to be
|
||||||
|
reused. Preserve native document scrolling, navigation, focus, content,
|
||||||
|
3D quality, audio, and shared journey outputs. Validate responsive layouts,
|
||||||
|
short viewports, reversals, quality changes, Static mode, reduced motion,
|
||||||
|
resource cleanup, and sustained rendering before retaining the change.
|
||||||
|
|
||||||
|
The user allows modest visual differences if the result does not look worse.
|
||||||
|
No production changes were made during investigation. All browser runs
|
||||||
|
inventoried and reused the single existing Chrome tab/window. Temporary
|
||||||
|
scripts, traces, screenshots, and detailed measurements remain in the ignored
|
||||||
|
`.perf/investigation/` folder; no tests or frameworks were added.
|
||||||
Reference in New Issue
Block a user