Commit Graph

10 Commits

Author SHA1 Message Date
MDietermann
225c6f7253 feat(streaming): load full column bedrock->surface to fix terrain holes 2026-06-03 08:01:38 +02:00
MDietermann
9c28bf152f perf(streaming): cache per-column surface heights to fix move lag spikes
RecomputeTargetSet sampled TerrainSampler.HeightAt (a 169-point biome
blend kernel) 5x per column over the whole render distance on the main
thread every chunk crossing (~1,445 calls = ~250k biome lookups), causing
multi-frame hitches while moving. Memoize each chunk column's (min,max)
surface range, reused across ticks and pruned to the horizontal window, so
each column is sampled once. Exact (no terrain change); spike is amortized
to a thin edge strip per crossing and zero when stationary.
2026-06-01 20:43:31 +02:00
MDietermann
94930faccb feat(rendering): frustum-cull chunk draws and log render counts 2026-06-01 20:14:03 +02:00
MDietermann
43527e617b feat(streaming): load surface shell + player slab instead of vertical box 2026-06-01 18:51:38 +02:00
d1c8c22705 perf: skip renderer for chunks with empty mesh
Pure-air chunks (above terrain) and chunks where every face culls
produce a zero-length mesh from ChunkMesher.Build(). Previously
InstallResult still allocated a real ChunkRenderer (VBO + VAO) and
registered a zero-vertex draw call. With RenderDistanceVertical=2 and
a player at surface Y, the topmost vertical layer is typically all
pure air -- roughly H*H = ~289 wasted renderers per spawn.

The chunk still gets added to _ready so SpawnReady, dirty-marking and
unload bookkeeping continue to work; DrawAll's iteration over the
renderer dictionary naturally skips entries that don't exist.
2026-06-01 13:44:51 +02:00
2c95c7831a feat: weight vertical distance in chunk-load priority
Adds Configuration.VerticalPriorityWeight (default 4). The priority
formula in ChunkStreamer.RecomputeTargetSet now uses
dx^2 + dz^2 + dy^2 * VerticalPriorityWeight, so horizontal chunks at
the player's Y are dispatched before equally-distant chunks above or
below. Fixes janky loading where deep-underground chunks were
competing with surface chunks for early dispatch slots.
2026-06-01 13:41:55 +02:00
85a345d6e7 feat: ChunkStreamer tracks failed chunks to prevent retry storms 2026-06-01 12:04:50 +02:00
da051ed413 feat: ChunkStreamer dirty set with cardinal-neighbor remesh on load 2026-06-01 11:46:33 +02:00
7d06706400 feat: ChunkStreamer unload path and SpawnReady property 2026-06-01 11:35:35 +02:00
c1f0928344 feat: ChunkStreamer load path with target-set, dispatch, and diff application 2026-06-01 11:19:06 +02:00