Repository navigation
Releases
TpF2 Big Maps 0.5.3
The installer finds the game on any drive, and the pager policy from the September measurements ships
This release overwrites existing plugins/tpf2_bigmap.cfg, including user edits, on installation, upgrade and repair. Close the game before installing. It shares the proxy, the plugin host and the installer's custom actions with TpF2 Multiplayer 0.6.1.14 (vendored from that release); installing either package updates both.
- The installer finds the game in any Steam library, on any drive. The folder page was pre-filled from Steam's registration of the game or from the folder a previous install remembered, and otherwise showed the stock
C:\Program Files (x86)\Steampath; a game in a second library meant browsing by hand. When neither holdsTransportFever2.exe, the installer now reads Steam's own library list (libraryfolders.vdf) and takes the first library that has it. Shared with TpF2 Multiplayer. - Zoomed-in stutter on a big map (
terrain pager 3195 <-> 256 MiBflapping in the host log): the commit-pressure throttle is now sticky, holding until free commit clears the threshold by more than the pager itself gives back, and for at least 30 s. On a machine without a page file the pager's own release cleared the threshold, it re-expanded, and the flag set again, 74 times in one session. - The resident caps are the same size on every machine that can afford them:
terrain_cache_max_mb=0means a quarter of RAM clamped to 4096..8192 MiB (a 4 GiB cap sat under a fresh large map's working set and cost frames in decodes),material_cache_max_mb=0a quarter of that.-1removes a cap. - A working-set floor. The level the stutter feedback drove the resident target to is kept and decays over minutes, instead of the target sawtoothing back to the hot budget every quiet second (1,000-2,000 decodes a second on a 32 GiB machine while the camera rested).
simulate_physical_mb(rig only) makes the policy size itself for a smaller machine; the engine is not constrained.- Releases are built on GitHub Actions and checksummed; the README describes the pagers as shipped.
The pager changes were measured on the developer's machine; if a 32 GB machine behaves differently, the resident target lines in %LOCALAPPDATA%\tpf2mp\data\tpf2mp_host.log say what the policy did.
TpF2 Big Maps 0.5.2
The in-game minimap ships on.
This release overwrites existing plugins/tpf2_bigmap.cfg, including user edits, on installation, upgrade and repair. Close the game before installing. It shares the proxy and plugin host with TpF2 Multiplayer 0.6.1; installing either package updates both.
- Minimap on by default (
minimap=1). 0.5.0 introduced the native-rendered minimap for maps too large for the game's own, with company colours and names when TpF2 Multiplayer is installed, but shipped it off, and every install of the package reset a hand-editedminimap=1back to off. Setminimap=0inplugins/tpf2_bigmap.cfgto remove the map button again.
Everything else is 0.5.1 (the 32 GB machine fix).
SHA-256
860aef591761f9e40940d02c9423624649309e18a27794425ad02dba7e434e33TpF2BigMaps-0.5.2.msi
TpF2 Big Maps 0.5.1
Fixes awful performance on 32 GB machines after a big save loads.
This release overwrites existing plugins/tpf2_bigmap.cfg, including user edits, on installation, upgrade and repair. Close the game before installing. It shares the proxy and plugin host with TpF2 Multiplayer 0.6.1; installing either package updates both.
The terrain and material pagers kept a flat 12 GiB of RAM in reserve, a figure measured on a 94 GiB machine with no page file. On a 32 GiB machine a loaded big save leaves less than that free, so the pagers pinned their resident sets at the minimum (about 1 GiB of terrain tiles), evicted everything else, and the engine faulted the evicted tiles straight back in through a decode each, thousands per second: the game ran, but everything stuttered. The same flat figure also declared the commit charge "tight" for the whole session on a machine with a system-managed page file, which throttled the pagers on top.
- Headroom sized to the machine. The reserve is a seventh of installed RAM, clamped to 2 to 12 GiB: 12 GiB on 94 GiB as before, 4.6 GiB on 32 GiB, 2.3 GiB on 16 GiB. The commit-tight threshold follows the same idea (an eighth, 2 to 10 GiB).
- The pager counts what it holds as its own room. The resident ceiling used to be computed from free RAM alone, so a pager that had filled memory during the load saw little free RAM, shrank to its floor, and then could not grow back. It now budgets from free RAM plus its own resident set, keeping a quarter of that (or the headroom) free.
- Memory pressure shrinks it. When free RAM drops under the headroom the target shrinks by an eighth per second and eviction turns urgent, whatever the decode feedback says. Paging the engine out is worse than any decode.
On a 32 GiB machine with a 207,360-tile save the terrain pager now settles around 9 to 10 GiB resident with 4 to 5 GiB free instead of 1 GiB resident and a decode storm. The new pressure= and free= fields on the resident target log lines show the state; cold restores/s lines at 300 or more mean the working set still does not fit.
Everything else is 0.5.0.
SHA-256
8a509b9687618b11c9c42f8258299c36fa79c3a195f748b5624ebfe2868f7ff1TpF2BigMaps-0.5.1.msi
TpF2 Big Maps 0.5.0
Big saves load without the memory spike, plus an in-game minimap and travel-time settings.
This release overwrites existing plugins/tpf2_bigmap.cfg, including user edits, on installation, upgrade and repair. Close the game before installing. It shares the proxy and plugin host with TpF2 Multiplayer 0.6.1; installing either package updates both.
Measured on a 207,360-tile save on a 94 GiB machine with no page file: the game's private memory peak while loading fell from 34 to 36 GiB down to 8.3 GiB, and the "Out of memory" assert that ended those loads is gone.
- The load-time memory spike is fixed (
alignment_batch_tiles=512). On a save load the engine rebuilt the 1 m height cache for the whole map in one terrain alignment update, holding every intermediate block until the end: 3.3 million result vectors and about 10 million work vectors alive at once on a 207,360-tile save. The update now runs in batches of 512 blocks, computing, publishing and freeing per batch, which is the per-frame behaviour the engine already has in play. The game's own tile set is walked read-only and never modified. Details indocs/alignment-batch.md. - In-game minimap (
minimap=1, off by default). A native-rendered minimap for maps too large for the game's own, with company colours and names when TpF2 Multiplayer is installed. - Travel-time limits (
travel_time_limit_s,cargo_path_time_s, both0= stock). The engine's 20 minute passenger and 100 minute cargo path limits become settings; set them to, say,6000to let people and cargo take routes across a very large map. - Terrain pager tuning, all on by default. Content deduplication of the two engine terrain versions (
terrain_dedup: measured on a real load, 53% of evictions share an already compressed copy); lazy zero tiles (a fresh tile gets its backing on first touch, not at allocation); an eviction rate that adapts to its measured cost and to gameplay frame stalls, with a per-second cap; a steady-state budget that follows the working set instead of snapping to the hot size after a load; a loading reserve that leaves the engine half of free memory (12 GiB floor) and backs off while the system commit charge is tight; and a retry when the system refuses a section at the commit limit instead of a crash. - Groundwork for a terrain sidecar (a save's finished 1 m cache written beside it and served on load) ships inert: nothing writes or reads a sidecar file yet. A compressed small-block pager for the alignment pass (
terrain_blocks) is kept but off; batching superseded it.
The performance and octree options remain experimental. Report problems with %LOCALAPPDATA%\tpf2mp\data\tpf2mp_host.log attached.
SHA-256
a48d8e6e14dd7a6c03268a634a8cd1d47006a845322cf14a326141068baa6417TpF2BigMaps-0.5.0.msi
TpF2 Big Maps 0.4.0
Large maps now use far less memory and load substantially faster.
This release overwrites existing plugins/tpf2_bigmap.cfg, including user edits, on installation, upgrade and repair. Close the game before installing.
Measured on a 256x256-tile (65.5 x 65.5 km) save on a 94 GiB machine: working set fell from about 18 GB to about 10.5 GB, and load time from 73 s to 45 s.
- Lossless terrain-cache compression, format 3. Planar prediction, zigzag residuals and a static per-tile rANS coder with four neighbour contexts replace the previous LZ4 nibble planes: 18.06% of raw down to 6.95%. Every decode is verified against a 64-bit content hash.
- Fixed a silent capacity limit. The pager managed at most 131,072 tile versions; a 256x256 map reached exactly that while both terrain versions existed, and every allocation past it fell back to an uncompressed heap vector. Any map above about 181x181 tiles, and every 320..512-tile preset, was affected. The cap is now 2^20.
- Material-index paging (
material_cache_compress, new, on by default). The renderer keeps one 67,601-byte cell per tile for the whole session: 4.13 GiB on a 256x256 map, now kept compressed at about 20% of raw and restored on access at the same address. - Four engine optimizations, all on by default and all bit-exact against the game's own machine code in offline tests: SSE2 bicubic height refinement (
terrain_refine_fast, 3.4x), SSE2 tile min/max plus a per-row block copy (terrain_minmax_fast), pooled scratch and an SSE2 blend for terrain alignment (terrain_align_fast, 1.57x-4.67x), and trimming unused capacity from tree and scenery instance lists during world creation (instance_shrink). - Cache budgets now scale with installed RAM.
terrain_cache_hot_mb=0andterrain_cache_warm_mb=-1size the resident targets from physical memory (about 546/1365 MiB on 16 GiB, 3276/8192 MiB on 96 GiB) instead of fixed values tuned for one machine. Explicit values still override. The loading allowance is a fraction of free memory and backs off as memory and the system commit limit fill. - Copy-on-write sharing of terrain tiles between the two engine versions (
terrain_cow_share) ships disabled: it was built, measured on a real load and found not to help, because the second version allocates its tiles rather than copying them.
The performance and octree options remain experimental. Multiplayer participants should use matching Big Maps settings.
Generating a very large map is still bounded by the terrain generator, which is not affected by the above: peak is about 2.5 MB per km2 per named generator buffer, so a 16 GiB machine should stay at or below 224x224 tiles (192x192 for the desert generator, which uses more buffers).
Shared loader binaries are unchanged from Multiplayer v0.5.0.
Bigmap 0.4.0 Linux dev.3 — Terrain memory and performance
Native Linux build for Steam Transport Fever 2 build 35924.
New in Linux dev.3
- Experimental lossless terrain RAM compression, using the shared Windows terrain codec and a native Linux userfaultfd backend. Opt-in:
terrain_cache_compress=1,terrain_cache_hot_mb=1024in the installed[tpf2_bigmap]config, then restart. - Faster saves: zstd level 1 and a 64 KiB stream buffer. Enabled by default (
save_fast=1); files may be larger, with the same save format. - Exact SSE2 terrain min/max scan, enabled by default (
terrain_minmax_fast=1). Terrain resolution and samples are unchanged.
One 128x128-tile test save settled at 4.98 GiB RSS versus 7.78 GiB in dev.2. Loading peaks remained about 9.8 GiB. This single-run comparison is not a frame-rate benchmark or a guarantee for other worlds.
Install / upgrade
Extract the tarball and run bash install.sh without sudo. Keep existing multiplayer launch options if multiplayer is installed; otherwise use the launch line printed by the installer. Existing configs are preserved, and new defaults are written to .cfg.example. Memory compression is off by default, including upgrades. See the bundled INSTALL.md for configuration and requirements.
Validation and scope
All four automated test suites and the installer/upgrade/uninstall checks pass. All twenty native patch sites match the supported ELF. Live checks covered loading, rendering, simulation, joined-track construction, saving and reloading with compression enabled. A fresh process also reloaded that save with all three new optimizations disabled.
Compression needs user-mode userfaultfd with missing-page/write-protection support. If unavailable, it logs that fact and leaves compression off. This backend does not support kernel-origin faults to evicted terrain pages; other drivers/mods and long sessions need further testing. No kernel settings are changed. Multiplayer synchronization was not tested for these additions.
Material compression, terrain copy sharing, generation-buffer reuse, the remaining Windows renderer optimizations and depth 12/13 are still unported. Large-map and sparse-density features from Linux dev.2 are retained. See PORT.md for implementation evidence and measurement limits.
Bigmap 0.4.0 Linux dev.2 — Sparse density presets
Native Linux sparse-density controls
Adds the six Windows sparse presets to Towns, Industries, and Industry density target: Reduced (x0.50), Sparse (x0.30), Megalomaniac count at 56 km (x0.18), Minimal (x0.10), and the 112 km (x0.046) / 160 km (x0.022) presets. Multipliers are relative to Medium; stock density settings are unchanged.
Upgrade
Close the game, extract the archive and run bash install.sh. Restart, then scroll below Very high in the density dropdowns. Existing configs are preserved; newgame_density defaults to enabled even in older configs. Existing multiplayer launch options still work.
The plugin now patches res/config/base_mod.lua, preserving base_mod.lua.bigmap-linux.bak. The uninstaller restores an unchanged patch and refuses to discard subsequent manual edits. Keep the plugin/density support enabled when loading saves made with the new industry presets. Changing density does not remove existing towns or industries.
Tested
- Native town stub execution for every new index, exact executable/patch checks, Lua syntax, patch/backup restoration and installer coexistence tests pass.
- Same small map/seed: Medium previewed 4 towns and 32 industries; Minimal previewed 2 towns and 5 industries (generator minimums apply).
- A 128×128-tile Minimal map previewed 6 towns and 52 industries, generated, saved, reloaded and continued running. Logs verified industry start/target multipliers of 0.06 (10% of Medium's 0.6) before and after reload.
Experimental, Steam Linux build 35924. Long-term industry spawning and two-peer synchronization were not tested. Windows RAM paging, depth-12/13 maps and optional engine speedups remain unported.
Source: c735dad on linux-native.
Bigmap 0.4.0 — Native Linux experimental 1
Native Linux big maps — experimental
Native x86-64 plugin for Steam Transport Fever 2 Linux build 35924. Source: linux-native, commit bb952b7; based on Windows bigmap 0.4.0.
Install
Download and extract tpf2-bigmap-0.4.0-linux-dev.1.tar.gz, then run bash install.sh without sudo. Use the Steam launch options it prints. Existing native multiplayer users can keep their current launch options. The package includes the shared native plugin host and does not require multiplayer.
Included
- Nine added map-size rows, up to 510×510 tiles (130.56 km square), with rectangular edges up to 512 tiles.
- Ratios through 1:20 and configurable explicit dimensions.
- Depth-11 spatial index and adaptive street raster sizing.
- Exact executable/patch checks, config-preserving installer and uninstaller, Snap Steam detection.
Validation
Built with Valve soldier SDK; unit tests, all ten Linux patch sites and installer/coexistence checks pass. In the native game, a 40×400-tile world (10.24×102.4 km) generated, entered gameplay, saved, reloaded and continued simulating. This is a smoke test, not a maximum-size stress test or two-peer multiplayer synchronization test.
Remaining Windows-only features
Terrain/material RAM paging, depth-12/13 maps, density extensions and optional generation/renderer/save-speed optimizations are not included. Use the supplied Linux configuration; Windows depth-13 configs are rejected. Large maps retain substantial RAM requirements.
See the bundled INSTALL.md and PORT.md for configuration, source provenance and compatibility limits.
TpF2 Big Maps 0.3.1
Restores the tuned large-map and performance settings in the Big Maps installer.
This release overwrites existing plugins/tpf2_bigmap.cfg, including user edits, on installation, upgrade and repair. This deliberately replaces the older restrictive configuration. Close the game before installing.
- Enable actual octree depth 13 with the original 128 m leaves and a 2,048-tile edge cap (up to 524.288 km, subject to the heightmap area limit).
- Restore 50 placement attempts per batch instead of 200, the material-index loading optimization, faster saves and world-entry diagnostics.
- Enable lossless terrain-cache compression at 1 m spacing. The discontinued 2 m cache is not enabled.
- Retain the 1:20 maximum ratio and 1,024/4,096 MiB hot/warm cache budgets.
- Update the shared loader binaries to the exact files shipped with Multiplayer 0.5.0.
The depth and performance options remain experimental. Multiplayer participants should use matching Big Maps settings.
Validation: actual isolated MSI upgrade and repair tests replaced edited configs successfully. Administrative extraction matched the corrected config. Octree-depth, ratio, lossless compression and fast-save regression tests passed.
TpF2 Big Maps v0.3.0
TpF2 Big Maps 0.3.0
Download and run TpF2BigMaps.msi with Transport Fever 2 closed. Steam build
35924 is supported. Existing plugins/tpf2_bigmap.cfg settings survive upgrades.
Changes
- New Game aspect ratios through 1:20 (
max_ratio=20). - Experimental actual octree depths 12 and 13, keeping 128 m leaves. Depth 13
supports a spatial root covering edges up to 2,048 tiles / 524.288 km; practical
generation limits and RAM requirements still apply. - Fix placement-distance overflow on large maps, plus configurable placement
attempts (placement_attempts=50for the faster option, stock default 200). - Optional lossless 1 m terrain cache compression, with improved tile encoding,
reuse of unchanged compressed tiles, and shared compressed copies. - A temporary larger cache allowance during generation and late loading.
- Optional faster autosave/manual-save compression and material-index processing.
- World-entry phase diagnostics, including town/industry road connection timing.
Road routing itself is unchanged.
Enabling optional features
Edit the existing [tpf2_bigmap] section in plugins/tpf2_bigmap.cfg and restart:
# Lossless terrain compression; retain stock 1 m samples
terrain_cache_spacing_m=1
terrain_cache_compress=1
terrain_cache_hot_mb=1024
terrain_cache_warm_mb=4096
# Optional performance changes
save_fast=1
material_index_fast=1
placement_attempts=50
# Extended ratios and optional diagnostics
max_ratio=20
world_entry_timings=1These performance options are opt-in; the MSI retains conservative defaults.
Fewer placement attempts can change placement quality or accepted site counts.
Faster saves retain the format but may produce larger files.
For depth 13, also use octree=1, octree_depth=13, max_tiles=2048, and
configure larger size entries as described in the depth documentation.
Keep matching depth settings when reloading those worlds.
Do not enable the discontinued 2 m terrain cache. It caused visible terrain
fragmentation and construction crashes. Use 1 m with the lossless cache option.
Standalone Big Maps uses a three-minute late-loading cache tail. A fresh-gameplay
UI signal is supported when a compatible future multiplayer menu DLL is present;
that development menu DLL is not included in this installer. The latest cache-tail
policy and road timer have regression coverage but still need live-game validation.
The separate Lua generation-memory helper remains a source/tool option and is
not installed by this MSI.
Validation and packaging
Ten regression scripts passed: ratios, octree, placement distances, material
indexing, saving, terrain cache, terrain compression, warm-up policy, world entry,
and the generation-memory helper. The MSI was administratively extracted and its
plugin, configuration, proxy, and host hashes matched the intended payloads.
Installer coexistence transactions were not rerun for this release.
Earlier lossless-cache gameplay checks included world loading, two connected rail
builds, and save/reload. Terrain backing settled near 2.55 GiB on the tested
114 x 570-tile world; this is not a promise of total process RAM on other maps.
Shared proxy, host, and installer custom-action binaries are unchanged from the
published TpF2 Multiplayer v0.4.19 MSI. See installer/vendor/VENDORED.md for hashes.