All field studies

All field polish combined

Forest and farm with all six lanes together. Life stays at Current. This is a draft for Kyle's visual sign-off.

Today is task-start main ff64b2a7, including #258's desktop board zoom-out. Both sides use the real exported app on the Mac mini M1 through ANGLE Metal. Phone viewport 390×844, DPR 2 on high and DPR 1 on low. Open either image for the full PNG.

Combined costs

Each cell reads baseline → combined. Triangle and draw counts cover the full rendered scene. GPU and CPU are median / p95 milliseconds. The audit measured GPU timing for the four board shots only. Today supplies a fresh control for all shots.

ShotTrianglesDrawsGPU msCPU msField downloadField textures

Field download includes the GLB and field-prefixed baked maps requested by the app, using decoded resource body bytes. Shared cast, cards and JavaScript are excluded. Audit download totals are recomputed from its original request records with this same definition; its headline forest figure was GLB-only. Existing forest-prefixed preloads add 390,212 bytes on high or 156,963 on low and remain unchanged. Textures estimate resident field pixel storage including mip levels, excluding driver padding, renderbuffers and CPU-decoded or preloaded but unused images. Audit texture figures are the lane's conservative RGBA8 estimates; Today and combined use traced WebGL uploads. Forest includes the shared 1,024-byte 16×16 RG16F DFG lookup; its format is resolved from Three r186 DFGLUTData.js because the older trace helper did not label RG16F.

Measurement method and limits

The gap-audit harness drives the actual Home and offline board routes. Each shot uses a fresh context and a fixed Math.random seed. The offline game also has a time-based seed, so settled card and status props can differ between runs. Board captures wait for the real settled auction-turn camera. No camera or field visibility is changed for a better view. Additional forest reverse views hold simulation at the naturally reached seat0 shot to expose the creek.

CPU samples are five seconds of active rendered requestAnimationFrame callbacks, including the host's normal updates. GPU samples are 24 synchronized renders of the actual scene and camera, excluding the first four; all 20 retained timer queries must be available and not disjoint. CPU and GPU overlap and must not be added. GPU samples exclude simulation, UI and card FX. Home can sleep between events; its CPU distribution includes rendered callbacks only.

The original audit predates #258 and used different offline game states. Its counts and timing are historical comparisons, not isolated lane deltas. Use Today for current framing and same-session comparison. Short Mac samples at phone viewport sizes do not certify an iPhone or Android GPU, thermal behavior or sustained frame rate.

Low is pinned with the existing host quality override before the scene settles. It retains half-size farm maps, reduced field geometry, DPR 1 and no MSAA. Both light atlases are unbound on low. Foliage, contours, prop finishes and atmosphere remain; life batches and wind vertex work are omitted. The full embedded GLB still downloads and may CPU-decode its light atlas.

All costs and sample counts · Source heads, generation proof and decisions

Audit crops

Conflicts and tuning decisions
  1. Forest GLB: regenerate ground from original plus published study, compare byte-identical with #252, prepare against that output, prove every model/geometry/placement bake input byte-identical with corrected light bake, reuse exact AO/shade arrays, then pack light over the ground result. Ground images and all 85 non-colour streams survive.
  2. Forest foliage #250: retain inherited hooks, LEAF_LIT, atlas, foliage shader and wind; combine cache keys instead of selecting either lane.
  3. Farm foliage #251: retain ground/light imports and private foliage material.
  4. Shared contours #259: compose both field hooks and forest test keys; use the contour-owned farm material for foliage so no abandoned private material is leaked.
  5. Forest props #264 and farm props #260: union imports; preserve finish invocation and all rail/scarecrow geometry edits.
  6. Forest depth #265: add the atmosphere callback and -air-1 key after existing lighting/foliage. Ground, creek and sky remain untagged.
  7. Wind #248: retain foliage on both tiers, disable only wind work on low, keep rooted Current motion and combined high/low keys. Update assertions for composed keys and no low-tier wind uniform.
  8. Forest life #246: preserve finish call before adding life initialization. Farm life #249: union imports and retain slower mill, light application and GPU life updates.
  9. Farm foliage and contour masks share a single 82% rim attenuation, using max(vLeafContour, plantMask), rather than multiplying two 82% reductions. The broad foliage shade and the f1 contour mask both survive.
  10. Forest prop selection uses pigment ratios after AO instead of absolute RGB bands. Exhaustive decoded comparison preserves all 947 stone and 3114 cut-wood vertices with zero false positives or negatives; exported log footprints still limit cut wood.
  11. Life stays exactly at Current. No More/Lots motion is imported; forestLife.js, farmLife.js and their counts/paths remain separable for a later swap.
  12. No global brightness, camera, sky, fog or density changes beyond the supplied lanes. M1 Home captures retain the bright pastel farm and the layered woodland; no extra global colour tuning was needed.
  13. Material ownership: name the private farm foliage material so light reuses it instead of cloning it again. The disposal assertion fails before and passes after. All shaders, uniforms, geometry and program keys are byte-identical for A/B seats on full/reduced detail; captured visuals and per-frame costs remain valid.
  14. Local HTTP server listen backlog increased from 5 to 128 after a farm Home capture recorded connection resets. The rejected capture is excluded and retaken; app source is unchanged.
  15. An initial low capture auto-promoted to mid during the long intro. It is excluded. Accepted low captures pin the existing host quality override before settling and verify DPR1, reduced detail, no MSAA, no atlas sampler and no wind uniforms.
All source PRs

#252, #245, #255, #256, #250, #251, #259, #264, #260, #262, #265, #266, #248, #246, #249

The task's list contains 15 PRs, although the brief says 14. All 15 listed heads are included. The source drafts remain open and unchanged.