From 0b0753d5e165c85e1b8129b00304cf9d430b4f81 Mon Sep 17 00:00:00 2001 From: scamiv <6170744+scamiv@users.noreply.github.com> Date: Tue, 25 Nov 2025 18:31:08 +0100 Subject: [PATCH] Refactor rendering and metrics emission in ClientGameRunner to ensure updates occur only after all processing is complete. --- src/client/ClientGameRunner.ts | 42 ++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/client/ClientGameRunner.ts b/src/client/ClientGameRunner.ts index 9e7e626e4..6cc7756e0 100644 --- a/src/client/ClientGameRunner.ts +++ b/src/client/ClientGameRunner.ts @@ -511,33 +511,35 @@ export class ClientGameRunner { this.pendingStart = 0; } - if (batch.length > 0 && lastTick !== undefined) { + // Only update view and render when ALL processing is complete + if ( + this.pendingStart >= this.pendingUpdates.length && + batch.length > 0 && + lastTick !== undefined + ) { const combinedGu = this.mergeGameUpdates(batch); if (combinedGu) { this.gameView.update(combinedGu); } - // Only emit metrics when ALL processing is complete - if (this.pendingStart >= this.pendingUpdates.length) { - const ticksPerRender = - this.lastRenderedTick === 0 - ? lastTick - : lastTick - this.lastRenderedTick; - this.lastRenderedTick = lastTick; + const ticksPerRender = + this.lastRenderedTick === 0 + ? lastTick + : lastTick - this.lastRenderedTick; + this.lastRenderedTick = lastTick; - this.renderer.tick(); - this.eventBus.emit( - new TickMetricsEvent( - lastTickDuration, - this.currentTickDelay, - this.backlogTurns, - ticksPerRender, - ), - ); + this.renderer.tick(); + this.eventBus.emit( + new TickMetricsEvent( + lastTickDuration, + this.currentTickDelay, + this.backlogTurns, + ticksPerRender, + ), + ); - // Reset tick delay for next measurement - this.currentTickDelay = undefined; - } + // Reset tick delay for next measurement + this.currentTickDelay = undefined; } if (this.pendingStart < this.pendingUpdates.length) {