popravek zombijo

This commit is contained in:
2025-12-07 13:16:04 +01:00
parent 2404d44ef7
commit 98059a2659
9 changed files with 577 additions and 385 deletions

View File

@@ -1,71 +1,42 @@
# Plan Optimizacij za NovaFarma
# 🛠️ Plan Optimizacij in Čiščenja - NovaFarma
Cilj: Izboljšati delovanje igre na počasnejših računalnikih (low-end devices) in zagotoviti stabilnih 60 FPS.
Datoteka namenjena tehničnim izboljšavam kode, refaktoringu in performančnim popravkom.
## 1. Rendering (Grafika)
## 🟢 1. Opravljene Optimizacije (Completed)
Stvari, ki so bile uspešno implementirane in izboljšale delovanje.
### 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).
s
### 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).
- [x] **Distance Culling (Teren & Dekoracije)**
- Sistem skriva ploščice (tiles) in drevesa, ki so daleč od igralca, da varčuje s CPU/GPU.
- [x] **Pooling Sistem**
- `TerrainSystem` uporablja bazen spritov (`decPool`, `tilePool`) za ponovno uporabo objektov namesto nenehnega uničevanja in ustvarjanja.
- [x] **NPC Logic Throttling & Culling**
- NPC-ji daleč od igralca se ne posodabljajo in so skriti.
- AI se ne izvaja vsak frame (uporaba timerjev za premik).
- [x] **Code Refactoring & Bug Fixes**
- [x] `InteractionSystem.js`: Centralizirana logika za klike in tipkovnico (E tipka). Odstranjeni odvečni listenerji.
- [x] `Player.js`: Urejena logika gibanja in napada (Spacebar).
- [x] `NPC.js`: Dodan Health Bar, Taming logika in Loot Drop.
- [x] `TextureGenerator`: Urejen draw items (Bone, Axe, Pickaxe).
### 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. Odprte Tehnične Naloge (To-Do)
Stvari, ki bi jih bilo dobro urediti za boljšo stabilnost.
## 2. Logika in Procesiranje
- [ ] **Global Error Handling**
- Ujeti napake, ki se zgodijo med igranjem (npr. manjkajoča metoda), in preprečiti sesutje igre (kot se je zgodilo z `handleDecorationClick`).
- [ ] **Centraliziran Loot Manager**
- Trenutno `InteractionSystem` upravlja z lootom. Bolje bi bilo imeti ločen `LootSystem` ali `ItemDropManager`, ki skrbi za fiziko dropov, pobiranje in despawn.
- [ ] **Z-Sorting (Depth) Optimizacija**
- Globina se še vedno nastavlja pogosto. Lahko bi optimizirali tako, da se statični objekti sortirajo samo enkrat.
### 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.
## 🔴 3. Performančne Nadgradnje (High-End)
Če bo igra postala počasna pri velikem svetu (256x256).
### 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.
- [ ] **Phaser Blitter / Tilemap**
- Trenutno je svet sestavljen iz tisočev spritov. Prehod na `Phaser.Blitter` ali `Tilemap` bi drastično zmanjšal porabo RAM-a in CPU-ja.
- [ ] **Spatial Hashing za Kolizijo**
- Namesto preverjanja razdalje do vsakega NPC-ja uporabiti prostorsko mrežo (Spatial Grid) za hitrejše iskanje sosedov.
- [ ] **Web Workers za AI**
- Prestavi pathfinding (iskanje poti) na ločen thread (Worker), da ne blokira glavne igre.
### 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):** [DONE] Implementiraj "Throttling" za `updateCulling`.
2. **Korak 2:** [DONE] Prepiši `WeatherSystem` za uporabo Phaser Particles.
3. **Korak 3:** [DONE] Implementiraj "Throttling" in Distance Culling za NPC AI.
4. **Korak 4:** [DONE] Implementacija `Phaser.Blitter` za teren (Faza 4 fix).
5. **Korak 5:** [DONE] Povezava Settings z Weather in Terrain sistemi.
---
*Status: Koda je trenutno stabilna in očiščena (7.12.2025).*