Skip to content

v0.3.2

Choose a tag to compare

@Zaldaryon Zaldaryon released this 31 Jul 21:35
· 3 commits to main since this release
v0.3.2
2292954

Fixes

  • Prospecting pick node search silently did nothing. Node Search Mode never printed "no ore nearby" or any quantity result (Density Search Mode still worked). Two fields added for the node-search optimization had no initializer run under the runtime patcher, so the first lookup threw before any chat message could be sent. Fixed by lazily initializing on first use.
  • Animation lookups allocated a string every frame. AnimatorBase.animsByCode used the default ordinal comparer in the shipped API assembly, so every animated entity's animation-state lookup lowercased its animation code on every call. The source-tree fix existed but had no Cecil target and never reached players; it now ships via a dedicated API patch.
  • A missing Cecil type target could fall an install back to vanilla. Optimum.OptimumOptiTimeGuard was absent from the engine's type-injection list, so any install exercising GetMigrationMessage() failed self-consistency verification.
  • The version string stuck at 0.3.0/0.3.1 across releases.

Performance (opt-in, default off)

Dressed NPCs (traders, villagers) re-tesselating their shape and gear could cost 50-230ms in a single frame, most visible when several load in at once (a caravan arriving, entering a village). Four settings target this, configurable only via ModConfig/optimum.json for now:

  • EntityTesselationFrameBudget: caps how many dressed-entity re-tesselations run per frame, spreading the rest across following frames.
  • EntityOutfitShapeCache: reuses the fully assembled gear shape and resolved textures for outfit combinations already built once.
  • EntityOutfitAnimatorCache: reuses the built animator (pose graph) across entities sharing an outfit combination instead of rebuilding it every re-tesselation - the largest remaining cost in this path.
  • EntityOutfitTexturePrewarm: inserts every outfit variant's textures into the atlas during the loading screen instead of on first encounter mid-gameplay.

Measured via .optimum stutterwatch, together these reduced per-call cost from 58-230ms down to 7-9ms in real gameplay testing.

Diagnostics

  • New .optimum stutterwatch <ms> command attributes per-frame cost to Optimum's own subsystems, complementing vanilla's .debug logticks.

Notes

  • Targets Vintage Story 1.22.5.
  • Source-only release. See the wiki for install instructions.