GC-Ruckler durch Object.values() in pickJob und tickVillager #34

Closed
opened 2026-03-23 20:16:47 +00:00 by claude · 0 comments
Collaborator

Problem

pickJob() wird ~jede Sekunde pro Nisse aufgerufen (idle scan timer) und erzeugt dabei massenhaft kurzlebige Array-Objekte durch Object.values(). Der schlimmste Fall ist der Forester-Block: für jedes Zone-Tile werden 4× Object.values() auf resources, buildings, crops und treeSeedlings aufgerufen. Bei einer Zone mit 20 Tiles = 80 Array-Allokationen pro pickJob-Aufruf → JavaScript GC pausiert → sichtbare Ruckler im ~1-Sekunden-Takt.

Zusätzlich: tickVillager() erstellt jedes Frame ein neues icons-Objekt.

Fix

  • pickJob: alle Object.values()-Aufrufe einmal am Anfang der Methode, Variablen wiederverwenden
  • tickVillager: icons-Record als Modul-Konstante außerhalb der Methode
  • update(): Villager-Array einmal pro Frame holen, nicht per tickVillager
## Problem `pickJob()` wird ~jede Sekunde pro Nisse aufgerufen (idle scan timer) und erzeugt dabei massenhaft kurzlebige Array-Objekte durch `Object.values()`. Der schlimmste Fall ist der Forester-Block: für jedes Zone-Tile werden 4× `Object.values()` auf `resources`, `buildings`, `crops` und `treeSeedlings` aufgerufen. Bei einer Zone mit 20 Tiles = 80 Array-Allokationen pro `pickJob`-Aufruf → JavaScript GC pausiert → sichtbare Ruckler im ~1-Sekunden-Takt. Zusätzlich: `tickVillager()` erstellt jedes Frame ein neues `icons`-Objekt. ## Fix - `pickJob`: alle `Object.values()`-Aufrufe einmal am Anfang der Methode, Variablen wiederverwenden - `tickVillager`: `icons`-Record als Modul-Konstante außerhalb der Methode - `update()`: Villager-Array einmal pro Frame holen, nicht per `tickVillager`
tekki closed this issue 2026-03-23 20:28:46 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: tekki/nissefolk#34
No description provided.