From 96c609e675cf18bc15f1352a0db8fd1e36c9854f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 7 Jun 2026 00:02:11 +0000 Subject: [PATCH] Version Packages --- .changeset/large-room-scale.md | 25 ------------------------- CHANGELOG.md | 26 ++++++++++++++++++++++++++ package.json | 2 +- rust/Cargo.toml | 2 +- 4 files changed, 28 insertions(+), 27 deletions(-) delete mode 100644 .changeset/large-room-scale.md diff --git a/.changeset/large-room-scale.md b/.changeset/large-room-scale.md deleted file mode 100644 index 74b9b3b..0000000 --- a/.changeset/large-room-scale.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -"kit": minor ---- - -Large-room scale: the guest SDK now supports rooms of up to 1024 players. - -- **Per-index frame baselines raised 16 → 1024, allocated lazily.** The SDK - used to silently drop `Send` for a roster index ≥ 16; the per-slot baseline - table is now sized for 1024 consumers but each ~45 KiB slot is allocated on - first commit, so guest linear memory tracks the ACTIVE roster, not the cap. - A broadcast (`Identical`) reconciles only allocated slots; a never-sent-to - slot recovers via its first send opening with a keyframe (unconditionally - accepted) — the same path as a roster change. No wire/ABI change. -- **Cross-callback roster cache.** The host re-sends the full member list in - every callback payload, but rosters change only on join/leave/index-shift. - The SDK now skims the member section's raw bytes (new additive - `wire.(*Rd).SkipStr`) and compares them to the previous callback's: on a - match the previously decoded `[]Player` is reused with zero allocation; - only a real roster change re-decodes. This replaces the roster fingerprint - hash (the byte compare is strictly stronger) and removes an O(members) - allocation from EVERY callback — which, under `-gc=leaking`, leaked the - roster at callback rate and OOM'd long-lived large rooms (~100 KB/callback - at 1000 players). Lifetime contract: the slice from `Room.Members()` is - valid for the duration of the callback; copy `Player` values you retain - (long-lived state should be keyed by `AccountID`, as before). diff --git a/CHANGELOG.md b/CHANGELOG.md index ecc53a5..540b39f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,31 @@ # kit +## 2.5.0 + +### Minor Changes + +- ae1e169: Large-room scale: the guest SDK now supports rooms of up to 1024 players. + + - **Per-index frame baselines raised 16 → 1024, allocated lazily.** The SDK + used to silently drop `Send` for a roster index ≥ 16; the per-slot baseline + table is now sized for 1024 consumers but each ~45 KiB slot is allocated on + first commit, so guest linear memory tracks the ACTIVE roster, not the cap. + A broadcast (`Identical`) reconciles only allocated slots; a never-sent-to + slot recovers via its first send opening with a keyframe (unconditionally + accepted) — the same path as a roster change. No wire/ABI change. + - **Cross-callback roster cache.** The host re-sends the full member list in + every callback payload, but rosters change only on join/leave/index-shift. + The SDK now skims the member section's raw bytes (new additive + `wire.(*Rd).SkipStr`) and compares them to the previous callback's: on a + match the previously decoded `[]Player` is reused with zero allocation; + only a real roster change re-decodes. This replaces the roster fingerprint + hash (the byte compare is strictly stronger) and removes an O(members) + allocation from EVERY callback — which, under `-gc=leaking`, leaked the + roster at callback rate and OOM'd long-lived large rooms (~100 KB/callback + at 1000 players). Lifetime contract: the slice from `Room.Members()` is + valid for the duration of the callback; copy `Player` values you retain + (long-lived state should be keyed by `AccountID`, as before). + ## 2.4.0 ### Minor Changes diff --git a/package.json b/package.json index 645acaa..e27954a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kit", - "version": "2.4.0", + "version": "2.5.0", "private": true, "description": "Version management for the shellcade gamekit (Go module + CLI). Versions and changelogs are driven by changesets; binaries by GoReleaser.", "scripts": { diff --git a/rust/Cargo.toml b/rust/Cargo.toml index a65a142..80bc275 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -15,7 +15,7 @@ [package] name = "shellcade-kit" -version = "2.4.0" +version = "2.5.0" edition = "2021" # #[unsafe(no_mangle)] (emitted by shellcade_game! so expansions survive # edition-2024 game crates) stabilized in 1.82.