Výkon – MRTK2

Začínáme

Nejjednodušší způsob, jak racionalizovat výkon, je snímková frekvence nebo kolikrát může aplikace vykreslit obrázek za sekundu. Je důležité splnit cílovou framerate, jak je uvedeno v cílové platformě (tj. Windows Mixed Reality, Oculus atd.). Například u HoloLensu je cílová snímková rychlost 60 SNÍMKŮ za sekundu. Aplikace s nízkou snímkovou frekvencí můžou mít za následek zhoršení uživatelského prostředí, jako je zhoršená stabilizace hologramu, sledování světa, sledování rukou a další. Aby vývojáři mohli sledovat a dosahovat kvalitní snímkové frekvence, poskytuje sada Mixed Reality Toolkit celou řadu nástrojů a skriptů.

Vizuální profiler

Pokud chcete nepřetržitě sledovat výkon po celou dobu vývoje, důrazně doporučujeme při spouštění & ladění aplikace vždy zobrazovat vizuál snímkové frekvence. sada Mixed Reality Toolkit poskytuje diagnostický nástroj Visual Profiler, který v reálném čase poskytuje informace o aktuálním využití fps a paměti v zobrazení aplikace. Vizuální profiler je možné nakonfigurovat prostřednictvím nastavení diagnostického systému v inspektoru profilů MRTK.

Kromě toho je obzvláště důležité používat Visual Profiler ke sledování snímkové frekvence při spuštění na zařízení namísto spuštění v editoru Unity nebo emulátoru. Nejpřesnější výsledky výkonu se zobrazí při spuštění na zařízení s buildy konfigurace vydaných verzí.

Poznámka

Pokud vytváříte pro Windows Mixed Reality, nasaďte je pomocí sestavení konfigurace MASTER.

Visual Profiler – rozhraní

Okno Optimalizace

Optimalizující okno MRTK nabízí informační a automatizační nástroje, které vývojářům hybridní reality pomůžou nastavit prostředí pro nejlepší výsledky a identifikovat potenciální kritické body ve scéně & prostředky. Některé klíčové konfigurace v Unity můžou pomoct zajistit podstatně optimalizovanější výsledky pro projekty hybridní reality.

Obecně platí, že tato nastavení zahrnují konfigurace vykreslování, které jsou ideální pro hybridní realitu. Aplikace hybridní reality jsou ve srovnání s tradičním vývojem 3D grafiky jedinečné v tom, že existují dvě obrazovky (tj. dvě oči) pro vykreslení celé scény.

Doporučená nastavení uvedená níže se dají automaticky nakonfigurovat v projektu Unity pomocí okna optimalizace MRTK.

Nastavení okna optimalizace MRTK

Unity Profiler

Unity Profiler je užitečný nástroj pro zkoumání podrobností o výkonu aplikace na úrovni jednotlivých snímků.

Čas strávený procesorem

Příklad grafu Profileru Unity

Aby se zachovaly pohodlné snímkové frekvence (obvykle 60 snímků za sekundu), musí aplikace dosáhnout maximální doby trvání procesoru 16,6 milisekund. Microsoft Mixed Reality Toolkit obsahuje značky pro cesty kódu vnitřní smyčky (na jednotlivé snímky), které pomáhají identifikovat náklady na funkce MRTK. Tyto značky používají následující formát, který vám pomůže pochopit konkrétní funkce, které se používají:

[MRTK] className.methodName

Poznámka

Za názvem metody můžou být další data. Používá se k identifikaci podmíněně spuštěných, potenciálně nákladných funkcí, kterým se lze vyhnout malými změnami kódu aplikace.

Příklad hierarchie Profileru Unity

V tomto příkladu byla hierarchie rozšířena tak, aby ukázala, že metoda UpdateHandData třídy WindowsMixedRealityArticulatedHand spotřebovává 0,44 ms času procesoru během analyzovaného rámce. Tato data můžou pomoct určit, jestli problém s výkonem souvisí s kódem aplikace nebo odjinud v systému.

Důrazně doporučujeme, aby vývojáři instrumentoval kód aplikace podobným způsobem. Primární oblasti zaměření instrumentace kódu aplikace jsou v rámci obslužných rutin událostí, protože tyto metody se účtují do smyčky aktualizace MRTK při vyvolání událostí. Vysoké časové intervaly v rámci aktualizační smyčky MRTK můžou značit nákladný kód v metodách obslužné rutiny událostí.

vykreslování Single-Pass instance

Výchozí konfigurace vykreslování pro XR v Unity je Multi-pass. Toto nastavení dává Unity pokyn, aby spustila celý kanál vykreslování dvakrát, jednou pro každé oko. To můžete optimalizovat tak, že místo toho vyberete vykreslování instance s jedním průchodem . Tato konfigurace využívá cílových polí vykreslení k tomu, aby bylo možné provést jedno volání kreslení, které provede instance do příslušného cíle vykreslení pro každé oko. Tento režim navíc umožňuje provádět veškeré vykreslování v jediném spuštění vykreslovacího kanálu. Proto výběr vykreslování s jednou průchodnou instancí jako cesty vykreslování pro aplikaci hybridní reality může ušetřit značné množství času na procesoru & GPU a je doporučenou konfigurací vykreslování.

Aby však bylo možné vydat jedno volání kreslení pro každou síť na každé oko, musí být instance GPU podporována všemi shadery. Instanceng umožňuje GPU multiplex kreslit volání přes obě oči. Integrované shadery Unity a standardní shader MRTK ve výchozím nastavení obsahují v kódu shaderu nezbytné pokyny pro instanci. Při psaní vlastních shaderů pro Unity může být potřeba tyto shadery aktualizovat, aby podporovaly vykreslování instance s jedním průchodem.

Příklad kódu pro vlastní shader

struct appdata
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;

    UNITY_VERTEX_INPUT_INSTANCE_ID //Insert
};

struct v2f
{
    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;

    UNITY_VERTEX_OUTPUT_STEREO //Insert
};

v2f vert (appdata v)
{
    v2f o;

    UNITY_SETUP_INSTANCE_ID(v); //Insert
    UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert

    o.vertex = UnityObjectToClipPos(v.vertex);

    o.uv = v.uv;

    return o;
}

Nastavení kvality

Unity poskytuje předvolby pro řízení kvality vykreslování pro každý koncový bod platformy. Tyto předvolby určují, jaké grafické funkce je možné povolit, jako jsou stíny, anti aliasing, globální osvětlení a další. Doporučuje se snížit tato nastavení a optimalizovat počet výpočtů provedených během vykreslování.

Krok 1: Aktualizace projektů Unity hybridní reality tak, aby používaly nastavení Úrovně nízké kvality
Upravit>Nastavení projektu a pak vyberte kategorii >Kvalita Vyberte nízkou kvalitu pro platformu UPW.

Krok 2: Pro každý soubor scény Unity zakažte globální osvětlení v reálném čase.
Okno>Vykreslování>Nastavení> osvětleníZrušte zaškrtnutí políčka Globální osvětlení v reálném čase.

Sdílení hloubkové vyrovnávací paměti (HoloLens)

Při vývoji pro Windows Mixed Reality platformu a zejména HoloLens může se stabilizací hologramu pomoct povolení sdílení hloubkové vyrovnávací paměti v nastavení XR. Zpracování hloubkové vyrovnávací paměti však může způsobovat náklady na výkon, zejména při použití 24bitového formátu hloubky. Proto důrazně doporučujeme nakonfigurovat hloubkovou vyrovnávací paměť na 16bitovou přesnost.

Pokud k boji proti z dochází kvůli nižšímu bitovému formátu, ověřte, že rovina vzdáleného klipu všech fotoaparátů je nastavená na nejnižší možnou hodnotu pro aplikaci. Unity ve výchozím nastavení nastaví rovinu vzdáleného klipu na 1000 m. Na HoloLensu je vzdálená rovina klipu 50 m obecně pro většinu scénářů aplikací více než dostatečná.

Poznámka

Pokud používáte 16bitový formát hloubky, nebudou požadované efekty vyrovnávací paměti vzorníku fungovat, protože Unity v tomto nastavení nevytvoří vyrovnávací paměť vzorníku . Výběr 24bitového formátu hloubky naopak obecně vytvoří 8bitovou vyrovnávací paměť vzorníku, pokud je to možné na grafické platformě koncového bodu.

Pokud používáte komponentu Maska , která vyžaduje vyrovnávací paměť vzorníku, zvažte místo toho použití funkce RectMask2D , která nevyžaduje vyrovnávací paměť vzorníku, a proto ji lze použít ve spojení s 16bitovým formátem hloubky.

Poznámka

Chcete-li rychle zjistit, které objekty ve scéně nezapisují do vyrovnávací paměti hloubky vizuálně, můžete použít nástroj Vyrovnávací paměť hloubky vykreslení v části Nastavení editoru v konfiguračním profilu MRTK.

Optimalizace dat sítě

Nastavení Optimalizovat data sítě se pokusí odebrat nepoužívané atributy vrcholů v rámci vaší aplikace. Nastavení to provede spuštěním každého průchodu shaderu v každém materiálu, který je v každé síti v sestavení. To je vhodné pro velikost herních dat a výkon za běhu, ale může výrazně bránit sestavení.

Toto nastavení se doporučuje zakázat během vývoje a znovu povolit při vytváření hlavního sestavení. Nastavení najdete v části Upravit>nastavení> projektuPřehrávač>Další nastavení>Optimalizovat data sítě.

Obecná doporučení

Výkon může být pro vývojáře hybridní reality nejednoznačným a neustále se měnícím problémem a spektrum znalostí pro racionalizaci výkonu je obrovské. Existuje několik obecných doporučení, jak se dá pochopit, jak se dostat k výkonu aplikace.

Je užitečné zjednodušit spouštění aplikace na části, které běží na procesoru nebo GPU , a tak určit, jestli je aplikace ohraničená některou komponentou. Mohou existovat kritické body, které zahrnují jak jednotky zpracování, tak i některé jedinečné scénáře, které je třeba pečlivě prozkoumat. Pro začátek je ale dobré pochopit, kde se aplikace spouští po většinu času.

Ohraničené GPU

Vzhledem k tomu, že většina platforem pro aplikace hybridní reality využívá stereoskopické vykreslování, je velmi běžné, že jsou ohraničené GPU kvůli povaze vykreslování "dvojitě široké" obrazovky. Platformy mobilní hybridní reality, jako jsou HoloLens nebo Oculus Quest, budou navíc omezené procesorem mobilní třídy & výpočetním výkonem GPU.

Při zaměření na GPU existují obecně dvě důležité fáze, které musí aplikace dokončit každý snímek.

  1. Spuštění shaderu vrcholů
  2. Spusťte pixel shader (označovaný také jako shader fragmentů).

Bez hlubokého ponoření do složité oblasti počítačové grafiky & vykreslovacích kanálů je každá fáze shaderu programem, který běží na GPU a vytváří následující.

  1. Shadery vrcholů transformují vrcholy sítě na souřadnice v prostoru obrazovky (tj. kód spuštěný na vrchol).
  2. Pixel shadery vypočítají barvu, která se má nakreslit pro daný pixel a fragment sítě (tj. spuštění kódu na pixel).

Pokud jde o ladění výkonu, je obvykle plodnější zaměřit se na optimalizaci operací v pixel shaderu. Aplikace může potřebovat pouze nakreslit datovou krychli, která bude mít pouze 8 vrcholů. Místo na obrazovce, které datová krychle zabírá, je však pravděpodobně v řádu milionů pixelů. Zmenšení kódu shaderu o řekněme 10 operací tak může ušetřit výrazně více práce, pokud se sníží na shaderu pixelů než shader vrcholů.

To je jeden z hlavních důvodů pro využití standardního shaderu MRTK , protože tento shader obecně provádí mnohem méně instrukcí na pixel & vrcholu než shader Unity Standard a současně dosahuje srovnatelných estetických výsledků.

Optimalizace procesoru Optimalizace GPU
Logika simulace aplikací Operace vykreslování
Zjednodušení fyziky Omezení výpočtů osvětlení
Zjednodušení animací Snížit počet mnohoúhelníku & počet kreslených objektů
Správa uvolňování paměti Snížení počtu průhledných objektů
Odkazy do mezipaměti Vyhněte se efektům post-processing/full-screen

Nakreslit instanci volání

Jednou z nejběžnějších chyb v Unity, která snižuje výkon, je klonování materiálů za běhu. Pokud objekty GameObjects sdílejí stejný materiál a/nebo mají stejnou síť, je možné je optimalizovat do volání s jedním kreslením pomocí technik, jako je statické dávkování, dynamické dávkování a instanceng GPU. Pokud ale vývojář upraví vlastnosti materiálu rendereru za běhu, Unity vytvoří klonovací kopii přiřazeného materiálu.

Pokud je například ve scéně 100 datových krychlí, může vývojář chtít přiřadit každé z nich za běhu jedinečnou barvu. Přístup renderer.material.color v jazyce C# způsobí, že Unity vytvoří nový materiál v paměti pro tento konkrétní renderer nebo GameObject. Každá ze 100 datových krychlí bude mít svůj vlastní materiál, a proto je nelze sloučit do jednoho volání kreslení, ale místo toho se stane 100 žádostí o volání z procesoru do GPU.

Aby vývojáři mohli tuto překážku překonat a přesto přiřadit jedinečnou barvu na krychli, měli by využít MaterialPropertyBlock.

private PropertyBlock m_PropertyBlock ;
private Renderer myRenderer;

private void Start()
{
     myRenderer = GetComponent<Renderer>();
     m_PropertyBlock = new MaterialPropertyBlock();
}

private void ChangeColor()
{
    // Creates a copy of the material once for this renderer
    myRenderer.material.color = Color.red;

    // vs.

    // Retains instancing capability for renderer
    m_PropertyBlock.SetColor("_Color", Color.red);
    myRenderer.SetPropertyBlock(m_PropertyBlock);
}

Nástroje pro výkon Unity

Unity poskytuje skvělé nástroje pro výkon, které jsou součástí editoru.

Při odhadu hrubého kompromisu výkonu mezi jedním shaderem a druhým je užitečné zkompilovat každý shader a zobrazit počet operací na každou fázi shaderu. Můžete to provést tak, že vyberete prostředek shaderu a kliknete na tlačítko Zkompilovat a zobrazit kód . Tím se zkompiluje všechny varianty shaderu a otevře se Visual Studio s výsledky. Poznámka: Vytvořené statistické výsledky se mohou lišit v závislosti na tom, jaké funkce byly u materiálů využívajících daný shader povoleny. Unity zkompiluje pouze varianty shaderu, které se přímo používají v aktuálním projektu.

Příklad statistiky standardního shaderu Unity

Statistika standardního shaderu Unity 1

Příklad statistiky standardního shaderu MRTK

Statistika standardního shaderu MRTK 2

Viz také

Unity

Windows Mixed Reality

Oculus

Optimalizace sítě