Skip to content

v1.23.0

Choose a tag to compare

@github-actions github-actions released this 10 Nov 18:41
· 56 commits to main since this release

Drift checks get cheap for large scopes: a drift-check tick with 5,000 entities and 16 audiences went from about a second to a few milliseconds on the server. Hashes are unchanged. RecursiveAI.OneGame.Physics ships as 1.23.0-preview.1.

Added

  • driftCheckInterval: in the server configuration (ServerConfig.DriftCheckInterval, default 30, 1 to 10,000 ticks), ServerHost.DriftCheckInterval (code wins over the file; set before Start), Node.DriftCheckInterval, and driftCheckInterval in server_info. A longer interval costs the server and every client less per tick and finds drift later. It cannot be 0 on a server; out-of-range values are errors. hashHistory, hash_at and cluster hash comparisons do not depend on it.
  • Entity.StateVersion and SyncList.Version: counters that change whenever an entity's synced state (or a list) changes, so caches can be keyed on them.

Changed

  • Drift-check ticks no longer re-serialize and re-hash every entity for every audience: each entity caches its full and per-visibility-mask hashes, invalidated by any change (Entity.StateVersion, SyncList.Version), and the digest folds the world hash in the same pass. Hashes, recordings and the wire are unchanged. A check tick with 5,000 idle 4.8 KB entities and 16 audiences went from about 1,000 ms to about 3 ms on the authority and from about 33 ms to about 0.5 ms on a replica.

Fixed

  • 1.22.0: Connection.Channel returned an internal send-pacing wrapper instead of the transport for UDP connections, so code that read the client's proven key through connection.Channel is IAuthenticatedChannel or closed the client through connection.Channel is INetConnection silently failed: such a server trusted no one, and clients joined but never received entities. Connection.Channel is the transport again, as before 1.22; pacing is kept internally.