From 1281af9c847b4cdd2ccf491f55fb98aad834472e Mon Sep 17 00:00:00 2001 From: Isaac Thoman <49598528+IsaacThoman@users.noreply.github.com> Date: Thu, 16 Jan 2025 19:31:11 -0500 Subject: [PATCH 1/4] feat: basic profiling stats --- src/client/core/Networking.ts | 4 ++++ src/client/ui/ChatOverlay.ts | 3 +++ src/server/GameEngine.ts | 21 +++++++++++++++++++++ src/server/models/ServerInfo.ts | 4 ++++ 4 files changed, 32 insertions(+) diff --git a/src/client/core/Networking.ts b/src/client/core/Networking.ts index f0a7c09..dc2727c 100644 --- a/src/client/core/Networking.ts +++ b/src/client/core/Networking.ts @@ -20,6 +20,8 @@ interface ServerInfo { gameMode: string; playerMaxHealth: number; skyColor: string; + tickComputeTime: number; + cleanupComputeTime: number; } interface LastUploadedLocalPlayer { @@ -70,6 +72,8 @@ export class Networking { gameMode: '', playerMaxHealth: 0, skyColor: '#000000', + tickComputeTime: 0, + cleanupComputeTime: 0, }; this.setupSocketListeners(); diff --git a/src/client/ui/ChatOverlay.ts b/src/client/ui/ChatOverlay.ts index 222200c..58cecfb 100644 --- a/src/client/ui/ChatOverlay.ts +++ b/src/client/ui/ChatOverlay.ts @@ -426,6 +426,9 @@ export class ChatOverlay { //linesToRender.push('health: ' + this.localPlayer.health); //linesToRender.push('pos:' +this.localPlayer.position.x.toFixed(2) + ',' + this.localPlayer.position.y.toFixed(2) + ',' +this.localPlayer.position.z.toFixed(2),); + linesToRender.push('tickTime: ' + (this.networking.getServerInfo().tickComputeTime * 1000).toFixed(2) + 'ms'); + linesToRender.push('cleanupTime: ' + (this.networking.getServerInfo().cleanupComputeTime * 1000).toFixed(2) + 'ms'); + for (const msg of this.localPlayer.gameMsgs2) { linesToRender.push(msg); } diff --git a/src/server/GameEngine.ts b/src/server/GameEngine.ts index 642e9ea..c0e0586 100644 --- a/src/server/GameEngine.ts +++ b/src/server/GameEngine.ts @@ -20,6 +20,11 @@ export class GameEngine { public serverInfo: ServerInfo = new ServerInfo(); public gamemode: Gamemode | false = false; + private tickProfileSamples: number = 0; + private tickProfileTime: number = 0; + private cleanupProfileSamples: number = 0; + private cleanupProfileTime: number = 0; + constructor( public playerManager: PlayerManager, public itemManager: ItemManager, @@ -62,6 +67,14 @@ export class GameEngine { console.error('⚠ error emitting item data:', err); } } + + this.tickProfileSamples++; + this.tickProfileTime += Date.now() / 1000 - currentTime; + if (this.tickProfileSamples >= 100) { + this.serverInfo.tickComputeTime = this.tickProfileTime / this.tickProfileSamples; + this.tickProfileSamples = 0; + this.tickProfileTime = 0; + } } catch (error) { console.error('⚠ error in serverTick:', error); } @@ -119,6 +132,14 @@ export class GameEngine { }); if (this.gamemode) this.gamemode.onPeriodicCleanup(); + + this.cleanupProfileSamples++; + this.cleanupProfileTime += Date.now() / 1000 - currentTime; + if (this.cleanupProfileSamples >= 10) { + this.serverInfo.cleanupComputeTime = this.cleanupProfileTime / this.cleanupProfileSamples; + this.cleanupProfileSamples = 0; + this.cleanupProfileTime = 0; + } } catch (error) { console.error('⚠ error in periodicCleanup:', error); } diff --git a/src/server/models/ServerInfo.ts b/src/server/models/ServerInfo.ts index 85d900d..80f2722 100644 --- a/src/server/models/ServerInfo.ts +++ b/src/server/models/ServerInfo.ts @@ -10,6 +10,8 @@ export class ServerInfo { public gameMode: string; public playerMaxHealth: number; public skyColor: string; + public tickComputeTime: number = 0; + public cleanupComputeTime: number = 0; constructor() { this.name = config.server.name; this.maxPlayers = config.game.maxPlayers; @@ -18,6 +20,8 @@ export class ServerInfo { this.gameMode = config.game.mode; this.playerMaxHealth = config.player.maxHealth; this.skyColor = '#000000'; + this.tickComputeTime = 0; + this.cleanupComputeTime = 0; } toJSON() { return { From bb2724630b728116bf089cca84adc9294ec4c126 Mon Sep 17 00:00:00 2001 From: Isaac Thoman <49598528+IsaacThoman@users.noreply.github.com> Date: Thu, 16 Jan 2025 19:34:59 -0500 Subject: [PATCH 2/4] show tick percentage --- src/client/ui/ChatOverlay.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/client/ui/ChatOverlay.ts b/src/client/ui/ChatOverlay.ts index 58cecfb..e529251 100644 --- a/src/client/ui/ChatOverlay.ts +++ b/src/client/ui/ChatOverlay.ts @@ -425,10 +425,13 @@ export class ChatOverlay { //linesToRender.push('playerMaxHealth: ' + this.networking.getServerInfo().playerMaxHealth); //linesToRender.push('health: ' + this.localPlayer.health); //linesToRender.push('pos:' +this.localPlayer.position.x.toFixed(2) + ',' + this.localPlayer.position.y.toFixed(2) + ',' +this.localPlayer.position.z.toFixed(2),); + const tickTimeMs = this.networking.getServerInfo().tickComputeTime * 1000; + const cleanupTimeMs = this.networking.getServerInfo().cleanupComputeTime * 1000; + const tickSpeedMs = 1 / this.networking.getServerInfo().tickRate * 1000; + const tickTimePercent = (tickTimeMs / tickSpeedMs) * 100; - linesToRender.push('tickTime: ' + (this.networking.getServerInfo().tickComputeTime * 1000).toFixed(2) + 'ms'); - linesToRender.push('cleanupTime: ' + (this.networking.getServerInfo().cleanupComputeTime * 1000).toFixed(2) + 'ms'); - + linesToRender.push('tickTime: ' + tickTimeMs.toFixed(2) + 'ms (' + tickTimePercent.toFixed(2) + '%)'); + linesToRender.push('cleanupTime: ' + cleanupTimeMs.toFixed(2) + 'ms'); for (const msg of this.localPlayer.gameMsgs2) { linesToRender.push(msg); } From 7137ac3a6210cd67712e82a58445694edf9ed699 Mon Sep 17 00:00:00 2001 From: Isaac Thoman <49598528+IsaacThoman@users.noreply.github.com> Date: Fri, 17 Jan 2025 01:00:27 -0500 Subject: [PATCH 3/4] feat: add /debug command --- src/client/core/CommandManager.ts | 19 ++++++++++- src/client/core/SettingsManager.ts | 2 ++ src/client/ui/ChatOverlay.ts | 55 ++++++++++++++++++------------ 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/client/core/CommandManager.ts b/src/client/core/CommandManager.ts index 9332526..286c38c 100644 --- a/src/client/core/CommandManager.ts +++ b/src/client/core/CommandManager.ts @@ -111,7 +111,10 @@ export class CommandManager { this.commands.push( new Command('prettyText', (args: string[]): string => { - if (args[1] == null) return 'prettyText is currently ' + SettingsManager.settings.doPrettyText; + if (args[1] == null) { + SettingsManager.settings.doPrettyText = !SettingsManager.settings.doPrettyText; + return 'toggled prettyText to ' + SettingsManager.settings.doPrettyText; + } if (args[1] == 'true') SettingsManager.settings.doPrettyText = true; else if (args[1] == 'false') SettingsManager.settings.doPrettyText = false; else return 'invalid input (true/false)'; @@ -119,6 +122,20 @@ export class CommandManager { return 'prettyText set to ' + args[1]; }), ); + + this.commands.push( + new Command('debug', (args: string[]): string => { + if (args[1] == null) { + SettingsManager.settings.developerMode = !SettingsManager.settings.developerMode; + return 'toggled developer mode to ' + SettingsManager.settings.developerMode; + } + if (args[1] == 'true') SettingsManager.settings.developerMode = true; + else if (args[1] == 'false') SettingsManager.settings.developerMode = false; + else return 'invalid input (true/false)'; + SettingsManager.write(); + return 'developer mode set to ' + args[1]; + }), + ); } public runCmd(cmd: string): boolean { diff --git a/src/client/core/SettingsManager.ts b/src/client/core/SettingsManager.ts index 0e028ef..324e570 100644 --- a/src/client/core/SettingsManager.ts +++ b/src/client/core/SettingsManager.ts @@ -20,6 +20,7 @@ export class SettingsManager { crosshairType: 1, viewBobbingStrength: 1, doPrettyText: false, + developerMode: false, }; } @@ -36,4 +37,5 @@ interface Settings { crosshairType: number; viewBobbingStrength: number; doPrettyText: boolean; + developerMode: boolean; } diff --git a/src/client/ui/ChatOverlay.ts b/src/client/ui/ChatOverlay.ts index e529251..3f94758 100644 --- a/src/client/ui/ChatOverlay.ts +++ b/src/client/ui/ChatOverlay.ts @@ -407,37 +407,48 @@ export class ChatOverlay { const framerate = this.renderer.getFramerate(); if (this.localPlayer.latency >= 999) { - linesToRender.push('disconnected :('); + linesToRender.push('&cdisconnected :('); } - - //const playerX = Math.round(this.localPlayer.position.x); - linesToRender.push( 'candiru ' + this.localPlayer.gameVersion + ' @ ' + Math.round(framerate) + 'fps, ' + Math.round(this.localPlayer.latency) + 'ms', ); - //linesToRender.push('connected to: ' + this.networking.getServerInfo().name); - //linesToRender.push('players: ' + this.networking.getServerInfo().currentPlayers + '/' + this.networking.getServerInfo().maxPlayers); - //linesToRender.push('map: ' + this.networking.getServerInfo().mapName); - //linesToRender.push('mode: ' + this.networking.getServerInfo().gameMode); - //linesToRender.push('serverVersion: ' + this.networking.getServerInfo().version); - //linesToRender.push('tickRate: ' + this.networking.getServerInfo().tickRate); - //linesToRender.push('playerMaxHealth: ' + this.networking.getServerInfo().playerMaxHealth); - //linesToRender.push('health: ' + this.localPlayer.health); - //linesToRender.push('pos:' +this.localPlayer.position.x.toFixed(2) + ',' + this.localPlayer.position.y.toFixed(2) + ',' +this.localPlayer.position.z.toFixed(2),); - const tickTimeMs = this.networking.getServerInfo().tickComputeTime * 1000; - const cleanupTimeMs = this.networking.getServerInfo().cleanupComputeTime * 1000; - const tickSpeedMs = 1 / this.networking.getServerInfo().tickRate * 1000; - const tickTimePercent = (tickTimeMs / tickSpeedMs) * 100; - - linesToRender.push('tickTime: ' + tickTimeMs.toFixed(2) + 'ms (' + tickTimePercent.toFixed(2) + '%)'); - linesToRender.push('cleanupTime: ' + cleanupTimeMs.toFixed(2) + 'ms'); + + //const playerX = Math.round(this.localPlayer.position.x); + if (SettingsManager.settings.developerMode) { + linesToRender.push( + this.networking.getServerInfo().name + ' (' + this.networking.getServerInfo().currentPlayers + '/' + + this.networking.getServerInfo().maxPlayers + ')', + ); + linesToRender.push( + 'map: ' + this.networking.getServerInfo().mapName + ', mode: ' + this.networking.getServerInfo().gameMode + + ', v' + + this.networking.getServerInfo().version, + ); + + linesToRender.push('tps: ' + this.networking.getServerInfo().tickRate); + linesToRender.push('maxHealth: ' + this.networking.getServerInfo().playerMaxHealth); + linesToRender.push('health: ' + this.localPlayer.health); + linesToRender.push( + 'pos:' + this.localPlayer.position.x.toFixed(2) + ',' + this.localPlayer.position.y.toFixed(2) + ',' + + this.localPlayer.position.z.toFixed(2), + ); + const tickTimeMs = this.networking.getServerInfo().tickComputeTime * 1000; + const cleanupTimeMs = this.networking.getServerInfo().cleanupComputeTime * 1000; + const tickSpeedMs = 1 / this.networking.getServerInfo().tickRate * 1000; + const tickTimePercent = (tickTimeMs / tickSpeedMs) * 100; + + linesToRender.push( + 'tickTime: ' + tickTimeMs.toFixed(2) + '/' + tickSpeedMs.toFixed(2) + 'ms (' + tickTimePercent.toFixed(2) + + '%)', + ); + linesToRender.push('cleanupTime: ' + cleanupTimeMs.toFixed(2) + 'ms'); + } + for (const msg of this.localPlayer.gameMsgs2) { linesToRender.push(msg); } - //linesToRender.push('routineTime: ' + this.lastRoutineMs + 'ms'); - for (let i = 0; i < linesToRender.length; i++) { this.renderPixelText(linesToRender[i], 2, 7 + 7 * i, 'teal'); } From ddecedcf60030e37627b742adeeb03395e9d2335 Mon Sep 17 00:00:00 2001 From: Isaac Thoman <49598528+IsaacThoman@users.noreply.github.com> Date: Fri, 17 Jan 2025 01:07:14 -0500 Subject: [PATCH 4/4] settings write after toggle --- src/client/core/CommandManager.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client/core/CommandManager.ts b/src/client/core/CommandManager.ts index 286c38c..3264f21 100644 --- a/src/client/core/CommandManager.ts +++ b/src/client/core/CommandManager.ts @@ -113,6 +113,7 @@ export class CommandManager { new Command('prettyText', (args: string[]): string => { if (args[1] == null) { SettingsManager.settings.doPrettyText = !SettingsManager.settings.doPrettyText; + SettingsManager.write(); return 'toggled prettyText to ' + SettingsManager.settings.doPrettyText; } if (args[1] == 'true') SettingsManager.settings.doPrettyText = true; @@ -127,6 +128,7 @@ export class CommandManager { new Command('debug', (args: string[]): string => { if (args[1] == null) { SettingsManager.settings.developerMode = !SettingsManager.settings.developerMode; + SettingsManager.write(); return 'toggled developer mode to ' + SettingsManager.settings.developerMode; } if (args[1] == 'true') SettingsManager.settings.developerMode = true;