Files
horizon/docs/windows-allocators.md
T
Сидоренко Егор АлекчеевичandCodex ca27b2de97 Merge main and preserve the upstream mimalloc allocator
Resolve the allocator and lockfile conflicts against 8f376a471. Keep
main's horizon_threads allocator, startup configuration, and dependency
settings unchanged. Retain windows-mimalloc as a compatibility no-op and
keep the independent, opt-in Segment Heap resource experiment.

Co-Authored-By: Codex (GPT-6) <[email protected]>
2026-10-30 19:50:35 +03:00

3.7 KiB

Windows allocator experiments

The normal client already uses mimalloc through horizon_threads::Allocator, including its startup configuration and memory-release behavior. It does not request Windows Segment Heap. An off-by-default Cargo feature allows a separate experiment with the Win32 heap used by native libraries:

Feature Effect on Windows
windows-segment-heap Embeds a manifest requesting Segment Heap for Win32 heap APIs in this package's executables.
windows-mimalloc Compatibility no-op for earlier experiment commands; the client already uses mimalloc without this feature.

Neither feature changes non-Windows builds relative to the current main branch. Segment Heap is a build option, not a mod or runtime setting; changing it requires rebuilding and restarting the client. It does not replace or reconfigure the Rust allocator. Native libraries can still use Windows heap APIs even though Rust uses mimalloc. No frame-rate improvement is guaranteed.

# Current mimalloc baseline, then add Segment Heap. Keep the same profile.
cargo build --profile fast -p horizon-client --bin horizon-client
cargo build --profile fast -p horizon-client --bin horizon-client --features windows-segment-heap
# Older commands still build, but these repeat the two variants above.
cargo build --profile fast -p horizon-client --bin horizon-client --features windows-mimalloc
cargo build --profile fast -p horizon-client --bin horizon-client --features windows-segment-heap,windows-mimalloc

Copy each executable to a separate experiment directory before building the next variant, or use a separate CARGO_TARGET_DIR. Keep prepared resources and worlds outside version control. Use disposable copies of a world and isolated data directories for tests, following AGENTS.md.

Segment Heap is supported starting with Windows 10 version 2004 (build 19041), according to Microsoft's application manifest documentation. The manifest leaves the optional architecture unspecified and keeps the usual asInvoker execution level. The existing icon and version resources are compiled together with it through the existing Windows-host resource build step. Cross-compiling that manifest from a non-Windows host is not supported by this build step. Builds on earlier Windows versions have not been tested.

Validate the executable

On Windows, extract the manifest from a built executable using the Windows SDK's mt.exe (PowerShell syntax):

mt.exe '-inputresource:target/fast/horizon-client.exe;#1' '-out:client.manifest'
mt.exe -manifest client.manifest -validate_manifest

Check that the feature build contains SegmentHeap in the http://schemas.microsoft.com/SMI/2020/WindowsSettings namespace. The baseline must not contain this element. Confirm Explorer still shows Horizon's icon for both builds. Inspecting the final executable matters: a valid source XML file alone does not prove that the linker embedded it.

Measure separately

Use the same commit, compiler, profile, settings, driver configuration, world copy, warm-up period and flight route for both variants. Alternate their order across repeated sessions. Capture individual frame times, their p99 and maximum, memory use and average FPS. Record game FPS limits, the display refresh rate and driver-level VSync: a driver override can cap FPS even when game VSync is disabled.

Compare the current mimalloc baseline with that same build plus Segment Heap. The compatibility feature cannot measure system allocation versus mimalloc. Results from older system-allocator builds, or builds that also change meshing or LOD retirement, cannot establish the benefit of Segment Heap on current main.