Teljesítmény – MRTK2

Első lépések

A teljesítmény észszerűsítésének legegyszerűbb módja a képkockasebesség, vagy az, hogy az alkalmazás hányszor képes másodpercenként renderelni egy képet. Fontos, hogy megfeleljen a megcélzott platform (pl. Windows Mixed Reality, Oculus stb.) által felvázolt célkeretnek. Például a HoloLens esetében a célkockasebesség 60 FPS. Az alacsony képkockasebességű alkalmazások ronthatják a felhasználói élményeket, például a hologram stabilizálódásának romlását, a világ nyomon követését, a kézkövetést és egyebeket. Annak érdekében, hogy a fejlesztők nyomon követjék és elérjék a minőségi kereteket, Mixed Reality Toolkit számos eszközt és szkriptet biztosít.

Vizuális profilkészítő

A teljesítmény folyamatos nyomon követéséhez a fejlesztés teljes élettartama alatt erősen ajánlott mindig képkockasebesség-vizualizációt megjeleníteni az alkalmazások futtatása közben & hibakeresése közben. Mixed Reality Toolkit biztosítja a Visual Profiler diagnosztikai eszközt, amely valós idejű információkat nyújt az aktuális FPS-ről és memóriahasználatról az alkalmazásnézetben. A Visual Profiler konfigurálható az MRTK profilfelügyelődiagnosztikai rendszerbeállításai között.

Emellett különösen fontos, hogy a Visual Profiler segítségével nyomon kövesse a képkockasebességet az eszközön való futtatáskor, nem pedig a Unity-szerkesztőben vagy egy emulátorban. A legpontosabb teljesítményeredmények akkor jelennek meg, amikor kiadási konfigurációs buildekkel futnak az eszközön.

Megjegyzés

Ha Windows Mixed Reality készít, helyezze üzembe a MASTER konfigurációs buildekkel.

Visual Profiler Interface

Ablak optimalizálása

Az MRTK Optimize Window információs és automatizálási eszközöket kínál, amelyekkel a vegyes valóság fejlesztői a legjobban teljesítő eredményekhez állíthatják be környezetüket, és azonosíthatják a lehetséges szűk keresztmetszeteket a jelenetben & eszközökben. A Unity bizonyos kulcsfontosságú konfigurációi jelentősen optimalizáltabb eredményeket nyújthatnak a vegyes valóságú projektekhez.

Ezek a beállítások általában olyan renderelési konfigurációkat foglalnak magukban, amelyek ideálisak a vegyes valósághoz. A vegyes valósági alkalmazások a hagyományos 3D grafikus fejlesztéshez képest egyediek, mivel két képernyő (azaz két szem) jelenik meg az egész jelenethez.

Az alábbi javasolt beállítások automatikusan konfigurálhatók egy Unity-projektben az MRTK optimize ablakának használatával.

AZ MRTK ablakbeállításai optimalizálása

Unity Profiler

A Unity Profiler egy hasznos eszköz az alkalmazásteljesítmény részleteinek keretenkénti vizsgálatához.

A CPU-val töltött idő

Példa Unity Profiler Graph

A kényelmes képkockasebesség (általában 60 képkocka/másodperc) fenntartása érdekében az alkalmazásoknak 16,6 ezredmásodpercnyi processzoridőt kell elérnie. Az MRTK-funkciók költségeinek azonosításához a Microsoft Mixed Reality Toolkit egy jelölőt tartalmaz a belső hurok (keretenként) kódútvonalaihoz. Ezek a jelölők a következő formátumot használják, hogy segítsenek megérteni a használt funkciókat:

[MRTK] className.methodName

Megjegyzés

A metódus neve után további adatok is lehetnek. Ez a feltételesen végrehajtott, potenciálisan költséges funkciók azonosítására szolgál, amelyeket az alkalmazáskód kis mértékű módosítása elkerülhet.

Példa Unity Profiler-hierarchia

Ebben a példában a hierarchia ki lett bontva, és azt mutatja, hogy a WindowsMixedRealityArticulatedHand osztály UpdateHandData metódusa 0,44 ms processzoridőt használ az elemzett keret során. Ezek az adatok segítenek megállapítani, hogy a teljesítményproblémák az alkalmazáskóddal vagy a rendszer más helyről származnak-e.

Erősen ajánlott, hogy a fejlesztők hasonló módon alakítsák ki az alkalmazáskódot. Az alkalmazáskódok rendszerállapotának elsődleges területei az eseménykezelőkben vannak, mivel ezek a metódusok az események felmerülésekor az MRTK frissítési hurokra lesznek terhelve. Az MRTK frissítési ciklusán belüli nagy keretidők költséges kódra utalhatnak az eseménykezelő metódusokban.

példányos megjelenítés Single-Pass

A Unityben az XR alapértelmezett renderelési konfigurációja a Multi-Pass. Ez a beállítás arra utasítja a Unityt, hogy kétszer hajtsa végre a teljes renderelési folyamatot, minden szemnél egyszer. Ez optimalizálható a Single Pass Instanced rendering (Egyátadásos példány renderelése ) lehetőség kiválasztásával. Ez a konfiguráció renderelt céltömbök használatával képes egyetlen rajzolásos hívást végrehajtani, amely minden szem számára a megfelelő renderelési célként jelenik meg. Ezen kívül ez a mód lehetővé teszi, hogy az összes renderelés a renderelési folyamat egyetlen végrehajtása során legyen végrehajtva. Így ha a Single Pass Instanced renderelést választja egy vegyes valóságú alkalmazás renderelési útvonalaként, jelentős időt takaríthat meg a CPU-& GPU-n, és ez az ajánlott renderelési konfiguráció.

Ahhoz azonban, hogy minden szemnek egyetlen rajzolási hívást lehessen kibocsátani, a GPU-instancingot minden árnyékolónak támogatnia kell. Az instancing lehetővé teszi, hogy a GPU multiplexes hívásokat rajzoljon mindkét szemre. A Unity beépített árnyékolói és az MRTK Standard shader alapértelmezés szerint tartalmazzák a szükséges instancing utasításokat a shader-kódban. Ha mégis egyéni árnyékolókat ír a Unityhez, előfordulhat, hogy ezeket az árnyékolókat frissíteni kell a Single Pass Instanced renderelés támogatásához.

Példakód az Egyéni árnyékolóhoz

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;
}

Minőségi beállítások

A Unity előre beállított beállításokkal szabályozza az egyes platformvégpontok renderelési minőségét. Ezek az előre beállított beállítások határozzák meg, hogy milyen grafikus funkciók engedélyezhetők, például az árnyékolás, az aliaskezelés, a globális megvilágítás stb. Javasoljuk, hogy csökkentse ezeket a beállításokat, és optimalizálja a renderelés során végrehajtott számítások számát.

1. lépés: A Vegyes valóság Unity-projektjeinek frissítése az Alacsony minőség szint beállítás használatára
Szerkesztése>Projektbeállítások, majd az UWP-platform Minőség kategóriája > : Alacsony minőség kiválasztása

2. lépés: Minden Unity-jelenetfájl esetében tiltsa le a valós idejű globális megvilágítást
Ablak>Renderelés>Világítási beállítások>A valós idejű globális megvilágítás jelölésének törlése

Mélységi puffer megosztása (HoloLens)

Ha a Windows Mixed Reality platformra és különösen a HoloLensre fejleszt, a mélységi puffermegosztás engedélyezése az XR-beállítások alatt segíthet a hologramok stabilizálásában. A mélységi puffer feldolgozása azonban teljesítményköltséggel járhat, különösen, ha 24 bites mélységi formátumot használ. Ezért erősen ajánlott a mélységi puffert 16 bites pontossággal konfigurálni.

Ha a z-verés az alacsonyabb bitformátum miatt történik, ellenőrizze, hogy az összes kamera távoli klipsíkja az alkalmazás lehető legkisebb lehetséges értékére van-e beállítva. A Unity alapértelmezés szerint 1000 m-nyi távoli klipsíkot állít be. A HoloLensben egy 50 m-nyi távoli klipsík általában több, mint elegendő a legtöbb alkalmazásforgatókönyvhez.

Megjegyzés

Ha 16 bites mélységi formátumot használ, a rajzsablonpufferhez szükséges effektusok nem működnek, mert a Unity ebben a beállításban nem hoz létre rajzsablonpuffert. A 24 bites mélységi formátum kiválasztása általában egy 8 bites rajzsablonpuffert hoz létre, ha alkalmazható a végpont grafikus platformján.

Ha olyan Maszk összetevőt használ, amely megköveteli a rajzsablon pufferét, fontolja meg inkább a RectMask2D használatát, amely nem igényel rajzsablonpuffert, így 16 bites mélységi formátummal együtt használható.

Megjegyzés

Ha gyorsan meg szeretné állapítani, hogy egy jelenet mely objektumai nem írnak vizuálisan a mélységi pufferbe, használhatja a Mélységpuffer renderelése segédprogramot az MRTK konfigurációs profil szerkesztőbeállításai alatt.

Hálóadatok optimalizálása

A Mesh-adatok optimalizálása beállítás megpróbálja eltávolítani a nem használt csúcsattribútumokat az alkalmazásban. A beállítás ezt úgy hajtja végre, hogy minden árnyékolót átfuttat minden olyan anyagon, amely a build minden hálóján található. Ez jó a játékadatok méretéhez és a futtatókörnyezet teljesítményéhez, de jelentősen akadályozhatja a buildelési időt.

Javasoljuk, hogy a fejlesztés során tiltsa le ezt a beállítást, és engedélyezze újra a "Master" build létrehozása során. A beállítás aProjektbeállítások>szerkesztése>Lejátszó>Egyéb beállítások>Hálóadatok optimalizálása területen található.

Általános javaslatok

A teljesítmény nem egyértelmű és folyamatosan változó kihívás lehet a vegyes valóság fejlesztői számára, és a teljesítmény észszerűsítéséhez szükséges tudás spektruma hatalmas. Vannak azonban általános javaslatok az alkalmazások teljesítményének megközelítésére.

Hasznos lehet leegyszerűsíteni egy alkalmazás végrehajtását a CPU-n vagy a GPU-n futó részekre, és így azonosítani, hogy az alkalmazás egyik összetevővel van-e határos. Előfordulhatnak olyan szűk keresztmetszetek, amelyek a feldolgozási egységekre és bizonyos egyedi forgatókönyvekre is kiterjednek, amelyeket alaposan meg kell vizsgálni. Az első lépésekhez azonban jó megérteni, hogy egy alkalmazás hol fut a legtöbb ideig.

GPU-val határolt

Mivel a vegyes valósági alkalmazások legtöbb platformja sztereoszkopikus renderelést használ, nagyon gyakori, hogy GPU-ra van kötve a "dupla széles" képernyő renderelésének természete miatt. A Futhermore mobil vegyes valósági platformokat, például a HoloLenst vagy az Oculus Questet mobilosztályú CPU-& GPU-feldolgozási teljesítmény korlátozza.

A GPU-ra való összpontosításkor általában két fontos szakasz van, amelyeket az alkalmazásnak minden keretben végre kell hajtania.

  1. A csúcsárnyékoló végrehajtása
  2. Hajtsa végre a képpontárnyékolót (más néven töredékárnyékolót)

Anélkül, hogy részletesen belemerülne a számítógépes grafikus & renderelési folyamatok összetett területébe, minden árnyékoló fázis egy olyan program, amely a GPU-n fut, hogy az alábbiakat hozza létre.

  1. A csúcsok árnyékolói hálócsúcsokat alakítanak át koordinátákká a képernyőtérben (azaz csúcsonként végrehajtott kód)
  2. A képpontárnyékolók kiszámítják az adott képpont- és hálótöredék színét (azaz a kód végrehajtása képpontonként)

Ami a teljesítményhangolást illeti, általában gyümölcsözőbb a képpontárnyékoló műveleteinek optimalizálására összpontosítani. Előfordulhat, hogy egy alkalmazásnak csak 8 csúcspontból álló kockát kell rajzolnia. A kocka által elfoglalt képernyőterület azonban valószínűleg képpontok millióinak sorrendjében van. Így a shader-kód 10 művelettel való csökkentése jelentősen több munkát takaríthat meg, ha a képpontárnyékolón csökken, mint a csúcspontárnyékoló.

Ez az MRTK Standard shader használata egyik fő oka, mivel ez a shader általában sokkal kevesebb utasítást hajt végre képpontonként & csúcspontonként, mint a Unity Standard árnyékoló, miközben hasonló esztétikai eredményeket ér el.

CPU-optimalizálás GPU-optimalizálás
Alkalmazásszimulációs logika Renderelési műveletek
A fizika egyszerűsítése Világítási számítások csökkentése
Animációk egyszerűsítése A rajzolható objektumok számának csökkentése & számának csökkentése
Szemétgyűjtés kezelése Áttetsző objektumok számának csökkentése
Gyorsítótár-hivatkozások A feldolgozás utáni/teljes képernyős effektusok elkerülése

Hívás instancing rajzolása

A Unity egyik leggyakoribb hibája, amely csökkenti a teljesítményt, az anyagok klónozása futásidőben. Ha a GameObjects ugyanazt az anyagot és/vagy hálót használja, akkor azokat egyetlen rajzolási hívásra lehet optimalizálni olyan technikákkal, mint a statikus kötegelés, a dinamikus kötegelés és a GPU instancing. Ha azonban a fejlesztő módosítja a renderelő anyagának tulajdonságait futásidőben, a Unity létrehozza a hozzárendelt anyag klónmásolatát.

Ha például egy jelenetben 100 kocka található, előfordulhat, hogy a fejlesztő mindegyikhez egyedi színt szeretne hozzárendelni futásidőben. A renderer.material.color C#-ban való hozzáférésével a Unity új anyagot hoz létre a memóriában ehhez a renderelőhöz/GameObjecthez. A 100 kocka mindegyikének saját anyaga lesz, így nem egyesíthetők egy rajzhívással, hanem 100 híváshívási kérés lesz a CPU-ról a GPU-ra.

Ennek az akadálynak a leküzdéséhez és a kockánkénti egyedi szín hozzárendeléséhez a fejlesztőknek a MaterialPropertyBlockot kell használniuk.

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);
}

Unity-teljesítményeszközök

A Unity nagyszerű teljesítménynövelő eszközöket biztosít, amelyek a szerkesztőbe vannak beépítve.

Ha az egyik és egy másik árnyékoló közötti durva teljesítménybeli kompromisszumot becsüli meg, érdemes minden árnyékolót lefordítani, és megtekinteni az árnyékolószakaszonkénti műveletek számát. Ezt úgy teheti meg, hogy kiválaszt egy árnyékolóeszközt , majd a Fordítás és kód megjelenítése gombra kattint. Ezzel lefordítja az összes árnyékolóvariánst, és megnyitja a Visual Studiót az eredményekkel. Megjegyzés: A létrehozott statisztikai eredmények attól függően változhatnak, hogy milyen funkciók lettek engedélyezve az adott árnyékolót használó anyagokon. A Unity csak az aktuális projektben közvetlenül használt árnyékolóvariánsokat fordítja le.

Példa a Unity Standard shader statisztikáira

Unity Standard Shader Statistics 1

MRTK Standard shader statistics example

MRTK Standard Shader Statistics 2

Lásd még

Unity

Windows Mixed Reality

Oculus

Hálóoptimalizálás