use priority queue to store tile updates

This commit is contained in:
evanpelle
2024-08-26 12:42:14 -07:00
parent 753893d59d
commit da6f0a89e7
5 changed files with 43 additions and 5 deletions
+4
View File
@@ -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
+16
View File
@@ -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",
+1
View File
@@ -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",
+21 -4
View File
@@ -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) {
+1 -1
View File
@@ -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