diff --git a/src/client/InputHandler.ts b/src/client/InputHandler.ts index 1c12cf61b..b24671d96 100644 --- a/src/client/InputHandler.ts +++ b/src/client/InputHandler.ts @@ -193,6 +193,10 @@ export class TickMetricsEvent implements GameEvent { ) {} } +export class WebGPUComputeMetricsEvent implements GameEvent { + constructor(public readonly computeMs: number) {} +} + export class InputHandler { private lastPointerX: number = 0; private lastPointerY: number = 0; diff --git a/src/client/graphics/GameRenderer.ts b/src/client/graphics/GameRenderer.ts index 28bc6789d..753fa2fb2 100644 --- a/src/client/graphics/GameRenderer.ts +++ b/src/client/graphics/GameRenderer.ts @@ -44,6 +44,7 @@ import { TerritoryLayer } from "./layers/TerritoryLayer"; import { UILayer } from "./layers/UILayer"; import { UnitDisplay } from "./layers/UnitDisplay"; import { UnitLayer } from "./layers/UnitLayer"; +import { WebGPUDebugOverlay } from "./layers/WebGPUDebugOverlay"; import { WinModal } from "./layers/WinModal"; export function createRenderer( @@ -241,6 +242,16 @@ export function createRenderer( performanceOverlay.eventBus = eventBus; performanceOverlay.userSettings = userSettings; + const webgpuDebugOverlay = document.querySelector( + "webgpu-debug-overlay", + ) as WebGPUDebugOverlay; + if (!(webgpuDebugOverlay instanceof WebGPUDebugOverlay)) { + console.error("webgpu debug overlay not found"); + } + webgpuDebugOverlay.eventBus = eventBus; + webgpuDebugOverlay.userSettings = userSettings; + webgpuDebugOverlay.requestUpdate(); + const alertFrame = document.querySelector("alert-frame") as AlertFrame; if (!(alertFrame instanceof AlertFrame)) { console.error("alert frame not found"); @@ -318,6 +329,7 @@ export function createRenderer( inGamePromo, alertFrame, performanceOverlay, + webgpuDebugOverlay, ]; return new GameRenderer( @@ -328,6 +340,7 @@ export function createRenderer( uiState, layers, performanceOverlay, + webgpuDebugOverlay, ); } @@ -345,6 +358,7 @@ export class GameRenderer { public uiState: UIState, private layers: Layer[], private performanceOverlay: PerformanceOverlay, + private webgpuDebugOverlay: WebGPUDebugOverlay, ) { // Keep the main canvas transparent; the WebGPU territory canvas renders the background. const context = canvas.getContext("2d", { alpha: true }); @@ -451,6 +465,7 @@ export class GameRenderer { } this.performanceOverlay.updateFrameMetrics(duration, layerDurations); } + this.webgpuDebugOverlay.updateFrameMetrics(duration); if (duration > 50) { console.warn( diff --git a/src/client/graphics/layers/SettingsModal.ts b/src/client/graphics/layers/SettingsModal.ts index a58d21462..658368279 100644 --- a/src/client/graphics/layers/SettingsModal.ts +++ b/src/client/graphics/layers/SettingsModal.ts @@ -149,16 +149,6 @@ export class SettingsModal extends LitElement implements Layer { this.requestUpdate(); } - private onTerritoryBorderModeChange(event: Event) { - const value = (event.target as HTMLSelectElement).value; - const mode = Number.parseInt(value, 10); - if (!Number.isFinite(mode)) - throw new Error(`Invalid border mode: ${value}`); - - this.userSettings.setInt("settings.territoryBorderMode", mode); - this.requestUpdate(); - } - private onToggleRandomNameModeButtonClick() { this.userSettings.toggleRandomName(); this.requestUpdate(); @@ -184,6 +174,11 @@ export class SettingsModal extends LitElement implements Layer { this.requestUpdate(); } + private onToggleWebgpuDebugOverlayButtonClick() { + this.userSettings.toggleWebgpuDebug(); + this.requestUpdate(); + } + private onExitButtonClick() { // redirect to the home page window.location.href = "/"; @@ -309,34 +304,6 @@ export class SettingsModal extends LitElement implements Layer { -
- territoryBorderMode -
-
- ${translateText("user_setting.territory_border_mode_label")} -
-
- ${translateText("user_setting.territory_border_mode_desc")} -
-
- -
- + +