Preview
Camera No model
Load a model to start
Tests run sequentially. Keep this tab visible.
Results
| Renderer | Status | Frame P50 (ms) | Frame P95 (ms) |
|---|
Frame completion time: draw submission to GPU completion. Lower is better. Excludes waiting for the next screen refresh. Median across rounds; static results shown when selected, otherwise orbit.
Best Lowest displayed value 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. Test order rotates or reverses between rounds. Orbit motion is ±45° (0.785 rad) with an 8 s period. The full model is loaded; no LOD is generated.
Frame time starts immediately before the draw call and ends when submitted GPU work completes. One frame is in flight. WebGL uses fenceSync / clientWaitSync; WebGPU uses GPUQueue.onSubmittedWorkDone(), via the canvas configuration. requestAnimationFrame schedules samples outside the timer. Completion includes CPU submission, GPU work and synchronization overhead; it is not isolated GPU execution time or display latency.
The timed draw call is renderer.render for Three.js, app.update + app.render for PlayCanvas. Camera updates are excluded. Async sorting keeps its native schedule; the measurement does not wait for pending worker results.
Load time runs from the public loader call to its completion signal. It excludes package downloads, initialization, SPZ conversion and the first visible frame. Completion signals vary by library; warm-up does not force asynchronous sorting to finish.
Only public APIs are used. Dependencies and internal parameters are unchanged. GPU execution time, sort time and GPU memory are not measured. Settings may produce different image quality. Hiding this tab or resizing the window stops the test; unfinished samples are excluded.