plan oprimizacij
This commit is contained in:
70
optimizations.md
Normal file
70
optimizations.md
Normal file
@@ -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).
|
||||
Reference in New Issue
Block a user