#269 comparison

Full-resolution fields

Draft for Kyle's sign-off. The far scenery reuses the clearing's full tree and foliage meshes. The farm fields map is repainted at 6144px. Choose the full version or the measured phone option.

Today and #269 are the accepted M1 captures from the combined study. After uses the same harness, fixed viewport, route and seeded randomness. The offline game's time-based seed can change cards and character poses. Open a still for its full PNG.

Back areas at full size

Measured cost

Shot / versionTrianglesDrawsGPU median / p95 msCPU median / p95 msField download MBField texture MBScene GPU storage MBDPR
Method and limits

Mac mini M1, Chromium through ANGLE Metal. Each fresh browser context loads the real Home or offline table. Board shots wait for the settled auction-turn camera. CPU uses five seconds of rendered requestAnimationFrame callbacks. GPU uses 24 synchronized scene renders, excluding four warm-ups; each row requires 20 valid non-disjoint timer queries. CPU and GPU overlap and must not be added.

The 16.7 ms p95 line is a 60 fps target. These are phone-sized viewports on the M1, not physical-phone certification. Desktop shots are DPR 1, phone high shots start at DPR 2. The low-controller shot is shown separately; it keeps full field assets and uses that controller's MSAA and actor/FX choices. Full quality is never replaced with a low-resolution mesh or texture to hide a failed budget.

Download is decoded HTTP body bytes for the field GLB and field-prefixed baked maps; cast, JavaScript and shared cards are excluded. Field texture memory is traced resident pixel storage including mips. Scene GPU storage adds all traced scene textures, geometry buffers and renderbuffers. Browser-default framebuffer, driver padding, transient allocations and CPU-decoded images are excluded. WebGL exposes no reliable process VRAM counter, so these are allocation estimates. Historical #269 did not trace buffers, so its scene-storage cells are unmeasured.

Measurements · Inventory data · Heads and decisions · Gate result · Live field switching and tablet DPR

Quality-reduction inventory

70 entries with base file:line and full-quality cost

Locations refer to #269's base source. Costs marked estimates are geometry or pixel arithmetic, not frame-time predictions.

Base locationReductionFull-quality costAfter
apps/mobile/src/three/scene/fields/forestFar.js:93Twelve procedural crown lobes and two branches; 992 triangles with a six-sided open trunk.triangles Per Tree: 12,862; crown Triangles: 12,530; wood Triangles: 332; delta Triangles Per Tree: 11,870; draws Per Species: 2Replace with clearing oak crown plus eight complete wood components.
apps/mobile/src/three/scene/fields/forestFar.js:101Six crown lobes; 492 triangles including a six-sided trunk.triangles Per Tree: 12,862; delta Triangles Per Tree: 12,370; draws Per Species: 2Same complete oak as the medium band, with original normals.
apps/mobile/src/three/scene/fields/forestFar.js:108Fourteen 20-triangle pink spheres on the procedural crown; 1,272 total triangles.triangles Per Tree: 11,656; crown Triangles: 10,160; petal Triangles: 924; wood Triangles: 572; delta Triangles Per Tree: 10,384; draws Per Species: 3Use clearing blossom crown, all selected above-crown petal components and baked wood.
apps/mobile/src/three/scene/fields/forestFar.js:243Far blossom candidates become generic 492-triangle broadleafs. Their pink petals disappear.triangles Per Tree: 11,656; delta Triangles Per Tree: 11,164; full Density Instances: 115; reduced Instances: 52; draws Per Species: 3Keep far blossoms as the same 11,656-triangle blossom used nearer the clearing.
apps/mobile/src/three/scene/fields/forestFar.js:119Six scalloped 14-segment cone tiers; 180 triangles with trunk.triangles Per Tree: 2,968; crown Triangles: 2,616; wood Triangles: 352; delta Triangles Per Tree: 2,788; draws Per Species: 2Use clearing spruce foliage plus its complete baked trunk.
apps/mobile/src/three/scene/fields/forestFar.js:121Five plain 10-segment cone tiers; 112 triangles with trunk.triangles Per Tree: 2,968; delta Triangles Per Tree: 2,856; draws Per Species: 2Use the same complete spruce as the medium band.
apps/mobile/src/three/scene/fields/forestFar.js:73Procedural tree geometry discards UVs, uses generic roughness-1 untextured material and forces flat shading on far broadleafs at line 251.shared Rgba8With Mips Bytes: 2,796,200; incremental Texture Bytes: 0; incremental Asset Download Bytes: 0Keep source UVs, normalized RGBA colours, original transformed normals, material names and source Texture objects; apply the same bark finish as near trees.
apps/mobile/src/three/scene/fields/forestFar.js:229Random distance crossover at 48–62 m selects medium or far geometry.full Density Tree Triangles: 13,730,674; reduced Tree Triangles: 5,264,094; additional Geometry Lod Bytes: 0Keep its random draw and planting iteration to preserve all instance matrices/colours; combine both bands into one batch per source part/species.
apps/mobile/src/three/scene/fields/forestFar.js:49Reduced changes keep from [.62,.3] to [.45,.3], spacing from [3.6,.03] to [4.4,.05], then removes the medium-detail band.full Density Trees: 1,603; reduced Trees: 618; full Density Far Triangles: 13,820,882; reduced Far Triangles: 5,280,622; restore Density And Floor Delta Triangles: 8,540,260; full Mesh Draws Before Culling: 12; reduced Mesh Draws Before Culling: 10Keep 618 tree positions versus 1,603 full-density positions. Restore complete crowns, wood, UVs and textures at every retained position.
apps/mobile/src/three/scene/fields/forestFar.js:41Spacing grows from 3.6 m at 26 m to about 7.32 m at 150 m; stand acceptance also leaves deliberate gaps.current Full Trees: 1,603; current Reduced Trees: 618; estimate: Keeping 3.6 m spacing at the outer radius would increase local candidate density by about (7.32/3.6)^2 = 4.13 times. Exact whole-scene count requires a new layout and clearance pass, which this patch does not perform.Retain the approved planting layout; no hidden device-dependent geometry substitution.
apps/mobile/src/three/scene/fields/forestFar.js:60Post-lighting air blend reaches 52% at 145 m and begins at 24 m, suppressing crown cavities, grain and petal contrast.added Triangles: 0; added Texture Bytes: 0; added Draws: 0; uniform Count Unchanged: True; gpu Ms: NoneLower only the generated-tree blend ceiling to 22%; preserve hue, range, terrain, creek, near trees and sky.
apps/mobile/src/three/scene/fields/forestFar.js:190Terrain has 26 radial rings and 256 angular segments, increasingly coarse outer radial intervals; 12,800 triangles and 6,682 vertices on both tiers.current Triangles: 12,800; current Geometry Bytes: 370,808; constructed Alternative Triangles: 51,200; constructed Alternative Geometry Bytes: 1,458,372; delta Triangles: 38,400; delta Geometry Bytes: 1,087,564; alternative: Insert one ring between each existing pair and use 512 angular segments. This is a measured geometry budget, not an implemented or visually approved surface.Raised from 12,800 to 51,200 triangles on the same analytic landform and seam.
apps/mobile/src/three/scene/fields/forestFar.js:196Planar x/24,z/24 UVs extend beyond the clearing texture; clamped meadow pixels stretch over the distant landform. The terrain uses a clone of the existing meadow material at line 210.current Shared Rgba8With Mips Bytes: 27,962,024; incremental Current Texture Bytes: 0; estimate: A separate seamless 2048-square RGBA8 far-ground tile would add 22,369,620 bytes with mips and one material texture slot. Its encoded download size and actual visual result need an authored asset; no such asset is created here.Uses the clearing colour and normal maps at the same world texel scale; a mirrored path-free patch continues across the hills. No added texture.
apps/mobile/src/three/scene/fields/forestFar.js:271One 71-triangle clump uses six four-sided cones, three four-triangle fronds, three five-triangle leaf discs and one 20-triangle pebble. It has no source pigment texture.current Triangles Per Clump: 71; current Clumps: 960; current Placed Triangles: 68,160; existing Clearing Understory Foliage Triangles: 3,124; existing Clearing Understory Solid Triangles: 1,376; full Source Alternative Triangles Per Clump: 4,500; source Alternative Placed Triangles: 4,320,000; delta Triangles: 4,251,840; draws For Source Alternative: 2; incremental Source Texture Bytes: 0; alternative: Reuse the existing paired understory batches, preserving both materials and the shared 512-square leaf map. This measures source asset cost; its footprint and species differ from the far clump and require a separately approved placement fit.Reuses the actual clearing understory foliage and solid pair, 4,500 triangles per clump, fitted to the old footprint. 960 placements at full density.
apps/mobile/src/three/scene/fields/forestFar.js:290Far rocks are an untextured 80-triangle icosahedron with vertex shading; 69 instances.current Triangles Per Rock: 80; current Instances: 69; current Placed Triangles: 5,520; constructed Smooth Alternative Triangles Per Rock: 1,280; constructed Smooth Alternative Placed Triangles: 88,320; delta Triangles: 82,800; incremental Texture Bytes: 0; alternative: IcosahedronGeometry detail 7 is a measured 1,280-triangle budget. It only rounds the old rock and is not evidence of matching a near stone. Extracting a specific near stone remains unimplemented.Extracts a complete existing clearing stone and preserves its source pigment and topology; fits the original footprint.
apps/mobile/src/three/scene/fields/forestFar.js:294Clump/rock rows step 2.6 m; keep probability fades from 0.55 beyond 45 m to zero at 100 m.current Details: 1,029; current Triangles: 73,680; estimate: Restoring omitted vegetation outside 100 m is a new layout. At the existing 2.6 m spacing, extending to 150 m at 0.55 keep adds roughly 3,195 pre-clearance candidates. With the current 93% clump/7% rock split this is about 228,854 triangles; at 4,500 triangles per source understory clump, roughly 13.4 million triangles. These are annulus-area estimates, not placed measurements.Keep approved placement and fade. Existing full density has 1,029 details, 73,680 placed triangles.
apps/mobile/src/three/scene/fields/forestFar.js:49Reduced floor:false removes every clump and rock.restore Current Floor Triangles: 73,680; restore Current Floor Instances: 1,029; restore Current Floor Draws: 2; restore Current Floor Geometry Bytes: 16,308; restore Current Floor Instance Bytes: 78,204Retain this explicit density omission; tree geometry and texture resolution remain complete.
apps/mobile/src/three/scene/fields/forestFar.js:320Ten clouds each use four 80-triangle puffs; 3,200 merged unlit triangles with vertex colours and no texture.current Triangles: 3,200; current Geometry Bytes: 230,400; constructed Alternative Puff Triangles: 1,280; constructed Alternative Cloud Triangles: 51,200; delta Triangles: 48,000; alternative Position Color Bytes: 3,686,400; delta Position Color Bytes: 3,456,000; alternative: Replacing each puff with IcosahedronGeometry detail 7 measures smoothness cost only. It is not a newly authored high-resolution sky asset.Smooth 1,280-triangle puffs replace 80-triangle puffs. Cloud locations and palette stay unchanged.
apps/mobile/src/three/scene/fields/forestFar.js:343The reverse-angle sky is an unlit 24 by 12 gradient sphere with 528 triangles, not the 1536-square painted near sky.current Triangles: 528; current Geometry Bytes: 17,468; constructed Alternative Triangles: 9,024; delta Triangles: 8,496; constructed Alternative Geometry Bytes: 263,276; delta Geometry Bytes: 245,808; current Painted Sky Rgba8With Mips Bytes: 12,582,904; incremental Existing Sky Texture Bytes: 0; alternative: 96 by 48 sphere, same gradient and radius. Gradient interpolation is already smooth; this is a concrete tessellation budget, not a demonstrated quality need.Raised to 96 by 48 segments, 9,024 triangles. Painted sky image retained.
apps/mobile/src/three/scene/fields/forest.js:50Reduced turns off tagged plant sway. Near foliage already behaves this way; full far crowns now inherit the same tagged foliage/wind/contour patches.geometry Delta: 0; texture Delta Bytes: 0; max Full Sway Meters: 0.015; full Far Crown Instances: 1,603; reduced Far Crown Instances: 618; estimate: Enabling reduced sway adds the existing wind vertex arithmetic on 618 complete crowns. Frame-time cost has not been measured.Retain reduced motion policy, source geometry and maps.
apps/mobile/src/three/scene/fields/forest.js:37takeForestLightAtlas disables the 1024-square field-light atlas for detail:reduced. This is a ground-lighting policy, not a far-tree texture reduction.atlas Rgba8With Mips Bytes: 5,592,404; incremental Geometry: 0; incremental Draws: 0; added Shader Samples Per Ground Fragment: 1; asset Download Delta: 0Unchanged; implementation is outside the forest-far assignment.
apps/mobile/src/three/scene/fields/forest.js:151Field fog is null; atmosphere is the tree-only air shader. Sky materials explicitly use fog:false.added Triangles: 0; added Texture Bytes: 0; added Draws: 0Retain. No scene-wide fog, post-process blur or detail-hiding pass is added.
apps/mobile/src/three/scene/fields/farm.js:352Seven of seventeen hedge placements always select f1_hedgelo_0..2, even on full detail. Only the central ten use the finest models.far Base Triangles: 35,256; far After Triangles: 108,060; added Triangles Both Tiers: 72,804; extra Draw Submissions: 0; extra Texture Bytes: 0; extra GLBBytes: 0All seventeen use the clearing f1_hedge_0..5 library, following the existing central variant sequence. Positions, yaw and scale stay unchanged.
apps/mobile/src/three/scene/fields/farm.js:353Reduced detail swaps the ten central hedges for *_lo prototypes.base Triangles: 71,136; after Triangles: 160,064; added Triangles Reduced Only: 88,928; extra Draw Submissions: 0; extra Texture Bytes: 0Use the same full prototypes as full detail.
apps/mobile/src/three/scene/fields/farm.js:563Reduced detail uses f1_tree_a_lo, b_lo and c_lo.base Triangles: 43,330; after Triangles: 79,970; added Triangles Reduced Only: 36,640; extra Draw Submissions: 0; extra Texture Bytes: 0Use full f1_tree_a, b and c on both tiers.
apps/mobile/src/three/scene/fields/farm.js:576Reduced detail uses five clump_a_lo and five clump_b_lo.base Triangles: 29,440; after Triangles: 64,800; added Triangles Reduced Only: 35,360; extra Draw Submissions: 0; extra Texture Bytes: 0Use full f1_clump_a and b on both tiers.
apps/mobile/src/three/scene/fields/farm.js:569Six near hills use 40x12 hemisphere segments; three larger far hills use 40x10.base Triangles: 7,800; after Triangles: 54,432; added Triangles Both Tiers: 46,632; extra Draw Submissions: 0; extra Texture Bytes: 0Use 96x32 hemisphere segments on all nine hills, retaining centres, dimensions and vertex-colour formula.
apps/mobile/src/three/scene/fields/farm.js:527Only wheat plots 3 and 4 receive GLB sheaves. Wheat plots 6, 7 and 11 remain painted rectangles. Plot 2 has a separate procedural low crop mass.added Full Copies: 98; added Full Triangles: 86,240; added Reduced Copies: 39; added Reduced Triangles: 34,320; extra Draw Submissions: 0; extra Texture Bytes: 0; extra GLBBytes: 0Add the same 880-triangle wheat_clump as plots 3 and 4 to plots 6, 7 and 11. Reject candidates against all static prop bounds plus 4 cm wind clearance. Retain the painted layouts.
apps/mobile/src/three/scene/fields/farm.js:528Reduced rows use 0.65 m nominal spacing rather than 0.42 m, keeping the same sheaf model.existing Full Copies: 73; existing Reduced Copies: 35; existing Difference Triangles: 33,440; new Full Copies: 98; new Reduced Copies: 39; new Difference Triangles: 51,920; total Difference Triangles: 85,360; extra Draw Submissions For Full: 0; extra Texture Bytes: 0Preserve as the allowed phone instance-count option; apply the same choice to added far plots.
apps/mobile/src/three/scene/fields/farm.js:453Reduced detail targets half as many clover, daisies and loose straw. All use the same full GLB meshes.difference Triangles: 18,240; extra Draw Submissions For Full: 0; extra Texture Bytes: 0Preserve as the allowed phone instance-count option. Existing random placement sequence and keep-outs stay unchanged.
apps/mobile/src/three/scene/fields/farm.js:610Reduced detail omits the wind deformation shader for swaying plants.extra Triangles For Wind: 0; extra Texture Bytes: 0; extra Draw Submissions For Wind: 0; GPUms: None; GPUms Status: unmeasured; enabling wind adds vertex shader arithmetic, not geometryPreserve. Full mesh positions and normals remain; only animation work is omitted.
apps/mobile/src/three/scene/fields/farm.js:659Reduced windmill rotation is -0.09 t, compared with -0.18 t plus a gust term on full detail.silo Triangles: 9,152; windmill Body Triangles: 13,316; sail Triangles: 5,908; cost To Remove Geometry LOD: 0; extra Triangles For Full Motion: 0; GPUms: NonePreserve motion choice. Both tiers already use identical full windmill and sail geometry.
apps/mobile/src/three/scene/fields/farm.js:63Reduced detail detaches the 512x512 atlas without binding it. On #269 only full/default-A can bind it after the farmLight layout-key guard.embedded Atlas Width: 512; embedded Atlas Height: 512; embedded PNGBytes: 50,361; extra Geometry For Matching Rebake: 0; matching Rebake Bytes: None; rebake Status: not performed; would change the protected GLB and farmLight.js outside this patch; RGBA8Mip Allocation Estimate Bytes: 1,398,100Ground-light image rebaked from upgraded geometry at the original 512px resolution. Layout guard is updated only to the measured matching key 66180278. Every non-atlas GLB binary byte is identical.
apps/mobile/src/three/scene/fields/farm.js:281Near and fields maps both use 2048x2048 pixels, covering 13.2 m and 38 m respectively. The fields map has about one third the texels per metre.near Texels Per Metre: 155.15151515151516; fields Texels Per Metre: 53.89473684210526; pixels For Equal Density: 5,896; example6144Fields Map Estimate Bytes: 201,326,584; current2048Fields Map Estimate Bytes: 22,369,620; example Extra Estimate Bytes: 178,956,964; encoded Download Delta: None; download Status: unknown until a real bake; not includedRepainted the fields map at 6144px instead of 2048px, matching the clearing map world texel density within 4.3%. Full field maps selected on all tiers.
apps/mobile/src/three/scene/fields/farm.js:309Near ground is a 64-triangle disc. Fields are a 48x4 ring and the untextured far ground a 40x2 ring with broad vertex-colour haze.near Triangles: 64; fields Triangles: 384; far Triangles: 160; uniform64Angular Segments Total Triangles: 832; uniform64Added Triangles: 224; extra Texture Bytes: 0Outer ring now samples clearing grass at the same world texel density; keeps the original bright haze palette. Flat surface has 2,048 triangles instead of 160.
apps/mobile/src/three/scene/fields/farm.js:541Plot 2 behind the hedge is a 132x18 procedural row surface, 0.3 m nominal height. It is intentionally a low continuous crop mass at the gameplay top band.triangles: 4,752; extra For Retaining Clearing: 0; standalone Sheaf Triangles: 880; uniform042Spacing Candidate Sheaves: 55; candidate Sheaf Triangles Estimate: 48,400; limitation: 55 is an analytic unfiltered grid count, not a clipped placement or an approved replacementRetain the clearing appearance and current clearance. Full wheat geometry is reused in the distant standing-sheaf plots, not added above this low mass.
apps/mobile/src/three/scene/fields/farm.js:482Scarecrow uses small procedural ellipsoids, tubes and lathed hat surfaces; fence rails are procedural farmRail meshes. They do not switch models with distance or detail.veg And Scarecrow Triangles: 20,378; fence And Hedge Triangles After: 322,368; extra Triangles For Removing LODSwitch: 0Retain approved shapes and transforms. Smoothing these is separate from removing far foliage LOD.
apps/mobile/src/three/scene/fields/farm.js:144Farm sky uses a 16x10 dome. Each cloud has an 18x9 central ellipsoid and two 9x5 side ellipsoids. These counts are identical on both tiers.sky Triangles: 288; cloud Triangles: 864; hypothetical Sky64x32Triangles: 3,968; hypothetical Sky Added Triangles: 3,680; hypothetical All Cloud Lobes18x9Triangles: 1,728; hypothetical Cloud Added Triangles: 864; extra Textures: 0Retain the pastel sky, cloud positions and approved soft cloud forms.
apps/mobile/src/three/scene/fields/farm.js:582The silo, windmill body and rotating sails already place the sole full library models. There are no lo aliases or distance switches.silo Triangles: 9,152; windmill Body Triangles: 13,316; sail Triangles: 5,908; total Triangles: 28,376; extra Triangles: 0; extra GLBBytes: 0Reuse without resampling or changing the GLB.
apps/mobile/src/three/scene/fields/farm.js:654createFarmLife receives opts unchanged. Its own module omits the life batch on reduced detail.full Life Triangles: 48; reduced Life Triangles: 0; full Life Draw Submission Upper Bound: 1; texture Bytes: 0; extra For Changing This Lane: 0Inventory boundary only. farmLife.js and life/FX were excluded from this lane.
apps/mobile/src/three/scene/fields/farm.js:150paintedTexture is called with the existing farm-ground ids. platform/textures.ts selects full or half baked images through its global scale, ignoring the painter size at runtime.full Ground Encoded Bytes: 421,735; half Ground Encoded Bytes: 138,285; full Ground Mip Estimate Bytes: 44,739,240; half Ground Mip Estimate Bytes: 11,184,808; estimated Difference Bytes: 33,554,432; full Extra Encoded Bytes: 283,450Field maps always use full sources, independent of the actor/FX tier. Farm fields map is now 6144px.
apps/mobile/src/three/scene/fields/farm.js:65edgeSafe can omit a whole prop crossing a gameplay frame edge; hidden keeps selected flowers and grass out of gameplay shots. The same guards run on both detail tiers.existing Standing Wheat Unfiltered Candidates Full: 84; existing Standing Wheat Accepted Full: 73; existing Standing Wheat Unfiltered Candidates Reduced: 40; existing Standing Wheat Accepted Reduced: 35; new Far Wheat Unfiltered Candidates Full: 200; new Far Wheat Accepted Full: 98; new Far Wheat Unfiltered Candidates Reduced: 82; new Far Wheat Accepted Reduced: 39; upper Bound New Far Triangles Without Either Guard Full: 176,000; upper Bound New Far Triangles Without Either Guard Reduced: 72,160; limitation: New far candidates are rejected for both shot edges and prop clearance. Removing clearance is not authorized. These upper bounds are not a proposed placement or measured render cost.; extra Texture Bytes: 0Retain the existing camera-derived placement rules. Full mesh quality does not remove these layout safeguards.
apps/mobile/src/three/quality.ts:38; apps/mobile/src/three/quality.ts:39; apps/mobile/src/three/quality.ts:40; apps/mobile/src/three/platform/webHost.ts:16Web caps DPR at controller DPR 1 / 1.5 / 2. Low also skips correction for CSS column scaling.formula: Framebuffer pixels scale as (newDpr / oldDpr)^2, multiplied by shown()^2 where low previously skipped it. At native DPR 3, former high DPR 2 to full is 2.25x pixels; former low DPR 1 to full is 9x. Balanced phone DPR 1.5 vs full DPR 3 is one quarter the pixels.Full uses device DPR. Balanced caps only forest phones at 1.5; farm, desktop and tablet retain device DPR. Home and table notify the adapter on field changes.
apps/mobile/src/three/quality.ts:38; apps/mobile/src/three/platform/webHost.ts:11; apps/mobile/src/three/platform/frameScheduler.ts:10Low requests 30 fps. Other tiers request 60 fps.formula: 60 vs 30 doubles maximum frame submissions per second. Achieved fps is unmeasured.Web adapter always returns maxFps 60, including saved/manual/adaptive low. Native retains controller 30/60 caps.
apps/mobile/src/three/quality.ts:49; apps/mobile/src/three/quality.ts:52; apps/mobile/src/three/quality.ts:62; apps/mobile/src/three/quality.ts:167; apps/mobile/src/three/quality.ts:177RAM <= 3 GiB, <= 2 cores or listed old/software GPUs choose low. Strong hints choose high; other hints choose mid. Saved/manual tier can select low independent of current hardware.behavior: Higher tier also increases particles, textures, MSAA and field detail under the original controller.Controller, storage fingerprint and override behavior unchanged. Web adapter changes only dpr, maxFps and fieldDetail. Tier, particles, textureScale and msaa are preserved.
apps/mobile/src/three/quality.ts:133; apps/mobile/src/three/quality.ts:143; apps/mobile/src/three/quality.ts:144; apps/mobile/src/three/quality.ts:159Active slow-frame p90 reduces DPR 2 -> 1.5 -> 1, then lowers the tier. Sustained fast frames recover, with upgrade backoff.behavior: Original controller budgets remain 30 fps for low and 60 for mid/high. Workload changes may still adjust actor/FX tier.Internals and pure quality tests untouched. Web field DPR/detail/frame target do not downgrade with those notifications; mapped onChange agrees with mapped settings().
apps/mobile/src/three/platform/textures.ts:21; apps/mobile/src/three/platform/textures.ts:28; apps/mobile/src/three/platform/textures.ts:35; apps/mobile/src/three/platform/baked-assets.ts:5One global requestedScale originally selected full or half sources for every prepared painted map, and the same global scale controlled lookup.formula: Half means width/2 and height/2: full has 4x texels. Costs are for all prepared maps of the selected field. GPU estimates only apply to maps actually bound/uploaded.Patched using one per-ID function for prepare cache keys, pending keys, lookup and localization key. All seven forest-/farm-prefixed maps use scale 1 on web/native. Thirteen other baked IDs still follow requestedScale. No half-source retry or fallback.
apps/mobile/src/three/scene/fields/farm.js:215; apps/mobile/src/three/scene/fields/farm.js:281; apps/mobile/scripts/bake-scene-textures.mjs:52; apps/mobile/scripts/lib/baked-textures.mjs:7Full means the authored bitmap dimensions, at most 2048x2048 for current painted field maps. Half sources are authored by canvas downsampling. Opaque maps are JPEG quality 90 with 4:4:4 chroma, alpha maps PNG.behavior: Removing half selection restores authored texels, not lost JPEG information or extra source detail. Doubling authored width/height would quadruple texels and needs a separate approved bake.Farm fields image repainted at 6144px, JPEG quality 90 and 4:4:4. Other authored field images retained at full resolution.
apps/mobile/src/three/platform/assets.ts:12; apps/mobile/src/three/platform/assets.native.ts:39; apps/mobile/src/three/scene/fields/forest-light-bake/pack.mjs:111; apps/mobile/src/three/scene/fields/lookdev-light/pack-farm.mjs:91Both platforms load the same whole field GLB with its embedded image sizes. Forest embedded images range from 128 to 2048 pixels; Farm atlas is 512x512. Farm packing explicitly resizes only that atlas to 512; Forest atlas is asserted 1024.behavior: GLB downloads are unchanged by textureScale and this patch. Raising these authored limits requires new source assets, outside this lane.Embedded maps stay full resolution. Farm 512px light image rebaked for upgraded geometry; no other embedded image/geometry is changed.
apps/mobile/src/three/platform/webHost.ts:12; apps/mobile/src/three/platform/nativeHost.ts:19; apps/mobile/src/three/platform/nativeHost.ts:22; package-lock.json:13488The app delegates texture upload and backing-buffer allocation to Three 0.186.1 / the device GL implementation. No app maxTextureSize setting was found. Authored dimensions remain bounded by MAX_TEXTURE_SIZE; framebuffer dimensions also have device limits.behavior: Hardware limit is not measured in this read/write-only lane. Lead must record renderer.capabilities.maxTextureSize and actual texture/backing-buffer dimensions on M1/native before claiming GPU full resolution.No hardware bypass or hidden full-to-half fallback added. Third-party Three source is not installed in the inspected checkout or the two alternate clones searched, so renderer downsize behavior was not source-verified here. An upload/allocation limit remains an explicit concern, not a claimed pass.
apps/mobile/src/three/platform/embedded-images.js:25; apps/mobile/src/three/platform/embedded-images.js:27; apps/mobile/src/three/scene/fields/common.js:34; apps/mobile/src/three/scene/fields/farm.js:154Distance/oblique minification uses texture mip/filter settings. Native GLB sampler default is LinearMipmapLinearFilter; Farm ground anisotropy is 8, shared ground helper is 4. Hardware may cap anisotropy.formula: An RGBA8 mip chain costs approximately 4/3 of base-level bytes. More anisotropic sampling costs texture fetch bandwidth; measured GPU cost unavailable.Unchanged. Full asset selection preserves mip filtering rather than disabling minification or fabricating detail. GLB sampler settings are retained.
apps/mobile/src/three/platform/nativeHost.ts:14; apps/mobile/src/three/platform/nativeHost.ts:19; apps/mobile/src/three/platform/nativeHost.ts:22Native renders into a capped intermediate target at min(renderer native DPR, quality DPR). Target format is half-float if EXT_color_buffer_float exists, otherwise unsigned byte; MSAA samples are 4 or 0.formula: At native DPR 3, removing low DPR 1 cap would be 9x target pixels; mid 1.5 to 3 would be 4x. Half-float color is 8 bytes/pixel before depth/MSAA; RGBA8 is 4.Deliberately unchanged. Native has no URL field mode. Full field painted assets still apply there through per-ID selection.
apps/mobile/src/three/platform/nativeHost.ts:9; apps/mobile/src/three/platform/nativeHost.ts:11; apps/mobile/src/three/platform/nativeHost.ts:57; apps/mobile/src/three/platform/nativeHost.ts:61Structural settings are held until a different field prepares; DPR and maxFps remain live. Non-field textures may stay half until the next field load after an upgrade.behavior: Reloading all structural settings mid-scene would require rebuilding materials/meshes and can increase residency.Unchanged. No global textureScale rewrite; loadedSettings still controls actor/FX requestedScale while field IDs always load full maps. Native reduced field geometry/light/motion may persist.
apps/mobile/src/three/scene/fields/forestLight.js:7; apps/mobile/src/three/scene/fields/forestLight.js:21; apps/mobile/src/three/scene/fields/forest.js:37Reduced detail detaches the carrier and returns no light atlas. Vertex AO/contact decals remain; embedded bytes can still download/decode.embedded bytes: 331,003; rgba8 base bytes: 4,194,304; rgba8 mipmap estimate bytes: 5,592,405.333333333; shader: Ground gets one additional atlas texture2D lookup. No extra draw needed. GLB download already includes the atlas.Web fieldDetail full enables existing atlas when carrier/map exists. Native low still omits the binding. Carrier absence behavior in field-owned code is unchanged.
apps/mobile/src/three/scene/fields/farmLight.js:7; apps/mobile/src/three/scene/fields/farmLight.js:38; apps/mobile/src/three/scene/fields/farm.js:63Reduced detail never exposes Farm atlas to renderer; GLB still carries its bytes.embedded bytes: 50,361; rgba8 base bytes: 1,048,576; rgba8 mipmap estimate bytes: 1,398,101.3333333333; shader: One ground atlas sample, no extra draw. Embedded download unchanged.Web fieldDetail full enables the existing atlas subject to its authored layout guard. Native low omission unchanged.
apps/mobile/src/three/scene/fields/farmLight.js:46; apps/mobile/src/three/scene/fields/farmLight.js:47Full atlas is valid only for seats A, modelScale 0.85, sideTurn 22, angles 0/135/180/225 and placement hash ec769aaf. Other layouts omit it.behavior: Forcing it onto mismatching geometry would produce wrong shadows, not higher quality.New atlas and exact matching layout key 66180278. Guard stays active for layout changes; full/default A binds this image.
apps/mobile/src/three/scene/fields/forest.js:112; apps/mobile/src/three/scene/fields/forestFar.js:49At #269 base, reduced detail lowers keep from [0.62,0.3] to [0.45,0.3], grows spacing [3.6,0.03] -> [4.4,0.05], removes medium band and floor details.behavior: Full restores denser tree/floor instances. Exact triangle/draw/frame cost depends on seed, blockers and the forest worker replacement; not measured.Full web modes select full density. Direct/native reduced option retains fewer instances of exactly the same complete clearing models.
apps/mobile/src/three/scene/fields/forestFar.js:41; apps/mobile/src/three/scene/fields/forestFar.js:92; apps/mobile/src/three/scene/fields/forestFar.js:122; apps/mobile/src/three/scene/fields/forestFar.js:229; apps/mobile/src/three/scene/fields/forestFar.js:243At base, trees change probabilistically from mid to far prototypes over 48-62 m. Broadleaf crowns use 12 vs 6 lobes, conifers 6/14 vs 5/10 tiers/segments, far blossoms merge to broadleaves. This is geometry reduction by distance, with no billboard.behavior: Keeping near prototypes would add triangles/vertex/shader work. Static prototype counts below are for Farm only; the Forest lane owns its revised numbers.All distance bands use complete clearing oak, blossom and spruce geometry, UVs and maps, including trunks and petals.
apps/mobile/src/three/scene/fields/forestFar.js:223; apps/mobile/src/three/scene/fields/forestFar.js:294; apps/mobile/src/three/scene/fields/forestFar.js:298Base tree candidate spacing grows with radius to 150 m; floor detail probability fades from 45 to 100 m and stops at 100 m.behavior: Removing spacing/fade increases instance count and rendered triangles. Exact resulting count is field-worker-owned and unmeasured.Field-owned, unchanged here. The phone density seam is the web adapter fieldDetail selection; it does not change texture resolution.
apps/mobile/src/three/scene/fields/forest.js:50; apps/mobile/src/three/scene/fields/forestLife.js:100Reduced opts omit foliage wind deformation and ambient life; missing board.isFree also omits life.behavior: Full adds wind vertex calculations plus the field life batch. No asset download change for the procedural life; exact frame/triangle cost unmeasured.Full web detail selects existing full behavior. Native reduced behavior unchanged. No actor or FX-family edits.
apps/mobile/src/three/scene/fields/farm.js:353; apps/mobile/src/three/scene/fields/farm.js:563; apps/mobile/src/three/scene/fields/farm.js:576Reduced opts select _lo versions of near hedge, fruit trees and hill clumps. Coarser models are present in the same GLB.behavior: Full per-copy triangle delta is full minus matching _lo entry. Draws may stay merged; total depends on placements. Download does not grow because both variants are in one GLB.Both direct/native detail tiers use full clearing hedge, tree and clump models. No coarse prototype is placed.
apps/mobile/src/three/scene/fields/farm.js:453; apps/mobile/src/three/scene/fields/farm.js:528Reduced halves ground clump count and changes wheat row/column spacing from 0.42 to 0.65.formula: Full ground detail is about 2x instances. Ignoring rounding, full wheat count is (0.65/0.42)^2 = 2.395x reduced. Exact counts need the field build.Web full detail restores density. Native reduced stays. This lane adds no field geometry.
apps/mobile/src/three/scene/fields/farm.js:610; apps/mobile/src/three/scene/fields/farm.js:659; apps/mobile/src/three/scene/fields/farmLife.js:10; apps/mobile/src/three/scene/fields/farmLife.js:141Reduced omits swaying shader work and the ambient-life batch; mill rotation uses a simpler/slower expression.behavior: Full adds vertex wind and ambient-life draw/instances. Mill uses the existing mesh. GPU/CPU timings not measured.Full web detail enables existing behavior. Native reduced unchanged.
apps/mobile/src/three/scene/fields/farm.js:353Even full opts use f1_hedgelo_0..2 for non-close hedge sections. This is authored spatial simplification, not camera-time billboard switching.behavior: Replacing with near models would add per-copy triangles. Not part of shared settings.Excluded; Farm worker owns distance prototype policy.
apps/mobile/src/three/scene/fields/farm.js:148; apps/mobile/src/three/scene/fields/farm.js:215; apps/mobile/src/three/scene/fields/farm.js:281Farm paints near radius 6.6 and mid radius 19 at 2048 each; the outer horizon ring to radius 95 uses coarse vertex colors, not a full ground bitmap.behavior: Painting the outer ring or raising authored density/resolution requires separate assets/geometry. Current full maps are 4x the half texel count.Fields map 6144px; outer terrain carries the clearing grass at matching texel scale. No untextured far ring remains.
apps/mobile/src/three/scene/fields/common.js:30; apps/mobile/src/three/scene/fields/common.js:44; apps/mobile/src/three/scene/fields/common.js:47Shared helper defaults to a 1024 near disc and a UV-free coarse far ring with 4 radial segments. Current GLB Forest does not call this near-ground helper.behavior: Keeping near texture/geometry everywhere requires more authored texels/triangles. This is helper capability rather than an active camera-tier switch.Unchanged; scene/fields excluded.
apps/mobile/src/three/scene/fields/forestFar.js:60; apps/mobile/src/three/scene/fields/farm.js:669Forest aerial color mixes up to 0.52 over view distances 24-145 m; Farm fog starts 24 and is complete at 88. These hide contrast, not replace assets.behavior: Disabling haze/fog changes art direction; no high-res asset selection cost to calculate.Forest tree wash reduced from 52% to 22%. Farm keeps approved pastel haze; it covers full-detail hills and foliage.
apps/mobile/src/ui/table/scene/farView.ts:4; apps/mobile/src/ui/table/scene/farView.ts:10; apps/mobile/src/ui/table/scene/farView.ts:63; apps/mobile/src/ui/table/scene/farView.ts:80Camera-frustum/clearing bounds hide existing Forest far-world and creek groups only when they cannot enter the shot. Shown-before-motion and until-settled handling keeps switches offscreen. This is safe visibility culling, not LOD, lower-detail geometry, billboards, or texture reduction.base comment estimate: About 450,000 triangles and 10 draws are skipped in covered shots at base. This is a source-comment estimate, not a new measurement; revised forest worker cost differs. Disabling would spend those draws while still offscreen.Deliberately untouched. Keep #103 culling in both modes. Farm setFarVisible is a no-op.
apps/mobile/src/three/quality.ts:38; apps/mobile/src/three/quality.ts:39; apps/mobile/src/three/quality.ts:40; apps/mobile/src/three/fx/kit.js:83; apps/mobile/src/three/platform/webHost.ts:12; apps/mobile/src/three/platform/nativeHost.ts:22Original low/mid/high particles are 0.25/0.6/1; low disables MSAA, mid/high enable it. Web MSAA only applies at context construction; native target sample count changes with loaded settings.formula: Full particles can be 4x low counts; native MSAA 4 adds per-sample color/depth storage and resolves, not necessarily 4x frame time.Preserved. Field full mode does not rewrite these settings, so a low-tier full field can retain no MSAA and reduced FX particles.
apps/mobile/src/three/platform/faces-runtime.js:11; apps/mobile/src/three/platform/faces-runtime.js:24; apps/mobile/src/three/platform/faces-runtime.js:27Actor face sheets always choose FACE_SCALE 0.5, independent of quality tier, based on the documented board-camera source-size decision.formula: Switching to authored full sheets would be 4x texels before mipmaps; exact actor sheet bytes outside field scope.Untouched. Mentioned because full field modes must not imply actor sheet resolution changes.
Integration and deliberate exclusions

Full clearing tree geometry, understory, stone, maps and material finishes continue into the back. Spatial batches cull only offscreen instances. Forest terrain, cloud and sky tessellation increased. Farm hedges, fruit trees and hill clumps use full prototypes, hills use 96x32 segments, distant standing wheat uses the near sheaf. Fields map is 6144px, outer soil uses clearing grass. Farm light atlas rebaked, exact layout guard 66180278, all non-atlas GLB bytes unchanged. Full mode uses device DPR; balanced defaults to forest phone DPR 1.5 and full farm phone DPR with all full assets and counts. Desktop/tablet use device DPR in both. Actor/FX tiers remain independent. Native receives full painted maps, keeps its existing scheduler/DPR controller and direct reduced-density policy. No source art or PROP_NAMES GLB changes. Prior worker reports describe their patch stage; final inventory and actual capture records include integration changes. Full-mode stills and full gate are at 1470a654. Final 39e2c0d6 changes only field-specific DPR selection and its Home/table plumbing; full-mode scene geometry, materials and textures are unchanged. Final 31 targeted tests, typecheck and lint pass in the clean Dell checkout. No extra full gate was run. Live picker smoke on M1 passed Forest 1.5 -> Farm 2 -> Forest 1.5 without reload, retaining 1603 far trees and the 6144px Farm map. Tablet 820x1180 uses native 2 pixels per displayed CSS pixel; DPR-3 Farm phone retains 3. No browser/shader errors in 28 After captures or this smoke.

All full-gate phases passed: 476 engine + 2379 server + 986 mobile = 3841 tests, zero failures or skips. Final DPR-only delta: 31 targeted tests, typecheck and lint passed.