Changelog
1.0.3
- Removed routed-RPC RTT from the live latency display and telemetry.
- Server now samples Valheim/Steam transport ping directly from every connected player socket.
- F8 overlay shows Steam transport ping for all players, including players without the TickProfiler client overlay installed.
- Network/status JSON identifies these values as
steam-transport.
1.0.2
- Client overlay now uses Valheim/Steam's native socket transport ping for the local player's displayed ping.
- Routed RPC round-trip timings are explicitly labelled as RPC/game-message latency rather than network ping.
- Removes the misleading 33/66 ms quantisation caused by Valheim update/RPC scheduling on low-latency LAN connections.
1.0.1
- Replaced Valheim
GetServerPing() display with TickProfiler-owned request/reply RTT measurement.
- Added live per-player RTT to the client overlay.
- Added
tickprofiler-network.json and per-player RTT to status JSON for dashboards.
- Added configurable
PlayerPingIntervalSeconds with a 1 second default.
1.0.0
- Major TickProfiler redesign validated against Valheim 1.0.14.
- Fixed report-boundary deadline accounting so stalls cannot move missed FixedUpdate deadlines into the following clean report or be counted twice.
- Added background/serialized file output for status, text and forensic captures; the main thread no longer performs periodic disk writes.
- Reduced
tickprofiler.request filesystem polling from every frame to a configurable low-rate poll.
- Added startup warmup and measurement-baseline reset so world/scene startup does not pollute runtime hitch, CPU or GC statistics.
- Added exception-safe plugin-loop profiling plus root-loop recovery; recovery count is exposed in self-health output.
- Added real RSS/private memory alongside managed heap memory.
- Added profiler self-overhead, timed calls/sec and output queue depth.
- Added runtime context: player count, ZDO count, active objects, loaded/generated zones, threads and VM network throughput.
- Added cumulative hitch severity buckets.
- Added confidence-labelled hitch attribution and stopped treating coincident GC as automatically causal.
- Added Harmony patch-owner context without attributing blame to patch owners.
- Added configurable 1-in-N sampling for deep/high-frequency game methods.
- Added protocol v2/version negotiation while retaining legacy v1 compatibility paths.
- Added exact hitch-event RPC markers for the client history graph.
- Added independent lightweight overlay refresh and cached client display text to reduce allocations.
- Renamed
ProfileModHarmonyMethods to ProfilePluginLoops; the old key is retained for config migration.
- Added asynchronous hitch forensic JSON captures with preceding performance/runtime samples.
- Added dependency-free regression tests for tick deadlines, catch-up behavior, pending report-boundary misses, JSON escaping, hitch buckets and stat resets.
- Burn-tested on the spare Valheim 1.0.14 server using controlled 100/250/500/1000 ms stalls, sustained 8 ms/frame load, sustained 45 ms/frame overload, and an intentional plugin exception.
0.4.4
- Fixed effective server tick rate so missed real-time FixedUpdate deadlines are counted from actual wall-clock FixedUpdate gaps rather than inferred from the 30 Hz Update loop.
- Normal Unity 50 Hz physics batching on a ~30 Hz dedicated-server player loop is not penalised, while genuine 40/60/100 ms FixedUpdate gaps permanently record 1/2/4 missed deadlines.
- Effective tick rate is now capped by actual FixedUpdate throughput, so it can never report 50 Hz when fewer successful FixedUpdates ran.
- Unity catch-up bursts remain visible as raw throughput but cannot restore missed deadlines in the headline tick rate.
0.4.3
- Critical compatibility fix: TickProfiler no longer Harmony-patches other mods' Prefix/Postfix/Finalizer methods.
- Prevents early JIT/static-initializer side effects seen with Valheim Plus
FurnaceDefinitions and similar mods.
- Plugin attribution remains enabled for safe BepInEx
Update, FixedUpdate, and LateUpdate loops.
- Main-thread/frame stall detection, server profiling, hitch chat alerts, and 5-minute graphs are unchanged.
0.4.2
- Simplified BepInEx logger name to
TickProfiler.
- Made periodic console reports a single multiline block.
- Added timestamped separators so consecutive profiles are easy to distinguish.
- Compact, aligned top-consumer table for AMP/mobile console readability.
0.4.1
- Significant hitches are broadcast through the TickProfiler client mod into normal Valheim chat for every connected TickProfiler client.
- Added
AnnounceHitchesInChat and HitchChatTitle; chat broadcast defaults on with sender Server.
- Top-left HUD hitch messages are independently configurable and default off to avoid duplicate alerts.
0.4.0
- Replaced raw FixedUpdate catch-up throughput as the primary tick metric with effective tick rate based on real-time deadlines missed during main-thread stalls. Unity catch-up FixedUpdates no longer restore the displayed tick rate.
- Added per-hitch event attribution. Long-running game/mod methods are correlated with the exact hitch window and reported by plugin, type and method when they credibly explain the stall.
- Added configurable in-game server hitch notices (
AnnounceHitchesInGame, AnnounceHitchThresholdMs, AnnounceHitchCooldownSeconds) including duration and detected cause.
- Added
Game.CollectResources profiling to improve attribution of periodic Unity resource cleanup.
- Added client-side plugin method attribution for BepInEx Update/FixedUpdate/LateUpdate and Harmony patch methods.
- Added rolling 5-minute client graphs: local client FPS/hitch history and server effective tick-rate/hitch history.
0.3.0
- Reworked stall detection around wall-clock main-thread gaps so Unity catch-up FixedUpdate bursts can no longer hide freezes behind an apparent 50 Hz average.
- Added server main-thread stall count, worst gap, excess lost time, p99 update gap and explicit unattributed native/Unity/I/O/GC reporting.
- Added direct save-path timing for
ZDOExtraData.PrepareSave and ZNet.SaveWorldAndPlayerProfiles.
- Added real client-side profiling: frame gaps, p95/p99, local main-thread stalls, lost time, process CPU, managed memory and GC counts.
- Client F8 overlay now shows local client health above the server profiler data.
0.2.4
- Fixed the client overlay on Valheim 1.0.12 by invoking non-public
ZRoutedRpc.GetServerPeerID() through runtime reflection.
- Eliminates repeated
MethodAccessException spam and allows the client hello/snapshot exchange to proceed.
0.2.3
- Reworked periodic server console output into a short health/stall summary plus a top-5 consumer table.
- Detailed text and JSON snapshots remain unchanged.
0.2.2
- Fixed the client overlay losing its snapshot RPC handler when Valheim replaces
ZRoutedRpc during the frontend-to-world transition.
- The client now detects each new routed-RPC instance, re-registers the snapshot handler, and immediately re-announces itself to the server.
0.2.1
- Fixed the client overlay toggle on Valheim 1.0.12 by using Valheim's
ZInput path instead of legacy UnityEngine.Input.
- Added explicit client RPC registration and first-snapshot diagnostics.
- Added server logging when an overlay client registers.
0.2.0
- Added an optional client-side overlay, toggled with F8 by default.
- Added server-to-client RPC snapshots for current Update/FixedUpdate rates, stalls, CPU/GC data and top consumers.
- Client component is read-only and performs no profiling.
- Server only sends profiler data to clients that have the overlay installed.
- Kept the dedicated server profiler and client UI as separate DLLs so IMGUI is never loaded by the server plugin.
0.1.0
- Initial release.
- Reports server Update and FixedUpdate rates.
- Detects frame/tick stalls and gap percentiles.
- Profiles Valheim networking, ZDO replication, AI, spawning, item drops, structures, world systems and supported Harmony mod patches.
- Writes periodic log output plus JSON and text snapshots.
- Supports on-demand snapshots using
BepInEx/tickprofiler.request.