add perf improvements: don't draw full boat tail, make nukes calculations slightly more efficient

This commit is contained in:
Evan
2025-04-04 17:02:19 -07:00
parent 9837401a1b
commit 21752aa214
2 changed files with 19 additions and 14 deletions
+4 -4
View File
@@ -29,7 +29,7 @@ export class UnitLayer implements Layer {
private canvas: HTMLCanvasElement;
private context: CanvasRenderingContext2D;
private boatToTrail = new Map<UnitView, Set<TileRef>>();
private boatToTrail = new Map<UnitView, TileRef[]>();
private theme: Theme = null;
@@ -478,10 +478,10 @@ export class UnitLayer implements Layer {
const rel = this.relationship(unit);
if (!this.boatToTrail.has(unit)) {
this.boatToTrail.set(unit, new Set<TileRef>());
this.boatToTrail.set(unit, []);
}
const trail = this.boatToTrail.get(unit);
trail.add(unit.lastTile());
trail.push(unit.lastTile());
// Clear previous area
for (const t of this.game.bfs(
@@ -493,7 +493,7 @@ export class UnitLayer implements Layer {
if (unit.isActive()) {
// Paint trail
for (const t of trail) {
for (const t of trail.slice(-4)) {
this.paintCell(
this.game.x(t),
this.game.y(t),
+15 -10
View File
@@ -54,24 +54,29 @@ export class NukeExecution implements Execution {
const rand = new PseudoRandom(this.mg.ticks());
return this.mg.bfs(this.dst, (_, n: TileRef) => {
const d = this.mg.euclideanDist(this.dst, n);
return (d <= magnitude.inner || rand.chance(2)) && d <= magnitude.outer;
if (d > magnitude.outer) {
return false;
}
return d <= magnitude.inner || rand.chance(2);
});
}
private getAttackedTiles() {
private getAttackedTiles(): Map<Player, number> {
const toDestroy = this.tilesToDestroy();
const attacked = new Map<Player, number>();
const attacked = new Map<number, number>();
for (const tile of toDestroy) {
const owner = this.mg.owner(tile);
if (owner.isPlayer()) {
const mp = this.mg.player(owner.id());
const prev = attacked.get(mp) ?? 0;
attacked.set(mp, prev + 1);
const ownerID = this.mg.ownerID(tile);
if (ownerID != 0) {
const prev = attacked.get(ownerID) ?? 0;
attacked.set(ownerID, prev + 1);
}
}
return attacked;
return new Map(
Array.from(attacked.entries()).map(([smallID, value]) => {
return [this.mg.playerBySmallID(smallID), value] as [Player, number];
}),
);
}
private breakAlliances() {