Pascal Editor
Measuring Pascal: graphics initialization, edit latency and scene storage
Design an honest spatial-editor benchmark that separates GPU fallback, geometry updates, asset transfer and accepted save/reload results.
What you will learn
- Measure the backend that actually initialized
- Separate frame work from data and network work
- Report useful interaction and persistence outcomes
Before you start
- Basic scene-graph, JavaScript and HTTP concepts
- An owned small scene with expected dimensions and relationships
Explain the implementation boundary and reproduce the chapter’s checklist or narrow graph exercise.
Key takeaways
- Record the graphics backend and each initialization step.
- Graph bytes do not equal assets or GPU memory.
- Compare accepted edits and reopen results, not just frames.
Measure the backend that actually initialized
The capability helper defaults to a four-second timeout for WebGPU adapter/device requests and WebGPU renderer initialization. If initialization fails, it disposes the renderer, releases the device and attempts WebGL. These are separate bounded steps, not a guarantee that the whole application starts in four seconds; the WebGL initialization path is not wrapped by the same timeout in this helper.
Record whether a run used WebGPU, WebGL or the unsupported result, along with browser, driver and scene. Do not combine fallback runs into one unexplained average. Our source probe used fake devices and renderers and confirmed cleanup and fallback behavior; it did not measure GPU speed, shader compilation or real frame presentation.
Separate frame work from data and network work
A scene can be slow because of geometry changes, complex materials, many visible objects or asset loading. NodeRenderer caches lazy component identity and the scene store tracks dirty nodes, but those mechanisms do not prove a particular frame-rate gain. Use a fixed camera path and edit sequence, and count visible result correctness before comparing timings.
SQLite’s default 10 MiB cap applies to serialized graph JSON in UTF-8, not the total size of textures, models or GPU buffers. A small scene record may reference large external assets. Track graph bytes, transferred asset bytes, process memory and render behavior separately instead of calling database size the application’s memory requirement.
Report useful interaction and persistence outcomes
A practical pilot measures first usable view, edit-to-visible-update latency, save duration and successful reopen with expected geometry and materials. Include failed imports, unsupported devices and version conflicts rather than discarding them as inconvenient samples. Keep costs and percentiles unknown until equivalent workloads have actually run.
The record below is a proposed measurement schema with no fabricated values. Compare one change at a time, such as disabling an optional visual effect or reducing a controlled fixture’s visible objects. A faster result that drops an opening, loses a material or fails to save has not performed the same work and should not win the comparison.
Implementation steps
- 1
Fix browser, device, camera path and scene.
- 2
Record selected backend and unsupported outcomes.
- 3
Measure edit, save and reopen with correctness checks.
- 4
Publish only observed resource and latency values.
Copy-ready example
{"actualGpuRuns":0,"backend":null,"firstUsableViewMs":null,"editToVisibleP95Ms":null,"graphUtf8Bytes":null,"assetTransferBytes":null,"saveMs":null,"reopenAccepted":null}Frequently asked questions
Does the four-second timeout bound total startup?
No. The helper applies it to specific WebGPU operations, not all application loading and WebGL work.
Does a 10 MiB graph cap bound GPU memory?
No. Referenced assets, rendering buffers and process memory are separate resources.
Sources
- README.mdSource checked 2026-09-08
- LICENSESource checked 2026-09-08
- packages/cli/package.jsonSource checked 2026-09-08
- packages/core/package.jsonSource checked 2026-09-08
- packages/viewer/README.mdSource checked 2026-09-08
- packages/cli/src/runtime.tsSource checked 2026-09-08
- packages/cli/src/editor-process.tsSource checked 2026-09-08
- packages/cli/src/mcp-connector.tsSource checked 2026-09-08
- packages/mcp/src/transports/http.tsSource checked 2026-09-08
- packages/mcp/src/storage/sqlite-scene-store.tsSource checked 2026-09-08
- packages/core/src/store/use-scene.tsSource checked 2026-09-08
- packages/viewer/src/components/renderers/node-renderer.tsxSource checked 2026-09-08
- packages/viewer/src/lib/renderer-capability.tsSource checked 2026-09-08
- packages/core/src/validation/validate-build-json.tsSource checked 2026-09-08
- packages/core/src/utils/heal-scene-graph.tsSource checked 2026-09-08
- packages/mcp/src/storage/slug.tsSource checked 2026-09-08