Type Alias ResolvedGaussianSplatQuality

ResolvedGaussianSplatQuality: {
    behindFoveate: number;
    coneFoveate: number;
    fetchers: number;
    lodRenderScale: number;
    lodSplatScale: number;
    maxPagedSplats: number;
    maxPixelRadius: number;
    maxSh: number;
    maxStdDev: number;
    minAlpha: number;
    minSortIntervalMs: number;
    resolutionScale: number;
    xrFramebufferScale: number;
    xrMaxFps: number;
}

Concrete Spark settings a GaussianSplatQuality resolves to.

Type declaration

  • behindFoveate: number

    Spark cone-foveation detail scale BEHIND the viewer (default 0.2). Lower = coarser.

  • coneFoveate: number

    Spark cone-foveation detail scale at the edge of the foveation cone (default 0.4). Lower = coarser splats OFF-CENTER, freeing the shared LOD splat budget for the visible cone — on a phone's ~60-75° AR view the no-foveation cone (90°) covers the screen, so this costs little visible quality.

  • fetchers: number

    Parallel chunk fetch/decode workers while paging (each can saturate a core).

  • lodRenderScale: number

    Spark lodRenderScale — minimum on-screen pixel size for LOD splat selection. HIGHER is coarser/cheaper: 1 selects splats down to 1px, values up to ~5 are "often indistinguishable" per Spark's docs while skipping sub-pixel splats.

  • lodSplatScale: number

    Multiplier on Spark's per-device LOD splat budget (defaultSplatTarget: Android 1M, iOS 1.5M, Quest 500k, desktop 2.5M). Lower is cheaper.

  • maxPagedSplats: number

    Cap on Spark's resident paged-splat pool (0 = Spark's device default: iOS 6.3M, other mobile 8.4M, desktop 16.8M splats). Bounds streaming MEMORY growth — zooming into a large paged scene otherwise pages splats in until the tab dies (observed: iOS Safari page crash on zoom). Only effective before the shared pager is created (applied at renderer creation; runtime quality changes cannot shrink the pool).

  • maxPixelRadius: number

    Maximum on-screen pixel radius per splat (Spark default 512). Caps the worst near-camera overdraw where single splats cover huge screen regions.

  • maxSh: number

    Spherical-harmonics bands to fetch/keep (0-3). SH data dominates splat decode cost, memory and bandwidth — 0 drops view-dependent color but is a step change in CPU/memory load.

  • maxStdDev: number

    Maximum standard deviations of the Gaussian to rasterize. Rendered quad AREA — and with it splat fill cost — scales with the square: √8 (Spark default) → √4 halves splat overdraw. Spark documents √4..√9 as acceptable.

  • minAlpha: number

    Minimum peak alpha for a splat to render at all — Spark culls whole splats below it in the VERTEX stage (the quad never rasterizes). Spark's default (0.5/255) culls nothing; raising the floor a few /255 removes the large faint "fog" splats that cost maximal overdraw for minimal visual contribution. Splat-only fill lever, used by the deeper adaptation levels.

  • minSortIntervalMs: number

    Minimum milliseconds between splat re-sorts. Spark's own default is 0 (sort back-to-back whenever the view moved ≥1mm/~2.5°), which keeps a worker core saturated during any interaction.

  • resolutionScale: number

    Multiplier on Context.resolutionScaleFactor — the LAST-RESORT fill lever, used only by the single deepest adaptation level after every splat-local knob (LOD, overdraw caps, foveation, alpha floor) is exhausted, and like every step it must verifiably buy fps or it reverts. Presets keep 1.

  • xrFramebufferScale: number

    Framebuffer scale for XR sessions (1 = native XR resolution). Splat content is soft and tolerates resolution reduction well; fill cost drops with the square. Applied as a DEFAULT for the next session start (WebXR cannot change it mid-session) — an explicit NeedleXRSession.framebufferScaleFactor wins.

  • xrMaxFps: number

    XR frame-rate cap (0 = uncapped). AR splat rendering pins the GPU and heats phones within a minute; running at 30 roughly halves the power draw. Applied through Context.xrFrameRateLimit → WebXR updateTargetFrameRate where the runtime supports it (never by engine-side frame skipping — that flickers on runtimes without a reprojecting compositor).