Optimalizace herního výkonu

Optimalizace herního výkonu

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

  1. 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.
  2. Profiluj cíleně: nejprve high-level (CPU/GPU frametime, hroty/hitching), poté drill-down (draw calls, cache missy, stall typy).
  3. Reprodukuj hrot: deterministické záznamy (replay capture), zamknutí seedů, stejné trasy kamery.
  4. 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

  1. Stanov cílové FPS a rozpočty dílčích subsystémů.
  2. Sestav deterministický test (replay) a baseline metriky.
  3. Identifikuj největší bottleneck (CPU/GPU) a jeho příčinu.
  4. Aplikuj změnu s nejvyšším dopadem/nejnižší cenou, změř rozdíl.
  5. Uzamkni zisk (CI perf test), pokračuj k dalšímu bottlenecku.
  6. 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í.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *