Skip to content

v0.23.1

Choose a tag to compare

@dmitry-lebedev dmitry-lebedev released this 23 May 07:26
· 82 commits to main since this release
51ad94a

Allocation-pressure overhaul on the server hot path + ushort MethodId-only wire (service/method/version strings removed end-to-end) + refreshed compatibility negotiation. Wire-breaking on both axes: byte[]? → ReadOnlyMemory<byte> and the method-addressing string triple gone.

Highlights:

  • Pool-backed broadcast payloads — PooledPayload + PooledPayloadRegistry (silo-scoped, ref-counted). DI-driven PooledPayloadOptions (default OFF). Cluster-singleton coordinator grain assigns unique SiloId per silo.
  • GrainScopedSerializer — per-grain scratch buffer; IMetaSerializer.Pack<T>(T) returns ReadOnlyMemory<byte> over pool-rented memory. Primitive-return cache (DispatchResult.True/False/Int/Void) skips serialization entirely.
  • ushort MethodId dispatch — flat switch (methodId) jump table replaces nested string/version switches. GameMethodIds const table per assembly. Force-patch refcounts indexed by MethodId (~200 B vs ~6 KB per entity at 100 methods).
  • Compatibility negotiation — MetaClientOptions.ClientSignature, MetaTransportOptions.RequireClientSignature, two-phase handshake. MetaConnectionHandler rejects un-negotiated clients on RPC/Query/Signal.
  • Fixes — cross-entity broadcast filter on outer-caller's client; CrossOptimistic broadcast race with third-party mutators; SessionManager pool-ref leak paths on transport drop; cluster-wide signature dedup under stress; Newtonsoft RomByteJsonConverter on Unity HTTP polling.

References: