Skip to content

Aura3D 5.5.1

Latest

Choose a tag to compare

@gchahal1982 gchahal1982 released this 10 Nov 07:27
· 84 commits to main since this release

The last release of this program: the engine work that put the final two showcase games on WebGPU, worker frame rates, a walking fix for The Bellkeeper's Walk, and a site build fix. All of it was live on the showcase site before this npm release (AGENTS.md "Shipping rules" 2). WebGL2 output is unchanged.

WebGPU draw path (P1-P3)

  • Per-frame uniform arena for batched draws (P1). Batched draws inside a frame no longer take a pooled uniform buffer and a writeBuffer each. Their uniform blocks are staged in a CPU mirror of a few large uniform buffers at minUniformBufferOffsetAlignment offsets, bound as { buffer, offset, size }, and uploaded at batch submission with one writeBuffer per coalesced dirty run (runs closer than 1 KB merge). Offsets restart every frame, so an unchanged draw uploads nothing and reuses its bind group. Generated-PBR slot images record the byte range a patch wrote, so unchanged regions compare and copy only that range instead of the 8 KB block. A failed upload stops the arena until reset (draws fall back to pooled buffers); draws outside a frame or batch, and non-batchable draws, keep pooled buffers. Render-target owner lookups remember misses until the target set changes.
  • One pass over a draw's uniforms. WebGPUDevice.draw walked every uniform three times per draw (structured-value check, attachment-feedback textures, batch access list); it now walks them once and hands the texture bindings to both checks. Same checks, same errors.
  • Material bind groups remembered per arena range. A batched draw's material group is compared with the group its arena range bound last frame (layout, bindings, resource objects, buffer offset and size) before the keyed cache lookup; any difference falls through to the keyed cache.
  • Native depth-of-field passes share the frame's batch encoder (P3). DoF passes record into the open batch encoder instead of one encoder and queue submission each; each DoF pass keeps one uniform buffer per label and size, the sampler and bind group come from the caches, depth-only views are created once per depth texture, and the DoF pipeline key is looked up per fragment source instead of serialising the shader each pass. Stage markers and submission flags keep their failure semantics.
  • Lamplight Line quad sprites (WebGPU path only) skip an updateAttribute whose array and offset equal the last ones for that name. The WebGL2 point path is unchanged.
  • Draw merging (P2) turned out not to be needed for these scenes: Pip's Big Leap issues the same 1,138 native draws per frame on WebGPU and WebGL2, and WebGL2's multi-draw path is not active there.
  • WebGPU is now the default in Pip's Big Leap and Lamplight Line, so all 30 showcase games default to WebGPU (WebGL2 fallback kept, ?backend=webgl2 opts out). Real-GPU check 2026-11-09: same frame and 0 errors in every run; fps ratio 1.01x (Pip's, 1 load-clean pair) and median 0.97x (Lamplight, 3 load-clean pairs). The full 10-pair sample was not reachable under the machine's load, and the owner approved the switch on these results. Table in docs/upgrade-5.0.0/README.md.

Worker rendering (P4)

  • Worker fps is real. The worker stamps each presented frame with its own performance.now() (AuraWorkerFrameResult.presentedAt, optional) and workerRootApp feeds it to the same 1 s frame-rate meter the main-thread loop uses, so a worker app's diagnostics().fps is no longer 0. Capture-only frames do not count; results without the stamp fall back to the host clock. Worker rendering stays opt-in (?worker=1); per-game worker vs main-thread fps is recorded in docs/upgrade-5.0.0/README.md when measured.

Showcase and site

  • The Bellkeeper's Walk: the walker walks. The game renders with app.step(0) on its own clock, so the engine mixer never advanced and the walk clip stayed frozen at weight 0 while the walker slid. The clips now run through createAnimationController, advanced on the game clock at ground speed over the clip's stride speed (1.336 m of travel advances the Walk clip 0.576 s against 0.577 s expected), with a 0.15 s crossfade only when the gait changes. The movement path is unchanged (the 1e-9 reference-trajectory test still passes). The kite string, which read as a stray white line from the walker's hand to the cottage chimney, is removed; the kite stays.
  • Alias routes keep their fonts. Catalog alias routes (for example /apps/serpentine-sky-run/ for showcase-serpentine-sky-run-port) now get a copy of the source route's local directories (fonts) next to their index.html; Cloudflare Pages did not reliably apply the alias rewrite rules for them, which left Serpentine Sky Run and Shadowstep Gauntlet without their fonts. Shared Aura assets keep one copy behind their rewrite.

Agent-authoring comparison (C1)

  • The fixed 8-task comparison (native Aura3D 5.5.0, three.js, three.js + bridge) is frozen in tests/reports/benchmark-c1/SPEC.md on exp/551-c1bench, with a stub dry run on all three arms; the paid run starts once 5.5.0 is on npm. No engine change.

Upgrade notes: https://aura3d.auraone.ai/docs/migration/4-to-5