diff --git a/optimizations.md b/optimizations.md new file mode 100644 index 0000000..6b17c2c --- /dev/null +++ b/optimizations.md @@ -0,0 +1,70 @@ +# Plan Optimizacij za NovaFarma + +Cilj: Izboljšati delovanje igre na počasnejših računalnikih (low-end devices) in zagotoviti stabilnih 60 FPS. + +## 1. Rendering (Grafika) + +### A. Prehod na Phaser Tilemap ali Blitter (Visoka prioriteta) +Trenutno `TerrainSystem` uporablja individualne `Phaser.GameObjects.Sprite` za vsako ploščico (tile) na tleh. Pri mapi 100x100 to pomeni 10.000 spritov, kar je veliko breme za CPU/GPU, tudi s cullingom. +* **Rešitev:** Uporabiti `Phaser.Tilemaps` za izometrični pogled ali `Phaser.GameObjects.Blitter`. Blitter je izjemno hiter za renderiranje velikega števila enakih tekstur. +* **Pričakovan prihranek:** Ogromen (CPU overhead za game objekte). + +### B. Optimizacija Depth Sorting (Srednja prioriteta) +Trenutno se globina (z-index) računa in nastavlja za vsak `Sprite` (igralec, NPC, tiles, decorations) pogosto vsak frame. +* **Rešitev:** + * Statične objekte (drevesa, kamni, tile) sortiraj samo enkrat ob generiranju ali ko pridejo v kader. + * Dinamične objekte (igralec, NPC) sortiraj vsak frame, ampak samo glede na sosednje objekte. + * Uporabi "Display Layers" (Containerje) za ločevanje tal in objektov, da se tla nikoli ne sortirajo proti igralcu (tla so vedno spodaj). + +### C. Zmanjšanje Draw Calls (Weather System) +Sistem vremena trenutno uporablja `Graphics` objekt, kjer riše vsako kapljo posebej s `strokePath` v JS zanki. +* **Rešitev:** + * Uporaba **Shaderjev (GLSL)** za dež in meglo. To prestavi delo na GPU in je praktično "zastonj" za CPU. + * Alternativa: Uporaba `Phaser.GameObjects.Particles` za dež. + +## 2. Logika in Procesiranje + +### A. Izboljšan Culling (Visoka prioriteta) +Trenutno `updateCulling` teče vsak frame (ali pogosto). Zanka gre čez vse tile (10.000) in preverja distance. +* **Rešitev:** + * **Spatial Hashing / Grid Partitioning:** Razdeli svet na "Chunke" (npr. 10x10 tileov). Renderiraj samo chunke, ki se dotikajo kamere. + * Posodobi culling samo, ko se kamera premakne za določeno razdaljo (npr. 50px), ne vsak frame. + +### B. Throttling AI in Posodobitev (Srednja prioriteta) +NPC-ji se posodabljajo vsak frame (60-krat na sekundo). +* **Rešitev:** + * Posodabljaj logiko NPC-jev (iskanje poti, odločanje) samo vsakih 10-20 framov ali 100ms. + * Animacije se še vedno vrtijo gladko, ampak "možgani" delajo počasneje. + * Oddaljeni NPC-ji (izven ekrana) se sploh ne posodabljajo ali pa zelo redko. + +### C. Fizika +Če uporabljamo Arcade Physics za vse kolizije, je lahko počasno. +* **Rešitev:** Za statične objekte (drevesa, zidovi) uporabljaj preprosto preverjanje mreže (`grid[x][y].isSolid`), namesto da vsako drevo ustvari fizikalno telo. + +## 3. Upravljanje Spomina (Memory) + +### A. Object Pooling (Že delno implementirano) +Zagotoviti, da se za VSE pogoste objekte uporablja pool: +* Projektili (če bodo). +* Partikli. +* UI elementi (floating text damage). +* Inventory icons. + +### B. Texture Management +* Zagotoviti, da so vse teksture v **Sprite Atlasu** (Texture Atlas) za zmanjšanje "Texture Swaps" na GPU. +* Unloadati asete, ki niso v uporabi (npr. med prehodi scen, čeprav za to igro verjetno ni kritično). + +## 4. Settings (Nastavitve za uporabnika) + +Dodati meni "Settings", kjer lahko uporabnik izbere: +* **View Distance:** Koliko tile-ov daleč se renderira. +* **Weather Effects:** On/Off/Simple (brez delcev). +* **Shadows:** On/Off. +* **Particles:** High/Low. + +## Akcijski Plan (Koraki) + +1. **Korak 1 (Takoj):** Implementiraj "Chunk System" za `updateCulling`. Ne iteriraj čez 10.000 tileov vsak frame. Iteriraj samo čez vidno območje intersekcije (minX do maxX, minY do maxY). To je enostaven matematičen fix v `TerrainSystem`. +2. **Korak 2:** Prepiši `WeatherSystem` za uporabo preprostih delcev ali zmanjšaj število kapelj na low-end. +3. **Korak 3:** Implementiraj "Throttling" za NPC AI. +4. **Korak 4:** Prehod na `Blitter` za teren (dolgoročno).