Files
OpenFrontIO/src/core/worker/WorkerMessages.ts
T
scamiv 5a8c0b636d Use dirty flags to coalesce tile updates in SAB ring
- Extend SharedTileRing to include a shared dirtyFlags buffer alongside header and data
- Pass shared dirty buffer through WorkerClient/WorkerMessages and initialize views in Worker.worker
- In SAB mode, mark tiles dirty via Atomics.compareExchange before enqueuing to ensure each tile is queued at most once until processed
- On the main thread, clear dirty flags when draining the ring and build packedTileUpdates from distinct tile refs
- Keep non-SAB behaviour unchanged while reducing ring pressure and making overflows reflect true backlog, not duplicate updates
2025-11-26 21:35:21 +01:00

133 lines
3.3 KiB
TypeScript

import {
PlayerActions,
PlayerBorderTiles,
PlayerID,
PlayerProfile,
} from "../game/Game";
import { TileRef } from "../game/GameMap";
import { GameUpdateViewData } from "../game/GameUpdates";
import { ClientID, GameStartInfo, Turn } from "../Schemas";
export type WorkerMessageType =
| "init"
| "initialized"
| "turn"
| "game_update"
| "player_actions"
| "player_actions_result"
| "player_profile"
| "player_profile_result"
| "player_border_tiles"
| "player_border_tiles_result"
| "attack_average_position"
| "attack_average_position_result"
| "transport_ship_spawn"
| "transport_ship_spawn_result";
// Base interface for all messages
interface BaseWorkerMessage {
type: WorkerMessageType;
id?: string;
}
// Messages from main thread to worker
export interface InitMessage extends BaseWorkerMessage {
type: "init";
gameStartInfo: GameStartInfo;
clientID: ClientID;
sharedTileRingHeader?: SharedArrayBuffer;
sharedTileRingData?: SharedArrayBuffer;
sharedStateBuffer?: SharedArrayBuffer;
sharedDirtyBuffer?: SharedArrayBuffer;
}
export interface TurnMessage extends BaseWorkerMessage {
type: "turn";
turn: Turn;
}
// Messages from worker to main thread
export interface InitializedMessage extends BaseWorkerMessage {
type: "initialized";
}
export interface GameUpdateMessage extends BaseWorkerMessage {
type: "game_update";
gameUpdate: GameUpdateViewData;
}
export interface PlayerActionsMessage extends BaseWorkerMessage {
type: "player_actions";
playerID: PlayerID;
x?: number;
y?: number;
}
export interface PlayerActionsResultMessage extends BaseWorkerMessage {
type: "player_actions_result";
result: PlayerActions;
}
export interface PlayerProfileMessage extends BaseWorkerMessage {
type: "player_profile";
playerID: number;
}
export interface PlayerProfileResultMessage extends BaseWorkerMessage {
type: "player_profile_result";
result: PlayerProfile;
}
export interface PlayerBorderTilesMessage extends BaseWorkerMessage {
type: "player_border_tiles";
playerID: PlayerID;
}
export interface PlayerBorderTilesResultMessage extends BaseWorkerMessage {
type: "player_border_tiles_result";
result: PlayerBorderTiles;
}
export interface AttackAveragePositionMessage extends BaseWorkerMessage {
type: "attack_average_position";
playerID: number;
attackID: string;
}
export interface AttackAveragePositionResultMessage extends BaseWorkerMessage {
type: "attack_average_position_result";
x: number | null;
y: number | null;
}
export interface TransportShipSpawnMessage extends BaseWorkerMessage {
type: "transport_ship_spawn";
playerID: PlayerID;
targetTile: TileRef;
}
export interface TransportShipSpawnResultMessage extends BaseWorkerMessage {
type: "transport_ship_spawn_result";
result: TileRef | false;
}
// Union types for type safety
export type MainThreadMessage =
| InitMessage
| TurnMessage
| PlayerActionsMessage
| PlayerProfileMessage
| PlayerBorderTilesMessage
| AttackAveragePositionMessage
| TransportShipSpawnMessage;
// Message send from worker
export type WorkerMessage =
| InitializedMessage
| GameUpdateMessage
| PlayerActionsResultMessage
| PlayerProfileResultMessage
| PlayerBorderTilesResultMessage
| AttackAveragePositionResultMessage
| TransportShipSpawnResultMessage;