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.
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.
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
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.
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í.
Doporučená nastavení pro Unity
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.
- Spuštění shaderu vrcholů
- 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í.
- Shadery vrcholů transformují vrcholy sítě na souřadnice v prostoru obrazovky (tj. kód spuštěný na vrchol).
- 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
Příklad statistiky standardního shaderu MRTK
Viz také
Unity
- Optimalizace výkonu Unity pro začátečníky
- Kurzy optimalizace výkonu Unity
- Osvědčené postupy optimalizace Unity
- Optimalizace grafického výkonu
- Praktická příručka pro mobilní optimalizaci
Windows Mixed Reality
- Doporučená nastavení pro Unity
- Principy výkonu pro Mixed Reality
- Doporučení k výkonu pro Unity
- Průvodce trasováním událostí pro Windows Unity