Optimalizace výkonu
Optimalizace výkonu herních aplikací je disciplína na pomezí programování, grafiky, datového inženýrství a designu. Cílem je udržet stabilní frame time v definovaném rozpočtu (např. 16,67 ms pro 60 FPS, 8,33 ms pro 120 FPS, 11,11 ms pro VR 90 Hz) při co nejvyšší vizuální kvalitě a škálovatelnosti napříč platformami. Tento článek shrnuje metodiku profilování, klíčové bottlenecky (CPU, GPU, paměť, I/O), optimalizační vzory a platformní specifika (PC, konzole, mobil, VR).
Metodika: měř, izoluj, iteruj
- Definuj cílové FPS a rozpočet snímku: stanov dílčí rozpočty (rendering, fyzika, AI, skripty, síť, I/O) a sleduj je v CI.
- Profiluj cíleně: nejprve high-level (CPU/GPU frametime, hroty/hitching), poté drill-down (draw calls, cache missy, stall typy).
- Reprodukuj hrot: deterministické záznamy (replay capture), zamknutí seedů, stejné trasy kamery.
- Optimalizuj podle dat: vyhýbej se micro-optimalizacím bez dopadu na rozpočet snímku.
Nástroje profilace a inspekce
- CPU: VTune, Tracy, Perfetto, Unreal Insights, Unity Profiler/Deep Profiler, Xcode Instruments, Windows Performance Analyzer.
- GPU: RenderDoc (frame graph, overdraw), NVIDIA Nsight Graphics/Systems, AMD Radeon GPU Profiler/RGA, PIX for Windows/Xbox, Xcode GPU Frame Capture.
- Paměť a I/O: platformní heap trackery, AddressSanitizer, Unreal MemReport, Unity Memory Profiler, OS I/O trace.
- Síť: Wireshark, netstat/ss, engine-specific replication profilers.
Diagnostika: CPU-bound vs. GPU-bound
- CPU-bound: vysoký CPU frame time (game thread/render thread), nízké GPU využití. Příčiny: vysoký počet draw callů, AI, skripty, fyzika, alokace, synchronizace.
- GPU-bound: GPU frame time > cílový rozpočet, CPU čeká (Present/Flush). Příčiny: fill-rate/overdraw, těžké shadery, post-procesy, stíny, MSAA, vysoké rozlišení.
- Hitching: krátké hroty způsobené I/O, kompilací shaderů, GC, tvorbou PSO, asset streamingem.
Renderovací pipeline a rozpočty
| Úloha | Cíl 60 FPS | Cíl 120 FPS | Poznámky |
|---|---|---|---|
| Geometrie (visibility, culling) | 2–4 ms | 1–2 ms | Frustum/occlusion culling, LOD, instancing |
| Stíny + světla | 2–3 ms | 1–1,5 ms | Stínové mapy, tiled/clustered lighting |
| G-Buffer/Forward pass | 3–5 ms | 1,5–3 ms | Minimalizuj overdraw, optimalizuj shadery |
| Post-process | 1–2 ms | 0,5–1 ms | Bloom, TAA, DOF, SSR s rozumnými nastaveními |
| UI/HUD | 0,3–0,7 ms | 0,2–0,5 ms | Batching, omezení průhlednosti |
Geometrie: culling, LOD a draw calls
- Instancing a batching: slučuj identické materiály/mesh; sniž draw calls a state změny.
- Level of Detail (LOD): generuj automaticky (mesh decimation) + ručně pro klíčové modely; přepínej dle obrazové velikosti, ne vzdálenosti.
- Occlusion culling: kombinuj hi-z occlusion, portály v interiérech, precomputed visibility pro statické scény.
- Front-to-back render: lepší early-z; minimalizuj alfa test/průhlednost (dražší overdraw).
Shadery a materiály
- Redukuj větvení: preferuj varianty/makra/specialization constants před dynamickým if uvnitř hot path.
- Textury: používej MIP mapy, komprese (BC/ASTC/ETC), správné filtry; kontroluj anisotropii.
- PSO/Shader warm-up: prekompiluj a cachuj pipeline states; vyhni se kompilaci během gameplay (hitching).
- Post-process: slučuj průchody, render v menším rozlišení (quarter/half res) pro DOF/SSR/Bloom.
Data-oriented design (DOD) a ECS
- Cache-friendliness: přeuspořádej data do struktur polí (SoA) pro sekvenční přístup; minimalizuj pointer chasing.
- Entity Component System (ECS): zpracovávej komponenty v hustých blocích, job-friendly iterace bez virtuálních volání.
- Alokace: vlastní allocatory, frame/arena/pool; vyhni se alokacím v horkých smyčkách.
Multithreading a job systémy
- Task graph: rozbij práci na malé úseky (0,1–0,5 ms), deklaruj závislosti, využij všechna jádra.
- Render thread vs. game thread: minimalizuj synchronizační bariéry; double/triple buffering datových struktur.
- Async compute: přesun výpočtů (particles, occlusion, post-fx) na asynchronní fronty, pokud to GPU a API umožní.
Fyzika, animace a AI
- Fyzika: broad-phase (BVH/Uniform Grid) je klíčová; omez rigidbody u dekorací, používej sleeping a sub-stepping jen pro kritické interakce.
- Animace: kompresuj klíče, GPU skinning, LOD animací (méně kostí, nižší frekvence update mimo obraz).
- AI: limituj tick frekvence, think budget, LOD chování, batche pathfindingu a cachování navmesh dotazů.
Paměť, GC a fragmentace
- Layout: separuj dlouhožijící a krátkožijící objekty; arény per subsystém, aby se snížila fragmentace.
- GC (managed enginy): vyhni se alokacím v Update/Render; použití structs/pools, Span/NativeArray, explicitní GC jen v safe okamžicích.
- Diagnostika: sleduj heap špičky, leak checkery, snapshot diffs; omez velikost textur/meshů podle cílové platformy.
Asset pipeline a streaming
- Kompresní formáty: textury (BC/ASTC/ETC), meše (meshopt/Draco), audio (ADPCM/Opus podle platformy).
- MIP streaming: streamuj dle vzdálenosti/obrazové velikosti; přednačítej MIPy pro LOD0 objektů blízko kamery.
- IO optimalizace: velké sekvenční čtení > malé náhodné; align bloky na hranice stránkování; asynchronní dekomprese na job vlákně.
Řízení rozlišení a kvality
- Dynamic Resolution Scaling (DRS): měň render target scale dle GPU vytížení, uchovej stabilní frame time.
- Upscalery: TAAU/FSR/DLSS/XESS – vyvaž kvalitu a výkon, dbej na stabilitu pohybu (jitter management).
- Scalability tiers: předdefinuj profily (Low/Medium/High/Ultra) s jasným vlivem na rozpočet.
Frame pacing a synchronizace
- VSync a buffering: double/triple buffering, minimalizuj present wait; preferuj „low-latency“ režimy, pokud je rozpočet stabilní.
- Fixní časové kroky: game-logic v fixním tiku (např. 60 Hz), rendering variabilně; extrapoluj/interpoluj pro hladkost.
- Hitch root-cause: PSO compilation, shader disk cache, streaming – warm-up obrazovky, prefetch kritických zdrojů.
UI a overdraw
- Batching UI: slučuj draw cásti, minimalizuj změny materiálu/fontu; používej atlasované fonty a sprite sheets.
- Průhlednost: renderuj UI poslední, vyhni se plným obrazovkám s alfa; klipuj mimo obraz.
Multiplayer: síť a replikační náklady
- Tickrate: optimalizuj 30–60 Hz server tick podle žánru; klientská interpolace/extrapolace minimalizuje jitter.
- State delta a prioritizace: posílej změny, ne plné stavy; cíl-based prioritizace (blízkost kamery, relevance).
- Bandwith/CPU trade-off: komprese a agregace paketů vs. CPU náklady; pipeline v job systému mimo hlavní vlákno.
VR a AR specifika
- Rozpočet: 72–120 Hz (13,9–8,3 ms); dvouoké renderování nebo single-pass instancing.
- Timewarp/Spacewarp: stabilizuj latenci, vyhýbej se hitchům; predikce pohybu hlavy je citlivá na jitter.
- Foveated rendering: fixed/eye-tracked; šetří fill-rate na mobilních headsetech.
Mobilní platformy
- Tepelné limity: plánuj rozpočty pro sustained výkon, ne jen krátkodobý; sleduj thermal throttling.
- Tile-based deferred renderers: minimalizuj zbytečné změny render targetů, používej discard/load/store optimalizace.
- Paměť: agresivní komprese textur (ASTC), minimalizace shader variant, menší render targety (HDR jen kde nutné).
Konzole a PC
- PSO cache: buduj a distribuuj PSO databázi; zákaz kompilace za běhu.
- Async IO: nové generace (NVMe + DMA) – připrav streamovací rozhraní s velkými bloky a grafem závislostí.
- PC variabilita: benchmark profily, automatický výběr kvality, robustní heuristika DRS a limit CPU vláken.
Kontinuální výkonnostní testy
- Perf CI: automatické boty spouští definované trasy kamer, porovnávají frametimes, draw calls, VRAM/CPU RAM, hitch count.
- Regresní práh: PR nesmí zhoršit metriky nad toleranci; ukládej profily snímků pro porovnání.
- Telemetrie v terénu: anonymní RUM: FPS percentily, teploty, hw mix; řiď škálování podle reality.
Checklist rychlých výher
- Sniž počet materiálů a draw callů (instancing, atlasy).
- Zapni MIPy a korektní filtrování, oprav mip streaming holes.
- Zakaž runtime kompilaci shaderů; PSO warm-up při loadingu.
- Optimalizuj transparentní vrstvy a post-process (half-res, combine passes).
- Přesuň náročné subsystémy do jobů (particles, occlusion, culling).
- Uprav LOD vzdálenosti podle obrazové velikosti, ne linear distance.
- Zamez alokacím na frame path; používaj pooly a arény.
- Zaveď DRS + moderní upscaler pro stabilní frame pacing.
Tabulka: běžné symptomy a nápravy
| Symptom | Pravděpodobná příčina | Doporučený postup |
|---|---|---|
| GPU frametime > rozpočet v interiérech | Přehnaný overdraw, hlasité post-fx | Optimalizuj transparentní materiály, half-res post-fx, depth pre-pass |
| CPU hroty při pohybu | Asset streaming, alokace, PSO | Prefetch, PSO cache, arena alloc, IO batched async |
| Nestabilní FPS při množství NPC | AI tick bez rozpočtu, pathfinding burst | LOD AI, tick budget, batch path queries, navmesh cache |
| Rozmazaná kvalita s upscalerem | Špatný jitter, nevhodný sharpening | Stabilizuj TAA, korektní motion vectors, jemný sharpening |
| VR nausea | Jitter/hitching, vysoká latence | Lock framerate, přednost stabilitě, agresivní DRS, přednačtení zdrojů |
Proces optimalizace krok za krokem
- Stanov cílové FPS a rozpočty dílčích subsystémů.
- Sestav deterministický test (replay) a baseline metriky.
- Identifikuj největší bottleneck (CPU/GPU) a jeho příčinu.
- Aplikuj změnu s nejvyšším dopadem/nejnižší cenou, změř rozdíl.
- Uzamkni zisk (CI perf test), pokračuj k dalšímu bottlenecku.
- Pravidelně audituj shader varianty, LODy, asset budgety a PSO cache.
Souhrn
Výkon her není jednorázový cíl, ale soustavný proces řízený daty. Kombinací disciplinovaného profilování, data-oriented návrhu, rozumné práce s GPU (culling, LOD, shadery, PSO), stabilního frame pacingu a robustního asset streamingu lze dosáhnout hladkého chodu napříč hardwarem. Integrací výkonnostních testů do CI a jasných rozpočtů pro každý subsystém udržíte výkon pod kontrolou po celou dobu vývoje i po vydání.