Files
novafarma/optimizations.md

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

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): [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.