Preview
Camera No model
Load a model to start
Tests run sequentially. Keep this tab visible.
Results
Frame intervals in the normal rendering loop, including browser scheduling. FPS = frames / sampled time (1000 / mean frame interval). Statistics are medians across rounds.
Best Highest FPS or lowest frame time in each column; ties are highlighted together.
Measurement notes
Each backend runs in a fresh iframe per round with a shared camera and fixed pixel resolution; order rotates or reverses between rounds. The full model is loaded (no LOD). Orbit: ±45°, 8 s period, following real elapsed time.
One GPU frame in flight: each frame is submitted only after the previous one has finished on the GPU (WebGL2 fence / WebGPU onSubmittedWorkDone). Without this wait the CPU runs ahead, intervals look short and the queued work later shows up as stalls. Each sample is the interval between submissions; FPS = frames / sampled time.
Load time runs from the public loader call to its completion signal (SuperSplat Viewer: its first ready frame), excluding package downloads and SPZ conversion. Only public APIs are used; native caching and async sorting stay active. GPU time, sort time and GPU memory are not measured. GPU errors, hiding the tab or resizing the window invalidate the run.