# 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).