At render distance 32 the single section arena grew past the 4 GiB buffer
limit and the renderer panicked. Sections now live in pages of at most
256 MiB (or the device's buffer limit); draws keep their order and bind each
page once per run of consecutive draws in it, so translucent sections stay
back to front. docs/graphics.md describes the settings, the benchmark and
what changed; graphics_bench.py --compare prints a before/after table and
keeps each game's log.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Unloaded chunks and entity chunks are encoded and written by a background
region writer, in order; loads see queued records first, and synchronous
saves wait for the queue. Deleting entity chunks a region doesn't hold no
longer rewrites the region file.
- Mobs render within Entity.shouldRenderAtSqrDistance (64 x bounding-box size
x entity distance) and inside the view frustum (EntityRenderer.shouldRender);
block entities outside the frustum are skipped, beams and structure blocks
excepted.
- Minecarts and dropped items tick only in entity-ticking chunks, like mobs.
- Villager POI searches skip sections whose palette has no POI block.
- Streaming bookkeeping uses the Fx hash and checks a column's light
readiness once per frame instead of once per dirty section.
- HORIZON_SPIKES=MS prints the timed spans of slow frames; frame summaries
give the phase split of the slowest 1%.
RD 32 village flight on the 4080: 81 -> 230 fps; 1% low 5.8 -> 18.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Terrain sections live in one vertex arena (first-fit free list, grown on the
GPU) and draw with one multi_draw_indexed_indirect per pass instead of a
buffer bind and draw per section; per-frame scratch vectors are reused.
- The SectionOcclusionGraph search runs over dense arrays around the camera
instead of hash sets, with per-column visibility.
- Mobs outside the entity-ticking chunks (Chebyshev distance of the
simulation distance, DistanceManager.inEntityTickingRange) only check
despawning, as in ServerLevel.tick; before, every loaded mob ticked.
- World chunks use the Fx hash; sky darkening is sampled once per time and
weather instead of once per mob; creaking-heart scans compare state ids.
- Horizon-only graphics settings (horizon-graphics.txt): frame pacing without
spinning, present mode, animated textures, worker threads.
RD 32 village flight on the 4080: 3.1 -> 81 fps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
horizon-ctl gains 'fly' (a constant-speed camera path that replies with the
frame summary); frame summaries add CPU time per frame (waits for the GPU,
display and limiter excluded), per-phase averages and GPU time from timestamp
queries. --offscreen renders into a texture on the discrete GPU so the 4080
can be measured under the headless compositor. Baselines: lavapipe on vscreen
and the RTX 4080 offscreen, seed 1234.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>