From da6f0a89e72f4edb29a85204027a3f3dbfc916c0 Mon Sep 17 00:00:00 2001 From: evanpelle Date: Mon, 26 Aug 2024 12:42:14 -0700 Subject: [PATCH] use priority queue to store tile updates --- TODO.txt | 4 ++++ package-lock.json | 16 ++++++++++++++++ package.json | 1 + src/client/graphics/GameRenderer.ts | 25 +++++++++++++++++++++---- src/core/configuration/DevConfig.ts | 2 +- 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/TODO.txt b/TODO.txt index 419956163..3b3fc016d 100644 --- a/TODO.txt +++ b/TODO.txt @@ -48,6 +48,10 @@ * give time to (re) spawn at start of game DONE 8/25/2024 * show bar for long to respawn DONE 8/26/2024 * store & delay tile updates for lag compensation +* BUG: error if don't spawn and then click after spawn mode +* BUG: change player name after join lobby +* REFACTOR: use new priority queue +* BUG: players attack each other same time creates islands * add shader to dim border * REFACTOR: remove player.info() * REFACTOR: give terranullius an ID, game.player() returns terranullius diff --git a/package-lock.json b/package-lock.json index 83f267d7e..d090464e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,6 +6,7 @@ "": { "name": "warfront-client", "dependencies": { + "@datastructures-js/priority-queue": "^6.3.1", "@types/express": "^4.17.21", "@types/google-protobuf": "^3.15.12", "@types/jimp": "^0.2.28", @@ -2162,6 +2163,21 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@datastructures-js/heap": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@datastructures-js/heap/-/heap-4.3.3.tgz", + "integrity": "sha512-UcUu/DLh/aM4W3C8zZfwxxm6/6FIZUlm3mcAXuNOCa6Aj4iizNvNXQyb8DjZQH2jKSQbMRyNlngP6TPimuGjpQ==", + "license": "MIT" + }, + "node_modules/@datastructures-js/priority-queue": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@datastructures-js/priority-queue/-/priority-queue-6.3.1.tgz", + "integrity": "sha512-eoxkWql/j0VJ0UFMFTpnyJz4KbEEVQ6aZ/JuJUgenu0Im4tYKylAycNGsYCHGXiVNEd7OKGVwfx1Ac3oYkuu7A==", + "license": "MIT", + "dependencies": { + "@datastructures-js/heap": "^4.3.3" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", diff --git a/package.json b/package.json index 23541f7d5..d6156e698 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "webpack-dev-server": "^5.0.4" }, "dependencies": { + "@datastructures-js/priority-queue": "^6.3.1", "@types/express": "^4.17.21", "@types/google-protobuf": "^3.15.12", "@types/jimp": "^0.2.28", diff --git a/src/client/graphics/GameRenderer.ts b/src/client/graphics/GameRenderer.ts index 8cf17e96b..e9cda3fd6 100644 --- a/src/client/graphics/GameRenderer.ts +++ b/src/client/graphics/GameRenderer.ts @@ -6,8 +6,7 @@ import {NameRenderer} from "./NameRenderer"; import {bfs, manhattanDist} from "../../core/Util"; import {PseudoRandom} from "../../core/PseudoRandom"; import {TerrainRenderer} from "./TerrainRenderer"; - - +import {MaxPriorityQueue, PriorityQueue} from "@datastructures-js/priority-queue"; export class GameRenderer { private territoryCanvas: HTMLCanvasElement @@ -25,6 +24,12 @@ export class GameRenderer { private nameRenderer: NameRenderer; private theme: Theme + private random = new PseudoRandom(123) + + + private tileToRenderQueue: PriorityQueue<{tileEvent: TileEvent, lastUpdate: number}> = new PriorityQueue((a, b) => {return a.lastUpdate - b.lastUpdate}) + + constructor(private gs: Game, private terrainRenderer: TerrainRenderer) { this.theme = gs.config().theme() this.nameRenderer = new NameRenderer(gs, this.theme) @@ -95,6 +100,7 @@ export class GameRenderer { ); this.terrainRenderer.draw(this.context) + this.renderTerritory() this.context.drawImage( this.territoryCanvas, @@ -115,6 +121,18 @@ export class GameRenderer { requestAnimationFrame(() => this.renderGame()); } + renderTerritory() { + let numToRender = Math.floor(this.tileToRenderQueue.size() / 10) + + while (numToRender > 0) { + numToRender-- + const event = this.tileToRenderQueue.pop().tileEvent + this.paintTerritory(event.tile) + event.tile.neighbors().forEach(t => this.paintTerritory(t)) + } + } + + renderUIBar() { if (!this.gs.inSpawnPhase()) { return @@ -138,8 +156,7 @@ export class GameRenderer { } tileUpdate(event: TileEvent) { - this.paintTerritory(event.tile) - event.tile.neighbors().forEach(t => this.paintTerritory(t)) + this.tileToRenderQueue.push({tileEvent: event, lastUpdate: this.gs.ticks() + this.random.nextFloat(0, .5)}) } playerEvent(event: PlayerEvent) { diff --git a/src/core/configuration/DevConfig.ts b/src/core/configuration/DevConfig.ts index 0948f3c26..7cca37118 100644 --- a/src/core/configuration/DevConfig.ts +++ b/src/core/configuration/DevConfig.ts @@ -4,7 +4,7 @@ import {DefaultConfig, DefaultPlayerConfig, defaultPlayerConfig} from "./Default export const devConfig = new class extends DefaultConfig { numSpawnPhaseTurns(): number { - return 100 + return 40 } gameCreationRate(): number { return 3 * 1000