From 37315e5fa50172cba215a8d11bd6b23907942282 Mon Sep 17 00:00:00 2001 From: scamiv <6170744+scamiv@users.noreply.github.com> Date: Wed, 26 Nov 2025 14:36:11 +0100 Subject: [PATCH] Change the ring buffer to Uint32Array Store only TileRef instead of packed tile+state values --- src/client/ClientGameRunner.ts | 6 +++++- src/core/GameRunner.ts | 7 ++++--- src/core/game/GameView.ts | 2 +- src/core/worker/SharedTileRing.ts | 14 +++++++------- src/core/worker/Worker.worker.ts | 3 ++- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/client/ClientGameRunner.ts b/src/client/ClientGameRunner.ts index 53fe618d0..3beb2dea3 100644 --- a/src/client/ClientGameRunner.ts +++ b/src/client/ClientGameRunner.ts @@ -662,11 +662,15 @@ export class ClientGameRunner { if (this.tileRingViews) { const MAX_TILE_UPDATES_PER_RENDER = 100000; + const tileRefs: TileRef[] = []; drainTileUpdates( this.tileRingViews, MAX_TILE_UPDATES_PER_RENDER, - combinedPackedTileUpdates, + tileRefs, ); + for (const ref of tileRefs) { + combinedPackedTileUpdates.push(BigInt(ref)); + } } else { for (const gu of batch) { gu.packedTileUpdates.forEach((tu) => { diff --git a/src/core/GameRunner.ts b/src/core/GameRunner.ts index d6840e806..552a15a9e 100644 --- a/src/core/GameRunner.ts +++ b/src/core/GameRunner.ts @@ -37,7 +37,7 @@ export async function createGameRunner( clientID: ClientID, mapLoader: GameMapLoader, callBack: (gu: GameUpdateViewData | ErrorUpdate) => void, - tileUpdateSink?: (update: bigint) => void, + tileUpdateSink?: (tile: TileRef) => void, sharedStateBuffer?: SharedArrayBuffer, ): Promise { const config = await getConfig(gameStart.config, null); @@ -105,7 +105,7 @@ export class GameRunner { public game: Game, private execManager: Executor, private callBack: (gu: GameUpdateViewData | ErrorUpdate) => void, - private tileUpdateSink?: (update: bigint) => void, + private tileUpdateSink?: (tile: TileRef) => void, ) {} init() { @@ -186,7 +186,8 @@ export class GameRunner { const tileUpdates = updates[GameUpdateType.Tile]; if (this.tileUpdateSink !== undefined) { for (const u of tileUpdates) { - this.tileUpdateSink(u.update); + const tileRef = Number(u.update >> 16n) as TileRef; + this.tileUpdateSink(tileRef); } packedTileUpdates = new BigUint64Array(); } else { diff --git a/src/core/game/GameView.ts b/src/core/game/GameView.ts index 0f6387299..97bed36f6 100644 --- a/src/core/game/GameView.ts +++ b/src/core/game/GameView.ts @@ -522,7 +522,7 @@ export class GameView implements GameMap { this.updatedTiles = []; if (this.usesSharedTileState) { this.lastUpdate.packedTileUpdates.forEach((tu) => { - const tileRef = Number(tu >> 16n); + const tileRef = Number(tu); this.updatedTiles.push(tileRef); }); } else { diff --git a/src/core/worker/SharedTileRing.ts b/src/core/worker/SharedTileRing.ts index 0d8d0c331..4ddf9403d 100644 --- a/src/core/worker/SharedTileRing.ts +++ b/src/core/worker/SharedTileRing.ts @@ -1,3 +1,5 @@ +import { TileRef } from "../game/GameMap"; + export interface SharedTileRingBuffers { header: SharedArrayBuffer; data: SharedArrayBuffer; @@ -5,7 +7,7 @@ export interface SharedTileRingBuffers { export interface SharedTileRingViews { header: Int32Array; - buffer: BigUint64Array; + buffer: Uint32Array; capacity: number; } @@ -18,9 +20,7 @@ export function createSharedTileRingBuffers( capacity: number, ): SharedTileRingBuffers { const header = new SharedArrayBuffer(3 * Int32Array.BYTES_PER_ELEMENT); - const data = new SharedArrayBuffer( - capacity * BigUint64Array.BYTES_PER_ELEMENT, - ); + const data = new SharedArrayBuffer(capacity * Uint32Array.BYTES_PER_ELEMENT); return { header, data }; } @@ -28,7 +28,7 @@ export function createSharedTileRingViews( buffers: SharedTileRingBuffers, ): SharedTileRingViews { const header = new Int32Array(buffers.header); - const buffer = new BigUint64Array(buffers.data); + const buffer = new Uint32Array(buffers.data); return { header, buffer, @@ -38,7 +38,7 @@ export function createSharedTileRingViews( export function pushTileUpdate( views: SharedTileRingViews, - value: bigint, + value: TileRef, ): void { const { header, buffer, capacity } = views; @@ -60,7 +60,7 @@ export function pushTileUpdate( export function drainTileUpdates( views: SharedTileRingViews, maxItems: number, - out: bigint[], + out: TileRef[], ): void { const { header, buffer, capacity } = views; diff --git a/src/core/worker/Worker.worker.ts b/src/core/worker/Worker.worker.ts index 104ebcab2..586f77e66 100644 --- a/src/core/worker/Worker.worker.ts +++ b/src/core/worker/Worker.worker.ts @@ -1,6 +1,7 @@ import version from "../../../resources/version.txt"; import { createGameRunner, GameRunner } from "../GameRunner"; import { FetchGameMapLoader } from "../game/FetchGameMapLoader"; +import { TileRef } from "../game/GameMap"; import { ErrorUpdate, GameUpdateViewData } from "../game/GameUpdates"; import { createSharedTileRingViews, @@ -83,7 +84,7 @@ ctx.addEventListener("message", async (e: MessageEvent) => { mapLoader, gameUpdate, sharedTileRing - ? (update: bigint) => pushTileUpdate(sharedTileRing!, update) + ? (tile: TileRef) => pushTileUpdate(sharedTileRing!, tile) : undefined, message.sharedStateBuffer, ).then((gr) => {