Skip to content

Pulse v0.2.0-indev.2

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Sep 12:55
· 345 commits to main since this release
51b8f55

This prerelease answers the question every busy server eventually asks: which mod is eating the tick.

Turn on the new Attribution block in ModConfig/pulse.json and Pulse drives the engine's own frame profiler in short bursts (30 ticks every 10 seconds by default), reads the marks it stamps on every tick listener, delayed callback and main-thread entity behavior, and maps each one back to the mod that registered it. Three new families come out of it, plus a meta counter:

  • pulse_mod_tick_share{modid}: each mod's fraction of the profiled busy time over the last burst. The shares sum to 1, so they read straight off a dashboard.
  • pulse_mod_tick_seconds_total{modid}: profiled seconds attributed per mod, cumulative. Sampled during bursts, so treat it as a ratio source, not a wall-clock total.
  • pulse_attribution_ticks_total: how many ticks were actually profiled, for normalising.
  • pulse_attribution_dropped_samples_total: marks discarded because their elapsed time overflowed an engine-side 32 bit counter.

Off by default, and priced before shipping: a burst costs a few percent of the tick budget while it runs (scaling with loaded entities), which the default duty cycle amortises to roughly 0.3%. The engine's profiler has a genuine crash trap when enabled mid-tick on a cold server; Pulse primes it before the tick loop exists and refuses to start a burst until the profiler has proven itself warm, so the trap is structurally unreachable. Blind spots are documented in the README: broadcast events (PlayerJoin and friends) carry no marks at all, and threaded physics is attributed for its main-thread slice only.

Everything lands in the base pulse zip, still a single dll with no dependencies. The OTLP companion is unchanged and pushes the new families like any others.

Same game support: Vintage Story 1.22.x, dedicated server, .NET 10. Test bar for this tag: 183 tests including 26 embedded-server scenarios (one boots a server, runs a burst and checks the shares sum to 1), 38 mutations killed, quality gate green.