mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-07-13 19:19:58 +00:00
perf(ui): switch UI layers to wall-time tick intervals (#3025)
## Description: Preparatory change for the upcoming “unbounded worker” work: decouple expensive UI layer updates from game tick frequency by moving UI ticking to wall-clock intervals. This reduces redundant UI work when the simulation runs faster than real time (notably replays / singleplayer at speed > 1) while keeping the UI responsive and predictable. ## Changes: - Add optional `Layer.getTickIntervalMs()` and enforce it in `GameRenderer.tick()` using wall-clock time. - Convert key UI layers from tick-modulus gating to fixed intervals: - `ControlPanel`: 100ms - `GameRightSidebar`: 250ms - `MainRadialMenu`: 500ms - `Leaderboard`, `NameLayer`, `ReplayPanel`, `TeamStats`: 1000ms ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: DISCORD_USERNAME
This commit is contained in:
@@ -305,6 +305,7 @@ export function createRenderer(
|
||||
|
||||
export class GameRenderer {
|
||||
private context: CanvasRenderingContext2D;
|
||||
private layerTickState = new Map<Layer, { lastTickAtMs: number }>();
|
||||
|
||||
constructor(
|
||||
private game: GameView,
|
||||
@@ -416,7 +417,28 @@ export class GameRenderer {
|
||||
}
|
||||
|
||||
tick() {
|
||||
this.layers.forEach((l) => l.tick?.());
|
||||
const nowMs = performance.now();
|
||||
|
||||
for (const layer of this.layers) {
|
||||
if (!layer.tick) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const state = this.layerTickState.get(layer) ?? {
|
||||
lastTickAtMs: -Infinity,
|
||||
};
|
||||
|
||||
const intervalMs = layer.getTickIntervalMs?.() ?? 0;
|
||||
if (intervalMs > 0 && nowMs - state.lastTickAtMs < intervalMs) {
|
||||
this.layerTickState.set(layer, state);
|
||||
continue;
|
||||
}
|
||||
|
||||
state.lastTickAtMs = nowMs;
|
||||
this.layerTickState.set(layer, state);
|
||||
|
||||
layer.tick();
|
||||
}
|
||||
}
|
||||
|
||||
resize(width: number, height: number): void {
|
||||
|
||||
Reference in New Issue
Block a user