Poglavlje 50: Studije Slucaja -- Primena Svega Naucenog

Poglavlje 50: Studije Slucaja -- Primena Svega Naucenog


"Teorija bez prakse je prazna, praksa bez teorije je slepa." -- Immanuel Kant (slobodan prevod)


Uvod

Stigli smo do poslednjeg poglavlja ove knjige. Ako si dosao dovde -- cestitam. Prosao si kroz skoro pedeset poglavlja, od prvog pokretanja Unreal Engine 5 editora, pa sve do naprednih tehnika profilisanja, optimizacije memorije, i rada sa Nanite i Lumen sistemima. Ali znanje bez primene ostaje samo potencijal.

U ovom poglavlju necemo uvoditi nove koncepte. Umesto toga, uradicemo nesto mnogo vaznije: primeniti sve sto smo naucili na cetiri realisticna scenarija iz prakse. Svaka studija slucaja simulira situaciju u kojoj bi se mogao naci kao UE5 developer -- od archviz projekta do VR iskustva. Za svaku cemo proci kompletan proces: definisanje problema, profilisanje, identifikaciju uskih grla (bottleneck), primenu optimizacija korak po korak, i merenje rezultata.

Ovo je tvoj "zavrsni ispit", ali bez stresa. Sedi, procitaj, i posmatraj kako se svi delovi slagalice uklapaju.

Kako citati ove studije slucaja

Svaka studija slucaja prati istu strukturu:

  1. Opis scene -- sta gradimo i koji su zahtevi
  2. Pocetno stanje -- performanse pre optimizacije, sa konkretnim brojevima
  3. Profilisanje -- identifikacija uskog grla pomocu alata koje smo naucili
  4. Optimizacija -- korak po korak, sa referencama na prethodna poglavlja
  5. Rezultat -- finalne performanse i kljucni zakljucci

Svaka referenca na prethodno poglavlje oznacena je u formatu (Poglavlje XX), tako da uvek mozes da se vratis i osvezis znanje o odredjenom konceptu.


Studija Slucaja 1: Archviz Enterijer -- Luksuzni Apartman

1.1 Opis scene i zahtevi

Nas prvi projekat je arhitektonska vizualizacija (archviz) luksuznog apartmana. Klijent je arhitektonski studio koji zeli interaktivnu prezentaciju za svoje kupce. Scena treba da se prikazuje u realnom vremenu na visokom kvalitetu.

Karakteristike scene:

Zahtevi klijenta:

Parametar Zahtev
Rezolucija renderovanja 3840 x 2160 (4K UHD)
Ciljani frame rate 60 FPS (stabilan)
Kvalitet osvetljenja Fotorealistican
Platforma PC (RTX 3080 ili ekvivalent)
Interakcija Slobodno kretanje kamerom

1.2 Pocetno stanje -- Houston, imamo problem

Pokrecemo build i odmah vidimo problem. Projekat se renderuje, izgleda fantasticno -- ali performanse su daleko ispod cilja.

Pocetni stat unit rezultati:

Frame:    40.0 ms  (25 FPS)
Game:      2.1 ms
Draw:      5.8 ms
GPU:      38.7 ms
RHI:       4.2 ms

Pocetni stat gpu rezultati (najskuplji renderovanje prolazi):

Lights                  12.4 ms
BasePass                 8.1 ms
PostProcessing           5.6 ms
Reflections              4.8 ms
Translucency             3.9 ms
Shadows                  2.8 ms
Lumen Scene              1.8 ms

Sa 25 FPS-a na 4K rezoluciji, daleko smo od ciljanih 60 FPS-a. Moramo smanjiti frame time sa 40 ms na ispod 16.67 ms.

1.3 Profilisanje -- Gde je usko grlo?

Kao sto smo naucili u Poglavlju 38 (Profilisanje i Dijagnostika), prvi korak je uvek identifikacija uskog grla. Pogledajmo sta nam brojevi govore:

Zakljucak: Scena je GPU-bound.

Pogledajmo detaljnije GPU rezultate:

  1. Lights (12.4 ms) -- Ovo je ubedljivo najskuplji pass. Sa 35 svetala u relativno maloj prostoriji, imamo ogroman broj overlapping lights (svetla ciji se radijusi preklapaju). Kao sto smo objasnili u Poglavlju 22 (Osvetljenje i Senke), svako dinamicko svetlo koje utice na piksel zahteva dodatni rendering pass za taj piksel. Kada se mnogo svetala preklapa, troskovi eksplodiraju.

  2. BasePass (8.1 ms) -- Materijali su skupi. 4K i 8K teksture sa kompleksnim PBR shader-ima (visestruki UV layer-i, detail normal maps) trose bandwidth.

  3. PostProcessing (5.6 ms) -- Post-process lanac je neoptimizovan. Bloom, Ambient Occlusion, Screen Space Reflections, Motion Blur, Tone Mapping -- sve je ukljuceno na highest settings.

  4. Reflections (4.8 ms) -- Mnogo reflektivnih povrsina znaci mnogo ray-tracing ili screen-space reflection posla.

  5. Translucency (3.9 ms) -- Stakleni prozori su najskuplji transparentni objekti. Kao sto smo videli u Poglavlju 26 (Transparentnost i Overdraw), transparentni materijali generisu overdraw jer se svaki piksel iza stakla mora renderovati, a zatim se i samo staklo renderuje preko.

1.4 Optimizacija -- Korak po korak

Korak 1: Smanjenje broja overlapping svetala

Problem: 35 dinamickih svetala u malom prostoru generise ogroman lighting cost.

Resenje:

Primenjujemo principe iz Poglavlja 22 (Osvetljenje i Senke) i Poglavlja 43 (Optimizacija Osvetljenja):

Rezultat posle Koraka 1:

stat gpu:
Lights                   5.1 ms  (bilo 12.4 ms, ustedeli 7.3 ms)
stat unit:
Frame:    30.2 ms  (33 FPS)
GPU:      28.9 ms

Odlicno! Samo ovim korakom smo dobili 8 FPS-a. Ali jos smo daleko od cilja.

Korak 2: Optimizacija staklenih materijala

Problem: Floor-to-ceiling prozori koriste kompleksan glass shader sa refrakcijom, koji generise znacajan overdraw.

Resenje:

Primenjujemo principe iz Poglavlja 26 (Transparentnost i Overdraw) i Poglavlja 25 (Material Optimizacija):

Rezultat posle Koraka 2:

stat gpu:
Translucency             1.2 ms  (bilo 3.9 ms, ustedeli 2.7 ms)
Reflections              3.8 ms  (bilo 4.8 ms, ustedeli 1.0 ms)
stat unit:
Frame:    26.1 ms  (38 FPS)
GPU:      24.8 ms

Korak 3: Lumen podesavanja

Problem: Lumen Global Illumination i Reflections su podrazumevano konfigurisani za opsti slucaj, ne za archviz enterijer.

Resenje:

Primenjujemo principe iz Poglavlja 44 (Lumen -- Dublje Razumevanje):

Rezultat posle Koraka 3:

stat gpu:
Lumen Scene              0.8 ms  (bilo 1.8 ms, ustedeli 1.0 ms)
Reflections              2.1 ms  (bilo 3.8 ms, ustedeli 1.7 ms)
stat unit:
Frame:    22.5 ms  (44 FPS)
GPU:      21.2 ms

Napredujemo! Ali jos uvek nam fali oko 6 ms do naseg cilja od 16.67 ms.

Korak 4: Teksture i rezolucija materijala

Problem: Mnoge teksture su nepotrebno velike. 8K teksture za mermerni pod? Zid koji se nikad ne vidi izbliza ima 4K teksture?

Resenje:

Primenjujemo principe iz Poglavlja 24 (Teksture -- Formati, Streaming, i Memorija) i Poglavlja 46 (Memorija -- Budzetiranje i Upravljanje):

Rezultat posle Koraka 4:

stat gpu:
BasePass                 5.2 ms  (bilo 8.1 ms, ustedeli 2.9 ms)
stat unit:
Frame:    19.4 ms  (51 FPS)
GPU:      18.1 ms

Memorija:

Texture Streaming Pool:  890 MB  (bilo 1420 MB, ustedeli 530 MB)

Skoro smo tu! Fali nam jos malo.

Korak 5: LOD za namestaj i post-processing optimizacija

Problem: Modeli namestaja imaju veoma visok poly count (sofa 180K tris, svaka stolica 95K tris), a svi post-process efekti su na maximum.

Resenje:

Primenjujemo principe iz Poglavlja 30 (LOD -- Nivoi Detalja) i Poglavlja 27 (Post-Processing Optimizacija):

Rezultat posle Koraka 5:

stat gpu:
PostProcessing           3.6 ms  (bilo 5.6 ms, ustedeli 2.0 ms)
BasePass                 4.3 ms  (bilo 5.2 ms, ustedeli 0.9 ms)
stat unit:
Frame:    16.1 ms  (62 FPS)
GPU:      15.2 ms

1.5 Finalni rezultat

Metrika Pre optimizacije Posle optimizacije Poboljsanje
Frame Time 40.0 ms 16.1 ms -59.8%
FPS 25 62 +148%
GPU Time 38.7 ms 15.2 ms -60.7%
Texture Memory 1420 MB 890 MB -37.3%
Lights (GPU) 12.4 ms 5.1 ms -58.9%
BasePass (GPU) 8.1 ms 4.3 ms -46.9%
PostProcessing 5.6 ms 3.6 ms -35.7%
Translucency 3.9 ms 1.2 ms -69.2%

Klijent je zadovoljan. Scena radi stabilno na 60+ FPS na 4K rezoluciji, sa minimalnim vizuelnim kompromisima. Vecina posetilaca ne bi uocila razliku izmedju optimizovane i neoptimizovane verzije, ali bi itekako osetila razliku u fluidnosti kretanja.

1.6 Kljucne lekcije iz Studije 1

  1. Overlapping lights su najcesci "tihi ubica" performansi u enterijerskim scenama. Uvek proveri koliko se svetala preklapa u datom prostoru.
  2. Transparentni materijali su skuplji nego sto izgledaju. Kad god mozes, zameni ih "laznim" pristupima (dithered opacity, opaque sa alpha clip).
  3. Post-processing je "besplatan" sve dok ne postane problem. Revidiraj svaki efekat i pitaj se: "Da li mi je ovo zaista potrebno?"
  4. Teksture vece od onoga sto ce se ikada videti su cisto bacanje resursa. Audit tekstura je brz i jeftin, a donosi znacajne ustede.

Studija Slucaja 2: Open World Landscape -- Beskrajne Ravnice

2.1 Opis scene i zahtevi

Drugi projekat je open world okruzenje za RPG igru. Scena predstavlja ogromno prirodno okruzenje sa razlicitim biomovima.

Karakteristike scene:

Zahtevi:

Parametar Zahtev
Rezolucija renderovanja 2560 x 1440 (1440p)
Ciljani frame rate 60 FPS (stabilan)
Streaming Bez primetnih hitches tokom kretanja
Memorija Max 6 GB VRAM, 12 GB RAM
Draw distance Minimum 4 km vidljivost
Platforma PC (RTX 3070 ili ekvivalent)

2.2 Pocetno stanje

Scena je zavrsena od strane art tima. Izgleda prelepo -- ali performanse su problematicne.

Pocetni stat unit rezultati:

Frame:    28.6 ms  (35 FPS)
Game:      3.2 ms
Draw:     11.4 ms
GPU:      26.8 ms
RHI:       5.1 ms

Pocetni stat gpu rezultati:

BasePass                10.2 ms
Shadows                  5.8 ms
Foliage                  4.1 ms
Landscape                3.2 ms
PostProcessing           2.1 ms
Translucency (water)     1.4 ms

Dodatni problemi:

2.3 Profilisanje

Ovaj scenario je slozeniji od prethodnog jer imamo mesovito usko grlo (mixed bottleneck). Pogledajmo:

Koristimo Unreal Insights (kao sto smo naucili u Poglavlju 39, Unreal Insights -- Napredna Dijagnostika) da dublje analiziramo:

GPU analiza:

  1. BasePass (10.2 ms): Landscape material sa 7 layer-a je izuzetno skup. Svaki piksel terena mora da evaluira svih 7 layer-a i blend-uje izmedju njih. Ovo je poznati problem koji smo opisali u Poglavlju 33 (Landscape i World Partition).

  2. Shadows (5.8 ms): Dinamicke senke od Directional Light-a sa Cascaded Shadow Maps pokrivaju ogromno podrucje. Far cascade renderuje senke za objekte udaljene i do 4 km.

  3. Foliage (4.1 ms): Pola miliona instanci foliage-a generise znacajan overdraw, pogotovo trava koja je renderovana kao alpha-masked billboard.

CPU analiza (Draw thread):

Koristimo stat SceneRendering:

Mesh Draw Calls:        18,420
Visible Static Meshes:  12,800
Visible Foliage:         8,900

18,420 draw call-ova! Kao sto smo naucili u Poglavlju 42 (Draw Call-ovi i Batching), svaki draw call ima CPU overhead, i iznad ~5,000-10,000 draw call-ova pocinjemo da vidimo CPU bottleneck na Draw thread-u.

Streaming analiza:

Koristimo stat Streaming i vidimo problem:

Texture Streaming Pool:     2048 MB / 1024 MB (OVER BUDGET!)
Pending Mip Requests:       342
Cancelled Requests:          87

Texture streaming pool je duplo manji od onoga sto scena zahteva. Engine neprekidno ucitava i izbacuje teksture, sto uzrokuje hitches. Ovo je klasican problem koji smo obradili u Poglavlju 24 (Teksture -- Formati, Streaming, i Memorija).

2.4 Optimizacija

Korak 1: Runtime Virtual Texture (RVT) za Landscape

Problem: 7-layer landscape material evaluira svaki layer za svaki piksel, sto je O(n) po broju layer-a.

Resenje:

Implementiramo Runtime Virtual Texture (RVT) sistem, detaljno opisan u Poglavlju 34 (Virtual Textures):

Kljucna prednost: jednom kada je tile renderovan u RVT cache, ne mora se ponovo racunati dok se ne promeni. Za vecinu frame-ova, landscape sampling je jednostavno citanje teksture.

Rezultat posle Koraka 1:

stat gpu:
Landscape                0.9 ms  (bilo 3.2 ms, ustedeli 2.3 ms)
BasePass                 7.8 ms  (bilo 10.2 ms, ustedeli 2.4 ms, jer landscape BasePass deo)
stat unit:
Frame:    24.1 ms  (41 FPS)
GPU:      22.3 ms

Korak 2: Foliage LOD, Cull Distance, i Overdraw

Problem: 500K foliage instanci generise 4.1 ms GPU cost i 8,900 draw call-ova.

Resenje:

Primenjujemo principe iz Poglavlja 31 (Foliage i Instanced Rendering) i Poglavlja 26 (Transparentnost i Overdraw):

Rezultat posle Koraka 2:

stat gpu:
Foliage                  1.4 ms  (bilo 4.1 ms, ustedeli 2.7 ms)

stat SceneRendering:
Visible Foliage:         3,200   (bilo 8,900, smanjeno za 64%)
Mesh Draw Calls:        12,700   (bilo 18,420, smanjeno za 31%)
stat unit:
Frame:    20.5 ms  (49 FPS)
Draw:      7.8 ms  (bilo 11.4 ms)
GPU:      18.9 ms

Korak 3: HLOD za distant areas

Problem: Udaljene oblasti (izvan 500 m) i dalje generisu mnogo draw call-ova za individualne objekte (stene, drvece, strukture).

Resenje:

Implementiramo Hierarchical Level of Detail (HLOD) sistem, detaljno opisan u Poglavlju 32 (HLOD i Proxy Geometry) i Poglavlju 33 (Landscape i World Partition):

Rezultat posle Koraka 3:

stat SceneRendering:
Mesh Draw Calls:         6,800   (bilo 12,700, smanjeno za 46%)
Visible Static Meshes:   4,100   (bilo 12,800, smanjeno za 68%)
stat unit:
Frame:    17.8 ms  (56 FPS)
Draw:      5.1 ms  (bilo 7.8 ms)
GPU:      16.2 ms

Korak 4: Async Loading i Streaming optimizacija

Problem: Streaming hitches od 80-120 ms se desavaju tokom kretanja.

Resenje:

Primenjujemo principe iz Poglavlja 35 (World Partition i Level Streaming) i Poglavlja 47 (Streaming -- Sve Sto Treba Da Znas):

Rezultat posle Koraka 4:

Streaming hitches:       < 2 ms  (bilo 80-120 ms)
Texture Pool Usage:      1280 MB / 1536 MB (u okviru budgeta)
RAM Usage:               10.8 GB (bilo 14.8 GB)
VRAM Usage:               5.4 GB (bilo 9.2 GB)
stat unit (worst case tokom kretanja):
Frame:    18.2 ms  (55 FPS worst case, obicno 56-58 FPS)

Korak 5: Nanite za stene i Shadow optimizacija

Problem: Stene imaju visok poly count sa tradicionalnim LOD-ovima koji nisu dovoljno dobri, i senke su skupe.

Resenje:

Primenjujemo principe iz Poglavlja 29 (Nanite -- Mikro-poligoni) i Poglavlja 43 (Optimizacija Osvetljenja):

Rezultat posle Koraka 5:

stat gpu:
Shadows                  2.1 ms  (bilo 5.8 ms, ustedeli 3.7 ms)
BasePass                 5.4 ms  (bilo 7.8 ms, zahvaljujuci Nanite)
stat unit:
Frame:    15.8 ms  (63 FPS)
GPU:      14.2 ms
Draw:      4.8 ms

2.5 Finalni rezultat

Metrika Pre optimizacije Posle optimizacije Poboljsanje
Frame Time 28.6 ms 15.8 ms -44.8%
FPS 35 63 +80%
GPU Time 26.8 ms 14.2 ms -47.0%
Draw Thread 11.4 ms 4.8 ms -57.9%
Draw Calls 18,420 6,800 -63.1%
VRAM 9.2 GB 5.4 GB -41.3%
RAM 14.8 GB 10.8 GB -27.0%
Streaming Hitches 80-120 ms < 2 ms ~eliminisano

2.6 Kljucne lekcije iz Studije 2

  1. Runtime Virtual Textures su nezamenjive za Landscape sa mnogo layer-a. Ako imas vise od 3-4 layer-a, RVT pristup ce znacajno poboljsati performanse.
  2. Foliage je najcesci izvor overdraw-a u open world scenama. Agresivni cull distance-i i LOD-ovi su obavezni.
  3. HLOD dramaticno smanjuje draw call-ove za distant content. World Partition HLOD pipeline je dizajniran bas za ovu svrhu -- koristi ga.
  4. Streaming hitches se resavaju prevencijom, ne reakcijom. Ucitavaj ranije, ucitavaj manje po frame-u, i predvidjaj gde ce igrac ici.
  5. Nanite je idealan za high-poly prirodne objekte poput stena, ali ne za sve -- foliage sa alpha masking-om i dalje zahteva tradicionalne pristupe.

Studija Slucaja 3: Urbana Scena -- Gusti Gradski Blok

3.1 Opis scene i zahtevi

Treci projekat je urbana scena za story-driven igru -- gusto naseljeni gradski blok sa zivotem na ulicama.

Karakteristike scene:

Zahtevi:

Parametar Zahtev
Rezolucija renderovanja 1920 x 1080 (1080p)
Ciljani frame rate 60 FPS
NPC-jevi 30+ vidljivih istovremeno
Vozila Simulacija saobracaja
Platforma PC (RTX 3060) i konzole (PS5/Xbox Series X)

3.2 Pocetno stanje

Art tim je zavrsio scenu i predao je za optimizaciju. Rezultati su zabrinjavajuci.

Pocetni stat unit rezultati:

Frame:    35.7 ms  (28 FPS)
Game:      6.8 ms
Draw:     14.2 ms
GPU:      22.4 ms
RHI:       7.6 ms

Pocetni stat gpu rezultati:

BasePass                 7.8 ms
Shadows                  6.2 ms
Lights                   3.4 ms
PostProcessing           2.1 ms
Translucency             1.3 ms
Reflections              1.1 ms
Velocity                 0.5 ms

Stat SceneRendering:

Mesh Draw Calls:        24,600
Visible Static Meshes:  16,200
Visible Skeletal Meshes:    40
Instanced Draw Calls:      890

3.3 Profilisanje

Ova scena ima visestruka uska grla -- cest slucaj u urbanim scenama:

CPU bottleneck -- Draw thread (14.2 ms):

Kao sto smo naucili u Poglavlju 42 (Draw Call-ovi i Batching), 24,600 draw call-ova je ogroman broj. Svaki mali prop (kanta, stub, znak) generise zasebni draw call. Problem nije u slozenosti pojedinacnog objekta, vec u ogromnom broju malih objekata.

Koristimo stat InitViews iz Poglavlja 38:

Frustum Cull:            2.8 ms
Process Visible:         4.1 ms
Init Dynamic Shadows:    3.6 ms

CPU trosi 3.6 ms samo na inicijalizaciju shadow setup-a za svaki objekat -- mnogi mali objekti generisu shadow maps.

GPU bottleneck -- Shadows (6.2 ms):

86 dinamickih svetala, od kojih mnoga bacaju senke. Svako svetlo sa senkama zahteva dodatni geometry pass za shadow map renderovanje. Kao sto smo detaljno objasnili u Poglavlju 22 (Osvetljenje i Senke), senke su najskuplji deo osvetljenja.

CPU bottleneck -- Game thread (6.8 ms):

Analiza pomocu stat Game:

Tick Time:               3.2 ms
AI Controller:           1.8 ms
Navigation:              0.9 ms
Physics:                 0.6 ms
Blueprint Tick:          0.3 ms

32 NPC-a sa AI kontrolerima i navigation tick-ovima doprinose Game thread opterecenju. Ovo smo obradili u Poglavlju 40 (CPU Optimizacija i Threading).

RHI overhead (7.6 ms):

RHI (Render Hardware Interface) thread je takodje visok. Ovo je direktna posledica velikog broja draw call-ova -- svaki draw call generise RHI komande koje moraju biti procesuirane.

3.4 Optimizacija

Korak 1: Nanite za zgrade

Problem: 28 zgrada sa visokim poly count-om generise veliki broj draw call-ova i teski BasePass.

Resenje:

Ovo je savrseni use case za Nanite (detaljno u Poglavlju 29):

Rezultat posle Koraka 1:

stat gpu:
BasePass                 3.2 ms  (bilo 7.8 ms, ustedeli 4.6 ms)

stat SceneRendering:
Mesh Draw Calls:        16,800   (bilo 24,600, smanjeno za 32%)
stat unit:
Frame:    28.4 ms  (35 FPS)
Draw:     10.8 ms  (bilo 14.2 ms)
GPU:      17.1 ms  (bilo 22.4 ms)

Korak 2: Instancing za ponovljene rekvizite

Problem: Hiljade malih props-ova generisu individualne draw call-ove. Mnogi od njih su identicni -- isti model kante, klupe, stuba.

Resenje:

Primenjujemo principe iz Poglavlja 31 (Foliage i Instanced Rendering) i Poglavlja 42 (Draw Call-ovi i Batching):

Rezultat posle Koraka 2:

stat SceneRendering:
Mesh Draw Calls:         5,400   (bilo 16,800, smanjeno za 68%)
Instanced Draw Calls:    2,100   (bilo 890, povecano jer vise koristimo instancing)
stat unit:
Frame:    22.6 ms  (44 FPS)
Draw:      6.2 ms  (bilo 10.8 ms, ustedeli 4.6 ms)
RHI:       3.8 ms  (bilo 7.6 ms, ustedeli 3.8 ms)
GPU:      16.4 ms

Ogromno poboljsanje na CPU strani! Draw thread je skoro prepolovljen, a RHI overhead je dramaticno smanjen.

Korak 3: Shadow optimizacija

Problem: 86 dinamickih svetala, mnoga sa senkama, generise 6.2 ms GPU shadow cost i 3.6 ms CPU shadow initialization cost.

Resenje:

Primenjujemo principe iz Poglavlja 43 (Optimizacija Osvetljenja) i Poglavlja 22 (Osvetljenje i Senke):

Rezultat posle Koraka 3:

stat gpu:
Shadows                  1.8 ms  (bilo 6.2 ms, ustedeli 4.4 ms)

stat InitViews:
Init Dynamic Shadows:    0.8 ms  (bilo 3.6 ms, ustedeli 2.8 ms)
stat unit:
Frame:    17.2 ms  (58 FPS)
GPU:      11.8 ms
Draw:      5.1 ms

Skoro smo na cilju!

Korak 4: NPC i Game thread optimizacija

Problem: 32 NPC-a sa AI kontrolerima trose 6.8 ms na Game thread-u.

Resenje:

Primenjujemo principe iz Poglavlja 40 (CPU Optimizacija i Threading) i Poglavlja 41 (Blueprint Optimizacija):

Rezultat posle Koraka 4:

stat Game:
Tick Time:               1.4 ms  (bilo 3.2 ms)
AI Controller:           0.6 ms  (bilo 1.8 ms)
Navigation:              0.2 ms  (bilo 0.9 ms)
stat unit:
Frame:    15.4 ms  (64 FPS)
Game:      3.1 ms  (bilo 6.8 ms)
Draw:      5.0 ms
GPU:      11.7 ms

Korak 5: Merge small actors i finalno ciscenje

Problem: Jos uvek imamo 5,400 draw call-ova. Mozemo bolje.

Resenje:

Poslednji korak cisci preostale probleme:

Rezultat posle Koraka 5:

stat SceneRendering:
Mesh Draw Calls:         3,800   (bilo 5,400)
stat unit:
Frame:    14.8 ms  (67 FPS)
Game:      3.0 ms
Draw:      4.2 ms
GPU:      11.2 ms

3.5 Finalni rezultat

Metrika Pre optimizacije Posle optimizacije Poboljsanje
Frame Time 35.7 ms 14.8 ms -58.5%
FPS 28 67 +139%
GPU Time 22.4 ms 11.2 ms -50.0%
Draw Thread 14.2 ms 4.2 ms -70.4%
Game Thread 6.8 ms 3.0 ms -55.9%
RHI Thread 7.6 ms 3.8 ms -50.0%
Draw Calls 24,600 3,800 -84.6%
Shadow Cost (GPU) 6.2 ms 1.8 ms -71.0%

3.6 Kljucne lekcije iz Studije 3

  1. Urbane scene su cesto CPU-bound pre nego GPU-bound zbog ogromnog broja malih objekata. Nemoj se fokusirati samo na GPU -- Draw thread je jednako vazan.
  2. Nanite je gamechanger za arhitektonsku geometriju. Zgrade, putevi, trotoari -- sve sto je staticno i neprozirno moze da koristi Nanite.
  3. Instancing je najjeftiniji nacin da smanjis draw call-ove kada imas mnogo kopija istog objekta. Uvek prvo trazi ponovljene objekte.
  4. Senke su luksuz koji treba selektivno dodeljivati. Vecina svetala u igri ne treba da baca senke. Samo kriticna svetla (sunce, glavno osvetljenje) zasluzuju pravu shadow map.
  5. NPC tick management je kriticna vestina. Ne smej svakom NPC-u dati full tick svaki frame -- koristi Significance Manager za pametnu alokaciju resursa.

Studija Slucaja 4: VR Projekat -- Virtuelni Muzej

4.1 Opis scene i zahtevi

Cetvrti i poslednji projekat je VR iskustvo -- virtuelna galerija/muzej sa interaktivnim eksponatima. Ovo je najzahtevniji scenario jer VR ima ekstremne zahteve za performanse.

Karakteristike scene:

VR-specificni zahtevi:

Parametar Zahtev
HMD Meta Quest 3 (standalone) + PC VR (PCVR sa Quest Link)
Rezolucija po oku 2064 x 2208 (Quest 3 native)
Ciljani frame rate 90 FPS po oku (efektivno 180 FPS za stereo rendering)
Latencija < 20 ms motion-to-photon
Komfor Bez frame drops-a (uzrokuju VR sickness)
Kvalitet Vizuelno impresivan ali stabilan

Zasto je VR toliko zahtevan:

Kao sto smo detaljno objasnili u Poglavlju 48 (VR i AR Optimizacija), VR ima nekoliko fundamentalnih razlika od obicnog renderovanja:

  1. Duplo renderovanje: Svaki frame se renderuje dva puta -- jednom za svako oko, sa malo razlicitom perspektivom
  2. Visoka rezolucija: Kombinovana rezolucija oba oka na Quest 3 je 4128 x 2208 piksela -- vise od 4K!
  3. 90 FPS minimum: Frame budget je samo 11.1 ms (1000 / 90). Za poredjenje, 60 FPS daje 16.67 ms -- imamo 33% manje vremena
  4. Nema frame skip-ovanja: U obicnoj igri, povremeni drop na 50 FPS je prihvatljiv. U VR-u, svaki propusten frame moze izazvati mucninu
  5. Latencija je kriticna: Svako kasnjenje izmedju pokreta glave i promene slike se oseca kao dezorijentacija

4.2 Pocetno stanje

Pocetni build scene sa Lumen osvetljenjem i standard rendering pipeline-om:

Pocetni stat unit rezultati (PC VR, Quest Link):

Frame:    22.2 ms  (45 FPS per eye)
Game:      1.8 ms
Draw:      4.6 ms
GPU:      21.4 ms
RHI:       3.2 ms

Pocetni stat gpu rezultati:

BasePass                 5.4 ms
Lumen GI                 4.8 ms
Lumen Reflections        3.2 ms
PostProcessing           3.1 ms
Shadows                  2.4 ms
Translucency             1.2 ms
StereoOverhead           1.3 ms

Sa 45 FPS po oku, daleko smo od 90 FPS cilja. Moramo skoro prepoloviti frame time sa 22.2 ms na 11.1 ms. Ovo je najagresivnija optimizacija u ovom poglavlju.

Dodatni problemi na Quest 3 standalone:

4.3 Profilisanje

GPU je dominantni bottleneck (21.4 ms).

Analiza po komponentama:

  1. Lumen GI (4.8 ms) + Lumen Reflections (3.2 ms) = 8.0 ms samo za Lumen! Ovo je 72% naseg celog frame budget-a (11.1 ms). Lumen je fenomenalan za flat-screen renderovanje, ali za VR na 90 FPS je preskup. Kao sto smo naglasili u Poglavlju 48 (VR Optimizacija), Lumen trenutno nije prakticno za VR projekte na vecini hardware-a.

  2. PostProcessing (3.1 ms): Screen space efekti su posebno skupi u VR-u jer se primenjuju na duplu rezoluciju. Mnogi od njih (Bloom, Lens Flare, Vignette) nisu ni potrebni u VR-u jer HMD vec ima sopstvene opticke karakteristike.

  3. BasePass (5.4 ms): Materijali sa visokom rezolucijom tekstura i kompleksnim shader-ima.

  4. Shadows (2.4 ms): Dinamicke senke za eksponate.

  5. Stereo Overhead (1.3 ms): Overhead od dupliranja render pipeline-a za oba oka.

4.4 Optimizacija

Korak 1: Prelazak na baked osvetljenje

Problem: Lumen trosi 8.0 ms -- vise od celog naseg frame budget-a.

Resenje:

Ovo je radikalna ali neophodna odluka. Primenjujemo principe iz Poglavlja 22 (Osvetljenje i Senke) i Poglavlja 48 (VR Optimizacija):

Rezultat posle Koraka 1:

stat gpu:
Lumen GI                 0.0 ms  (eliminisan!)
Lumen Reflections        0.0 ms  (eliminisan!)
Reflections              0.4 ms  (samo Reflection Capture lookup)
Shadows                  0.6 ms  (vecina staticna, baked)
stat unit:
Frame:    13.8 ms  (72 FPS per eye)
GPU:      12.6 ms

Ogromno poboljsanje! Ali jos nismo na cilju.

Korak 2: Prelazak na Forward Renderer sa MSAA

Problem: Default Deferred Renderer je dizajniran za scene sa mnogo dinamickih svetala. Nasa scena ima uglavnom baked osvetljenje, tako da Deferred Renderer ima nepotreban overhead.

Resenje:

Primenjujemo principe iz Poglavlja 21 (Rendering Pipeline -- Deferred vs Forward) i Poglavlja 48 (VR Optimizacija):

Rezultat posle Koraka 2:

stat gpu:
BasePass                 3.8 ms  (bilo 5.4 ms, usteda od Forward pipeline)
stat unit:
Frame:    12.4 ms  (80 FPS per eye)
GPU:      11.2 ms

Blizu smo! Ali trebaju nam jos ~1.3 ms da sigurno budemo ispod 11.1 ms sa marginom.

Korak 3: Agresivni LOD-ovi i redukcija post-processinga

Problem: Preostali GPU cost treba dodatno smanjiti.

Resenje:

Primenjujemo principe iz Poglavlja 30 (LOD -- Nivoi Detalja), Poglavlja 27 (Post-Processing Optimizacija) i Poglavlja 48 (VR Optimizacija):

Rezultat posle Koraka 3:

stat gpu:
PostProcessing           0.8 ms  (bilo 3.1 ms, ustedeli 2.3 ms)
BasePass                 3.1 ms  (bilo 3.8 ms, ustedeli 0.7 ms)
stat unit:
Frame:    10.2 ms  (98 FPS per eye)
GPU:       9.1 ms

Sada smo sigurno iznad 90 FPS sa solidnom marginom od ~1 ms.

Korak 4: Instanced Stereo Rendering i VR-specificne optimizacije

Problem: Zelimo jos vecu marginu i pripremiti osnovu za Quest 3 standalone.

Resenje:

Primenjujemo napredne VR-specificne tehnike iz Poglavlja 48 (VR Optimizacija):

Rezultat posle Koraka 4:

stat unit:
Frame:     8.8 ms  (113 FPS per eye)
GPU:       7.6 ms
Draw:      2.8 ms
StereoOverhead:          0.4 ms  (bilo 1.3 ms)

Korak 5: Quest 3 Standalone prilagodjavanja

Za Quest 3 standalone (bez PC-ja), potrebne su dodatne agresivne optimizacije:

Quest 3 Standalone rezultat:

Frame:    10.5 ms  (95 FPS per eye)
GPU:       9.2 ms
Memory:    2.8 GB  (Quest 3 ima ~4 GB dostupno)

4.5 Finalni rezultat (PCVR)

Metrika Pre optimizacije Posle optimizacije Poboljsanje
Frame Time 22.2 ms 8.8 ms -60.4%
FPS (per eye) 45 113 +151%
GPU Time 21.4 ms 7.6 ms -64.5%
Lumen Cost 8.0 ms 0.0 ms -100% (baked)
PostProcessing 3.1 ms 0.8 ms -74.2%
Stereo Overhead 1.3 ms 0.4 ms -69.2%
Rendering Method Deferred + Lumen Forward + MSAA + Baked --

4.6 Kljucne lekcije iz Studije 4

  1. Lumen i VR trenutno ne idu zajedno. To se moze promeniti u buducim verzijama UE5, ali za sada, baked lighting je jedini pouzdan pristup za 90 FPS VR.
  2. Forward Renderer je superioran za VR sa pretezno staticnim osvetljenjem. Manji bandwidth, cisci anti-aliasing sa MSAA, manje latencije.
  3. Vecina post-process efekata nema smisla u VR-u. Bloom, Lens Flare, Motion Blur, Film Grain -- sve ovo simulira kameru, a VR simulira oci. Ukloni ih bez zaljenja.
  4. Instanced Stereo Rendering je besplatno poboljsanje. Nema razloga da ga ne ukljucis u svakom VR projektu.
  5. Foveated Rendering je buducnost VR performansi. Sa eye-tracking-om, ova tehnika postaje jos mocnija jer se rezolucija dinamicki prilagodjava gde korisnik zaista gleda.
  6. VR zahteva drugaciji mindset. Svaki milisekund se broji. Nema kompromisa oko frame rate-a -- 90 FPS ili nista.

Uporedna Analiza -- Sta Smo Naucili Iz Cetiri Studije

Pogledajmo sva cetiri scenarija uporedo i izdvojimo zajednicke obrasce:

Zajednicki obrasci

Obrazac Studija 1 Studija 2 Studija 3 Studija 4
Profilisanje pre optimizacije Da Da Da Da
GPU kao primarni bottleneck Da Da (mesovit) Da (mesovit) Da
Lighting optimizacija Kljucna Vazna Kljucna Kljucna
Draw call redukcija Manja Velika Kljucna Umerena
LOD implementacija Da Da Da Da
Texture optimizacija Da Da Manja Da
Post-processing redukcija Da Manja Manja Kljucna

Univerzalna pravila

Iz svih cetiri studija slucaja, mozemo izvuci nekoliko univerzalnih pravila koja vaze za svaki UE5 projekat:

  1. Uvek profiliraj pre nego sto optimizujes. Bez merenja, ne znas gde je problem. Mozda potrosis dane optimizujuci GPU dok je tvoj pravi bottleneck na CPU-u.

  2. Optimizuj najveci problem prvo. Pogledaj stat unit i kreni od najviseg broja. Nema smisla ustedi 0.5 ms na post-processingu ako lighting trosi 12 ms.

  3. Osvetljenje je skoro uvek na vrhu liste. U tri od cetiri studije, optimizacija osvetljenja je bila najvazniji korak.

  4. Draw call-ovi su "tihi ubica" performansi. Jedan model sa 100K trokuta je jeftiniji od 100 modela sa po 1K trokuta (sa stanovista CPU-a). Instancing, merging i HLOD su tvoji prijatelji.

  5. Texture streaming je infrastruktura koja se cesto zanemaruje. Pravilno konfigurisan streaming pool i texture velicine mogu eliminisati hitches bez ikakvog vizuelnog kompromisa.

  6. LOD nije opcija -- obavezan je. Svaki mesh u projektu treba LOD-ove. Bez izuzetka. Cak i u archviz-u.

  7. Svaki piksel koji se renderuje a niko ga ne vidi je bacen posao. Culling, occlusion, hidden area masking -- sve ovo eliminise nevidljiv rad.


Tabela Kljucnih Pojmova

Pojam (engleski) Opis
Bottleneck Usko grlo -- najsporija komponenta sistema koja odredjuje ukupne performanse
GPU-bound Stanje u kome GPU ne moze dovoljno brzo da zavrsi renderovanje, limitirajuci FPS
CPU-bound Stanje u kome CPU (Game ili Draw thread) limitira FPS
Draw Call Komanda koja se salje GPU-u za renderovanje jednog objekta; svaki ima CPU overhead
Overdraw Pikseli koji se renderuju vise puta jer su prekriveni drugim pikselima
Instancing Tehnika renderovanja vise kopija istog mesh-a u jednom draw call-u
LOD (Level of Detail) Sistem koji prikazuje jednostavnije verzije modela na vecoj udaljenosti
HLOD (Hierarchical LOD) Sistem koji zamenjuje grupe objekata jednim proxy mesh-om na velikoj udaljenosti
Nanite UE5 sistem za virtualizovanu geometriju sa automatskim mikro-LOD-ovima
Lumen UE5 sistem za dinamicko globalno osvetljenje i refleksije u realnom vremenu
RVT (Runtime Virtual Texture) Sistem koji kesira rezultat kompleksnog materijala u virtualnu teksturu
VSM (Virtual Shadow Maps) UE5 shadow sistem koji dinamicki alocira shadow map prostor
Baked Lighting Prekalkulisano osvetljenje sacuvano u lightmap teksturama
Forward Rendering Rendering pipeline koji racuna osvetljenje direktno, bez G-Buffer-a
Deferred Rendering Rendering pipeline koji prvo renderuje geometriju u G-Buffer, pa onda racuna osvetljenje
MSAA (Multisample Anti-Aliasing) Hardware anti-aliasing tehnika dostupna u Forward rendering modu
TAA (Temporal Anti-Aliasing) Softverski anti-aliasing koji koristi informacije iz prethodnih frame-ova
ISR (Instanced Stereo Rendering) VR tehnika koja renderuje oba oka u jednom pass-u
FFR (Fixed Foveated Rendering) VR tehnika koja smanjuje rezoluciju na periferiji slike
Streaming Hitch Kratki zastoj u renderovanju uzrokovan ucitavanjem sadrzaja sa diska
Texture Streaming Pool Memorijski budget alociran za teksture koje se dinamicki ucitavaju/izbacuju
Cull Distance Maksimalna udaljenost na kojoj se objekat prikazuje pre nego sto se sakrije
Attenuation Radius Radijus uticaja svetla -- pikseli izvan ovog radijusa nisu pogodeni svetlom
Contact Shadows Jeftini screen-space efektat senke za male detalje bez pravih shadow map-ova
Significance Manager UE5 sistem za prioritizaciju tick-ova objekata na osnovu vaznosti/udaljenosti
Reflection Capture Staticki cubemap koji simulira refleksije u odredjenoj oblasti
G-Buffer Skup tekstura u Deferred Rendering-u koji cuva geometrijske i materijalne podatke
Lightmap Tekstura koja cuva prekalkulisano osvetljenje za staticki mesh
Merge Actors UE5 alat za kombinovanje vise statickih mesh-ova u jedan
Occlusion Culling Sistem koji detektuje i preskace renderovanje objekata skrivenih iza drugih objekata
Frame Budget Maksimalno vreme (u milisekundama) dozvoljeno za renderovanje jednog frame-a

Zavrsne Misli -- Optimizacija Kao Neprekidni Proces

Dosao si do samog kraja ove knjige. Pedeset poglavlja, stotine strana, bezbroj tehnickih detalja. Ali zelim da te ostavim sa najvaznijom lekcijom od svih:

Optimizacija nije jednokratan dogadjaj. To je proces.

Svaki put kada dodas novi sadrzaj u scenu, svaki put kada promenis materijal, svaki put kada ukljucis novi efekat -- performanse se menjaju. Projekat koji danas radi na 60 FPS moze sutra raditi na 45 FPS jer je neko dodao "samo jednu malu stvar".

Zato je vazno uspostaviti kulturu performansi u svom timu:

  1. Redovno profiliraj. Nemoj cekati kraj projekta. Profiliaj svake nedelje, idealno svaki dan. Koristis stat unit kao sto koristis rucni sat -- cesto i bez razmisljanja.

  2. Postavi budgete rano. Pre nego sto pocnes sa razvojem, odluci: koliki je frame budget? Koliko draw call-ova mozemo imati? Kolika je maksimalna tekstura? Ovi budgeti su temelj svih odluka.

  3. Automatizuj testiranje performansi. Napravi automated performance test koji prolazi kroz kljucne delove scene i belezi FPS, frame time, memoriju. Pokreci ga kao deo CI/CD pipeline-a.

  4. Nemoj optimizovati prerano -- ali ne cekaj ni prekasno. "Premature optimization is the root of all evil" (Donald Knuth) je tacno, ali isto tako je tacno da optimizacija na kraju projekta kosta 10x vise nego optimizacija tokom razvoja. Pravi balans je u redovnom prasjenju i ranim korekcijama.

  5. Uci iz svake studije slucaja. Svaki projekat je drugaciji, ali obrasci se ponavljaju. Sto vise scenarija vidis, sto vise problema resis, bices brzi i precizniji u identifikaciji i resavanju performansnih problema.

  6. Prati razvoj UE5. Epic Games konstantno poboljsava engine. Nanite danas ne podrzava transparentne materijale -- mozda ce sutra. Lumen danas ne moze 90 FPS za VR -- mozda ce sledeca verzija moci. Budi u toku sa novostima.

Ako si prosao sve sto ova knjiga nudi -- od osnova renderovanje pipeline-a, preko profilisanja i dijagnostike, do naprednih tehnika optimizacije -- onda imas alate da se nosis sa bilo kojim performansnim izazovom u Unreal Engine 5.

Srecno kodiranje, i neka tvoji frame-ovi budu brzi od svetlosti.


Korisni Linkovi i Dalje Citanje

Zvanicna Dokumentacija

Epic Games Learning Resources

Community Resources

Preporucene Knjige

Alati za Profilisanje (van UE5)


Ovo je bilo poslednje poglavlje knjige "Unreal Engine 5: Od Nule do Heroja". Hvala ti sto si bio sa nama na ovom putovanju. Sada idi i napravi nesto neverovatno.