b691b5ebaa
tools/perf_bench.py runs Horizon, the vanilla 26.3 client and vanilla with Sodium, Lithium, FerriteCore and ImmediatelyFast through the same steps: fresh world (seed 1234, creative) per render distance, start to title, start to in-world, then per scene teleport, chunk load, settle and a fixed 192-block flight. Every frame time is kept and one function computes average FPS, 1% and 0.1% lows, p50/p95/p99/p99.9 and a frame-time histogram for every game; RSS is sampled from outside the process for every game. One options.txt (vanilla's keys, Fancy preset values with a Custom preset so the render distance holds) is written for all of them. Vanilla is driven by a dev-only Fabric mod (mods/horizon/src/bench) compiled against the user's own client jar: it creates the world with WorldOpenFlows.createFreshLevel, teleports with /tp and places the player on the path every frame as horizon-ctl fly does. Nothing of the game is redistributed and the performance mods are fetched from Modrinth with the hashes pinned in packs/mods.lock.json. Horizon side: `fly ... PITCH raw` also replies with every frame time, and --offscreen drives frames from the event loop, so a window nobody sees (a locked macOS session) still renders. docs/benchmark.md describes what is measured, how fairness is kept, the caveats and how to reproduce it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Horizon documentation
To play, use the launcher; the project site is playhorizon.dev. These pages are for developers.
Build and run
- Build from source: your own copy of the game, resource preparation,
cargo run. - Native client: options, controls, the dedicated server,
horizon-ctlscripting, packaging, architecture. - Graphics: the Simple and Advanced graphics settings, the graphics benchmark and what it measured.
- Benchmark: Horizon against vanilla 26.3 and vanilla with performance mods, on the same machine, world, path and settings: what is measured, how it is kept fair, how to reproduce it.
- Extras: optional zoom, minimap, FPS and keystroke overlays and auto-reconnect, all off by default.
- Launcher: installs, updates and starts builds; its CLI and MCP server; releasing it.
- Opt-in data collection: the consent, exactly what is sent, how it is stored and sent.
- Menus: the title, world list, create world, multiplayer, options and pause screens share the launcher's design tokens and fonts (
crates/horizon-theme), drawn byui_themeover a live frozen backdrop (game/backdrop.rs, blurred and graded bypost.rs). Options → Interface → Menu style switches to vanilla's screens (Classic, kept inhorizon.txt;HORIZON_MENU_STYLE=horizon|classicoverrides it, and scripted runs default to Classic). Title (webm), worlds, options, pause.
Parity
- Rust rewrite status: completion criteria, how to reproduce the validation, and per-area scope.
- Parity workflow:
tools/parity.py, the gate, other machines, merging. - Area notes: block behaviours and ticking, section meshing.
- Decompilation and research lab and decompilation status: the local game inspection workspace the harnesses build on.
Architecture: world generation
- World generation: the pipeline from noise to features.
- Noise generation, compiled density functions, structure density, terrain filling.
- Biomes: lookup, temperatures.
- Surfaces: material surfaces, material conditions, rule libraries, vertical anchors, value providers.
- Carving, heightmaps, feature placement.
Architecture: world data and simulation
- World data: chunk storage, palettes, region files.
- Block-state codecs, scheduled ticks.
- Collision geometry: shapes, collision, movement and fluids.
- Face visibility: which model faces the mesher emits.