Principy výkonu pro hybridní realitu

Tento článek je úvodem k pochopení významu výkonu vaší Mixed Reality aplikace. Pokud vaše aplikace neběží s optimální obnovovací frekvencí, může se výrazně snížit uživatelské prostředí. Hologramy se budou zdát nestabilní a sledování hlavy prostředí bude nepřesné, což uživatele může vést k horšímu prostředí. Výkon musí být považován za prvotřídní funkci pro vývoj pro hybridní realitu, a ne za dokonalou úlohu.

Hodnoty výkonné snímkové frekvence pro každou cílovou platformu jsou uvedené níže.

Platforma Cílová frekvence snímků
HoloLens 60 SNÍMKŮ ZA SEKUNDU
Windows Mixed Reality Ultra počítačů 90 SNÍMKŮ ZA SEKUNDU
Windows Mixed Reality počítačů 60 SNÍMKŮ ZA SEKUNDU

Níže uvedená architektura popisuje osvědčené postupy pro dosažení cílových snímkových frekvencí. Tipy k měření a vylepšení snímkové frekvence v prostředí Unity doporučujeme přečíst si článek s doporučeními k výkonu pro Unity.

Vysvětlení kritických bodů výkonu

Pokud má vaše aplikace podvýkonnou snímkovou frekvenci, prvním krokem je analyzovat a pochopit, kde je vaše aplikace výpočetně náročná. Za vykreslení scény zodpovídají dva primární procesory: procesor a GPU, z nichž každý zpracovává různé aspekty Mixed Reality aplikace. Kritické body mohou nastat ve třech klíčových bodech:

  1. Vlákno aplikace – procesor – zodpovídá za logiku aplikace, včetně zpracování vstupu, animací, fyziky a další logiky aplikace.
  2. Vlákno vykreslování – PROCESOR na GPU – zodpovídá za odesílání volání draw do GPU. Když vaše aplikace chce vykreslit objekt, jako je datová krychle nebo model, odešle toto vlákno požadavek na gpu k provádění operací.
  3. GPU – nejčastěji zpracovává grafický kanál vaší aplikace a transformuje 3D data (modely, textury atd.) na pixely. Nakonec vytvoří 2D obrázek, který se odešle na obrazovku vašeho zařízení.

Životnost rámce

Obecně platí, že aplikace HoloLens budou vázané na GPU, ale ne vždy. Pomocí níže uvedených nástrojů a technik zjistěte, kde je vaše konkrétní aplikace kritická.

Jak analyzovat aplikaci

Existuje mnoho nástrojů, které vám umožní porozumět profilu výkonu a potenciálním kritickým bodům aplikace hybridní reality.

Níže najdete některé běžné nástroje, které vám pomůžou shromáždit podrobné informace o profilaci vaší aplikace:

Jak profilovat v libovolném prostředí

Jedním ze způsobů, jak zjistit, jestli je vaše aplikace svázaná s GPU nebo procesorem, je snížit rozlišení cílového výstupu vykreslení. Snížením počtu pixelů, které se mají vypočítat, snížíte zatížení GPU. Zařízení se vykreslí na menší texturu a pak vzorek up-sample pro zobrazení konečného obrázku.

Po snížení rozlišení vykreslování, pokud:

  1. Zvýšení snímkové frekvence aplikace, pak jste pravděpodobně vázaní na GPU
  2. Snímková frekvence aplikace beze změny, pak jste pravděpodobně vázáni na procesor

Poznámka

Unity poskytuje možnost snadno upravit cílové rozlišení vykreslení vaší aplikace za běhu prostřednictvím XRSettings.renderViewportScale vlastnost. Konečný obrázek prezentovaný na zařízení má pevné rozlišení. Platforma bude vzorkovat výstup s nižším rozlišením a sestavit obrázek s vyšším rozlišením pro vykreslování na displejích.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

Jak vylepšit aplikaci

Doporučení k výkonu procesoru

Obecně platí, že většina práce v aplikaci hybridní reality na procesoru zahrnuje "simulaci" scény a zpracování aplikační logiky. Optimalizace se zaměřuje na následující oblasti:

  • Animace
  • Fyzika
  • Přidělení paměti
  • Složité algoritmy (tj. inverzní kinematice, hledání cest)

Doporučení k výkonu GPU

Vysvětlení šířky pásma vs. rychlosti vyplňování

Při vykreslování snímku na GPU je aplikace vázána šířkou pásma paměti nebo rychlostí vyplnění.

  • Šířka pásma paměti je rychlost čtení a zápisů, které GPU může provádět z paměti.
    • Pokud chcete zjistit omezení šířky pásma, snižte kvalitu textury a zkontrolujte, jestli se zlepšila snímková frekvence.
    • Pokud chcete zjistit omezení rychlosti vyplňování, snižte rozlišení obrazovky a zjistěte, jestli se zvýší snímková frekvence.

Poznámka

Pokud pracujete s Unity, projděte si naše doporučení k výkonu GPU specifická pro Unity. – V Unity použijte vlastnost XRSettings.renderViewportScale .

Šířka pásma paměti obecně zahrnuje optimalizaci pro:

  1. Nižší rozlišení textury
  2. Používejte méně textur (normální, specular atd.)

Míra vyplnění se zaměřuje na snížení počtu operací, které je potřeba vypočítat pro konečný vykreslovaný pixel, včetně:

  1. Počet objektů, které se mají vykreslit/zpracovat
  2. Počet operací na shader
  3. Počet fází GPU do konečného výsledku (shadery geometrie, efekty následného zpracování atd.)
  4. Počet pixelů, které se mají vykreslit (rozlišení obrazovky)

Snížení počtu mnohoúhelníku

Vyšší počet mnohoúhelníku má za následek více operací pro GPU, takže snížením počtu mnohoúhelníků ve scéně se zkrátí doba vykreslování. Existují i další faktory, kvůli kterým je stínování geometrie nákladné, ale nejjednodušší metrika, která určuje, kolik práce bude trvat vykreslení scény, je počet mnohoúhelníku.

Limit překreslení

K vysokému překreslení dochází, když je vykresleno více objektů, ale nezobrazují se na obrazovce, protože jsou skryté objektem occluding. Představte si, že se díváte na zeď, za kterou jsou objekty. Celá geometrie by se zpracovala pro vykreslení, ale musí se vykreslit pouze neprůsledná stěna, což má za následek zbytečné operace.

Shadery

Shadery jsou malé programy, které běží na GPU a dělají dva důležité kroky při vykreslování:

  1. Určení, které vrcholy by se měly nakreslit a kde se nacházejí v prostoru obrazovky (shader vrcholů)
    • Shader vrcholů se spouští pro každý vrchol pro každou síť.
  2. Určení barvy každého pixelu (shader pixelu)
    • Pixel shader se spouští na pixel a vykreslí se geometrií na cílovou texturu vykreslení.

Shadery obvykle dělají mnoho transformací a výpočtů osvětlení. I když komplexní modely osvětlení, stíny a další operace mohou generovat fantastické výsledky, mají také cenu. Snížení počtu operací vypočítaných ve shaderech může výrazně snížit množství práce potřebné pro GPU na každém snímku.

Doporučení pro kódování shaderu
  • Používejte bilineární filtrování, kdykoli je to možné.
  • Změna uspořádání výrazů tak, aby používaly vnitřní funkce MAD k násobení a sčítání současně
  • Co nejvíce přepočítat na procesoru a předávat jako konstanty do materiálu
  • Upřednostnění operací přesunu z shaderu pixelů do shaderu vrcholů
    • Obecně platí, že počet vrcholů je mnohem menší než počet pixelů (720p je 921 600 pixelů, 1080p je 2 073 600 pixelů atd.).

Odebrání fází GPU

Následné zpracování může být nákladné a zvýšit míru vyplňování vaší aplikace, včetně technik ochrany před aliasy, jako je MSAA. Na HoloLensu doporučujeme vyhnout se těmto technikám a dalším fázím shaderu, jako je geometrie, trup a výpočetní shadery.

Doporučení k paměti

Nadměrné přidělení paměti a operace zrušení přidělení paměti můžou mít za následek nekonzistentní výkon, zablokování rámců a další škodlivé chování. Při vývoji v Unity je obzvláště důležité porozumět aspektům paměti, protože správu paměti řídí systém uvolňování paměti.

Sdružování objektů

Sdružování objektů je oblíbená technika, která snižuje náklady na průběžné přidělování a rušení přidělení objektů. To se provádí přidělením velkého fondu identických objektů a opětovným použitím neaktivních dostupných instancí z tohoto fondu místo neustálého vytváření a ničení objektů v průběhu času. Fondy objektů jsou skvělé pro opakovaně použitelné komponenty, které mají proměnlivou životnost během aplikace.

Viz také