render-on-demand is on — these are gaps between requested frames, not a frame rate.
turn off
{{ live.fps.toFixed(1) }}
fps
·
frame {{ live.frameMs.toFixed(2) }} ms
·
cpu {{ live.cpuMs.toFixed(2) }} ms
·
gpu {{ live.gpuMs.toFixed(2) }} ms
p95 {{ live.p95Ms.toFixed(2) }} · worst {{ live.worstMs.toFixed(2) }} · jank {{ live.jankPct.toFixed(0) }}% · heap
{{ live.heapMb === undefined ? "n/a" : `${live.heapMb.toFixed(0)} MB` }}
{{ live.satellites }} sats · {{ live.components || "no components" }} · ×{{ live.clock }} · {{ live.entities }} entities · {{ live.primitives }} primitives
{{ thin }}/{{ rows.length }} steps sampled under {{ MIN_TRUSTWORTHY_FRAMES }} frames — those rows, and everything derived from them, are noise. Keep the tab in front.
sats
vis
clock
fps
frame
p95
cpu
gpu
build
footprint
components
{{ row.sats }}
{{ row.visible }}
×{{ row.clock }}
{{ row.fps.toFixed(1) }}
{{ row.frameMs.toFixed(2) }}
{{ row.p95Ms.toFixed(2) }}
{{ row.cpuMs.toFixed(2) }}
{{ row.gpuMs === "" ? "—" : row.gpuMs.toFixed(2) }}
{{ row.buildMs.toFixed(0) }}
{{ row.footprintMb === "" ? "—" : row.footprintMb }}
{{ row.components }} → drew {{ row.drawn }}
scaling (main-thread ms per 1,000 satellites; floor is GPU plus vsync)
series
ms/1k
base
r²
floor
sats@60
{{ fit.series }}
{{ fit.mainMsPer1000.toFixed(2) }}
{{ fit.baseMainMs.toFixed(2) }}
{{ fit.r2.toFixed(3) }}
{{ fit.floorMs.toFixed(2) }}
{{ fit.satsAt60fps === "" ? "—" : fit.satsAt60fps }}
memory (heap growth per 1,000 satellites — relative; within 2% of a forced GC when r² holds)
series
MB/1k
KB/sat
absolute
r²
{{ fit.series }}
{{ fit.mbPer1000Sats?.toFixed(1) ?? "—" }}
{{ fit.kbPerSatellite?.toFixed(1) ?? "—" }}
{{ fit.absoluteKbPerSatellite === undefined ? "—" : fit.absoluteKbPerSatellite.toFixed(1) }}
{{ fit.r2?.toFixed(3) ?? "—" }}
that slope cannot be read — it needs {{ MIN_MEMORY_FIT_POINTS }}+ counts and r² {{ MIN_TRUSTWORTHY_MEMORY_R2 }}, or a garbage collection landed inside the series and its
offset is not common to the rows. Sweep more counts, or re-run.
propagation (clock-tick ms over the same scene at ×1)
sats
clock
tick
Δ
µs/sat
cpu
components
{{ cost.sats }}
×{{ cost.clock }}
{{ cost.tickMs.toFixed(2) }}
{{ cost.deltaTickMs.toFixed(2) }}
{{ cost.usPerSatellite.toFixed(1) }}
{{ cost.cpuMs.toFixed(2) }}
{{ cost.components }}
first step re-run at the end (drift)
sats
main 1st
main again
drift
build 1st
build again
drift
{{ check.sats }}
{{ check.firstMainMs.toFixed(2) }}
{{ check.repeatMainMs.toFixed(2) }}
{{ signed(check.mainDriftPct) }}
{{ check.firstBuildMs.toFixed(0) }}
{{ check.repeatBuildMs.toFixed(0) }}
{{ signed(check.buildDriftPct) }}
Log
Copy CSV
Copy JSON
Copy table
{{ copied }}