3.8 KiB
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.Tilemapsza izometrični pogled aliPhaser.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).
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.Particlesza 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)
- Korak 1 (Takoj): [DONE] Implementiraj "Throttling" za
updateCulling. - Korak 2: [DONE] Prepiši
WeatherSystemza uporabo Phaser Particles. - Korak 3: [DONE] Implementiraj "Throttling" in Distance Culling za NPC AI.
- Korak 4: [DONE] Implementacija
Phaser.Blitterza teren (Faza 4 fix). - Korak 5: [DONE] Povezava Settings z Weather in Terrain sistemi.