- The bombardment overlay was rebuilt every animation frame, and each barrage
scanned the whole army to find its target (O(strikes x units)). It now
redraws at most at the renderer's 24 fps, reuses its SVG/DOM nodes, and
resolves garrisons from one per-snapshot tile index, so a high-refresh
display no longer makes a big battle worse.
- Route truncation had the same shape: every step of every route rescanned
every unit. The snapshot now buckets the army by tile once.
- Idle units no longer have identical left/top rewritten every frame, and the
whole-map fog buffer is rebuilt less often.
- Snapshot traffic: cityStats and visible are delta-encoded like territory and
population, city stats carry a content-hash version, tile ethnicity is
memoised, and a city's economy is derived once per broadcast instead of
twice. A per-peer civ change now forces a full snapshot, since the visible
set is per-viewer.