Teljesítmény

Első lépések

A teljesítmény észszerűsítésének legegyszerűbb módja a képkeret, vagy az, hogy az alkalmazás hányszor renderelhet másodpercenként egy képet. Fontos, hogy megfeleljen a célzott platform által felvázolt célkeretnek (például Windows Mixed Reality,Oculusstb.). A cél képkocka HoloLens például 60 FORD. A kis képkockaszámú alkalmazások olyan rossz felhasználói élményeket eredményezhetnek, mint például az elhasznált hologramokstabilitása, a világkövetés, a kézkövetés stb. A Mixed Reality Eszközkészlet számos eszközt és szkriptet biztosít a fejlesztőknek a minőség-képkocka követéséhez és eléréséhez.

Vizualizációprofil-készítő

A teljesítmény folyamatos nyomon követéséhez a fejlesztés teljes élettartama alatt erősen ajánlott mindig egy képkocka-vizualizációt mutatni egy alkalmazás & hibakeresése közben. A Mixed Reality eszközkészlet biztosítja a Visual Profiler diagnosztikai eszközt, amely alkalmazásnézetben valós idejű információkat ad az aktuálisAN HASZNÁLT ÉS memóriahasználatról. A Visual Profiler az MRTK-profilokvizsgálója Gépház konfigurálható a diagnosztikai rendszer használatával.

Emellett különösen fontos, hogy a Visual Profiler használatával nyomon követjük a képkocka-adatokat az eszközön való futtatáskor, és ne a Unity szerkesztőben vagy egy emulátorban futva. A legpontosabb teljesítményeredmények akkor fognak ábrázolni, ha kiadási konfigurációt buildelő eszközön fut.

Megjegyzés

Ha a géphez Windows Mixed Reality, üzembe helyezés MASTER konfigurációs buildekkel

Visual Profiler interfész

Optimalizálás ablak

Az MRTK optimize (MRTK optimalizálása) ablak információkkal és automatizálási eszközökkel segít a vegyes valóságú fejlesztőknek a környezetük beállításában a legjobb eredmények elérése érdekében, valamint a jeleneteszközök esetleges szűk keresztmetszetének azonosításában. A Unity bizonyos fontos konfigurációi jelentősen optimalizáltabb eredményeket tudnak elérni vegyes valóságú projektekhez.

Ezek a beállítások általában olyan konfigurációk renderelését is magukban foglalják, amelyek ideálisak vegyes valósághoz. A vegyes valóságú alkalmazások abban egyediek a hagyományos 3D-s grafikai fejlesztéshez képest, hogy két képernyőt (két szem) kell renderelni a teljes jelenethez.

Az alább hivatkozott ajánlott beállítások automatikusan konfigurálhatóak egy Unity-projektben az MRTK Optimize Window segítségével.

MRTK Optimize Window Gépház

Unity Profiler

A Unity Profiler hasznos eszköz az alkalmazásteljesítmény részleteinek vizsgálatához képkocka-szinten.

A processzorra fordított idő

Példa Unity Profiler-Graph

A kényelmes képkocka-sebesség (általában 60 képkocka/másodperc) fenntartásához az alkalmazásoknak 16,6 ezredmásodperces processzoridőt kell elérniük. Az MRTK-funkciók költségeinek azonosításához a Microsoft Mixed Reality Toolkit tartalmaz egy jelölőt a belső ciklusok (keretenkénti) kódútvonalakhoz. Ezek a jelölők a következő formátumot használják a használt funkciók megértéséhez:

[MRTK] className.methodName

Megjegyzés

A metódus neve után további adatok is lehetnek. Ezzel azonosíthatók a feltételesen végrehajtott, potenciálisan költséges funkciók, amelyek elkerülhetők az alkalmazáskód kis módosításaival.

Példa Unity Profiler-hierarchiára

Ebben a példában a hierarchia ki van bontva, és azt mutatja, hogy a WindowsMixedRealityArticulatedHand osztály UpdateHandData metódusa 0,44 ms CPU-időt használ fel az elemzett időszak alatt. Ezek az adatok felhasználhatók annak meghatározására, hogy egy teljesítménybeli probléma alkalmazáskóddal kapcsolatos-e, vagy a rendszer más részén.

Erősen ajánlott, hogy a fejlesztők is hasonló módon használják az alkalmazáskódot. Az alkalmazáskód-rendszerkiválasztás elsődleges területei az eseménykezelőkben vannak, mivel ezekért a metódusokért az MRTK frissítési ciklusa számít fel díjat az események létrehozása során. Az MRTK frissítési hurokban a nagy képkocka-idők költséges kódra utalnak az eseménykezelő metódusokban.

Single-Pass Instanced Rendering

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 minden szem esetében kétszer hajtsa végre a teljes renderelési folyamatot. Ez a Single Pass Instanced Rendering kiválasztásával optimalizálható. Ez a konfiguráció a renderelési céltömbökre használva képes egyetlen hívás elvégzésére, hogy a példányok minden szem számára a megfelelő renderelési célba kerülnek. Emellett ez a mód lehetővé teszi, hogy minden renderelés a renderelési folyamat egyetlen végrehajtásával legyen elvégződve. Így a vegyes valóságú alkalmazások renderelési útvonalaként a Single Pass Instanced Rendering kiválasztása jelentős időt takaríthat meg a PROCESSZOR GPU-jában, és ez az ajánlott renderelési konfiguráció.

Ahhoz azonban, hogy minden szemnek egyetlen húzással hívja meg a hálókat, az összes árnyékolónak támogatnia kell a GPU-instancálást. Az instancing lehetővé teszi, hogy a GPU multiplex hívásokat rajzoljon mindkét szemre. A Unity beépített árnyékolói és az MRTK Standard árnyékoló alapértelmezés szerint tartalmazzák a szükséges instancing utasításokat az árnyékoló kódban. Ha azonban egyéni árnyékolókat ír a Unityhez, előfordulhat, hogy frissítenie kell ezeket az árnyékolókat az egy pass-példány renderelésének támogatásához.

Példakód a Custom Shaderhez

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őzetes beállításokat biztosít az egyes platformvégpont renderelési minőségének szabályozása érdekében. Ezek az előre beállított beállítások stb. szabályozják, hogy milyen grafikus funkciók engedélyezhetők, például árnyékok, aliasok gátlódása, globális árnyékolás stb. Javasoljuk, hogy csökkentse ezeket a beállításokat, és optimalizálja a renderelés során végzett számítások számát.

1. lépés: Vegyes valóságú Unity-projektek frissítése az Alacsony minőség beállítás használatára
SzerkesztéseProject Gépház, majd válassza a Minőség kategória Válassza az Alacsony minőség lehetőséget az UWP-platformhoz

2. lépés: Minden Unity-jelenetfájlhoz tiltsa le a valós idejű Global Egyedeket
AblakRenderelésVilágítási Gépháztörölje a valós idejű globális effektusok jelölését

Mélységi puffermegosztás (HoloLens)

Ha a fejlesztés Windows Mixed Reality platformra és különösen HoloLens, a mélységi puffermegosztás XR-Gépház segíthet a hologram-stabilizálásban. A mélységi puffer feldolgozása azonban teljesítményköltséggel jár, különösen 24 bites formátum használata esetén. Ezért erősen ajánlott a mélységi puffert 16 bites pontosságra konfigurálni.

Ha a z-beállítás az alacsonyabb bitformátum miatt következik be, ellenőrizze, hogy az összes kamera távolról rögzített vágólapja az alkalmazás lehető legalacsonyabb értékre van-e állítva. A Unity alapértelmezés szerint egy 1000m-es távol clip-síkot állít be. A HoloLens az 50m-es távol clip-sík általában több, mint elég a legtöbb alkalmazási helyzethez.

Megjegyzés

Ha 16 bitesmélységű formátumot használ, a sablonpuffer szükséges hatásai nem fognak működni, mert a Unity nem hoz létre sablonpufferet ebben a beállításban. A 24 bites formátum ezzel szembeni kiválasztása általában egy 8 bites sablonpuffert hoz létre, ha van ilyen a végpontgrafikon-platformon.

Ha olyan Mask összetevőt használ, amelyhez a sablonpuffer szükséges, fontolja meg a RectMask2D használatának ehelyett, amely nem igényli a sablonpuffert, így 16 bitesmélységű formátummal együtt használható.

Megjegyzés

Annak gyors meghatározásához, hogy egy jelenet mely objektumai nem írnak vizuálisan a mélységi pufferbe, használhatja az MRTK-konfigurációs profil Szerkesztő Gépház segédprogramját.

Hálóadatok optimalizálása

A Mesh-adatok optimalizálása beállítás megkísérli eltávolítani a nem használt csúcspontattribútumokat az alkalmazásban. A beállítás ezt úgy végzi el, hogy az összes árnyékolón futtatja a build minden hálóját. Ez jó a játékadatok méretére és a futásidő teljesítményére, de jelentősen akadályozhatja a buildidőt.

Javasoljuk, hogy a fejlesztés során tiltsa le ezt a beállítást, és engedélyezze újra a "Fő" build létrehozása során. A beállítás az Edit Project Gépház Player Other Gépház Optimize Mesh Data (Hálóadatokoptimalizálása) alatt 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ásspektrum hatalmas. Van azonban néhány általános javaslat arra vonatkozóan, hogyan közelíti meg egy alkalmazás teljesítményét.

Hasznos leegyszerűsíteni az alkalmazások végrehajtását a PROCESSZORon vagy a GPU-on futó összetevőkre, így azonosítani, hogy az alkalmazásokat az egyes összetevők kötik-e össze. Olyan szűk keresztmetszetek is előfordulhatnak, amelyek a feldolgozó egységeket és néhány egyedi forgatókönyvet is átfognak, és ezeket alaposan meg kell vizsgálni. Első lépésekben azonban jó tudni, hogy egy alkalmazás hol fut a legtöbb ideig.

GPU-val határolt

Mivel a vegyes valóságú alkalmazások legtöbb platformja sztereotikus renderelést használ,nagyon gyakori, hogy GPU-ra van kötve a "dupla széles" képernyő renderelésének természete miatt. Az olyan mobil vegyes valóságú mobilplatformokat, mint a HoloLens vagy az OculusHow, a mobilosztályú & PROCESSZOR GPU-feldolgozási teljesítmény korlátozza.

A GPU-ra összpontosítva általában két fontos szakaszt kell végrehajtania az alkalmazásoknak minden képkockán.

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

A számítógépes grafikus renderelési folyamatok összetett területének mélyebbre merülése nélkül minden egyes árnyékoló szakasz egy olyan program, amely a GPU-val fut, és a következőket &&készíti el.

  1. A csúcspontok árnyékolói a háló csúcspontokat alakítják át a képernyőtérben koordinátákként (vagyis csúcsonként végrehajtott kód)
  2. A képpontos árnyékolók kiszámítják az adott képponthoz és meshtöredékhez rajzolni kívánt színt (azaz a kód végrehajtása képpontonként)

A teljesítmény-finomhangolás tekintetében általában hasznosabb a műveletek képpontos árnyékolásban való optimalizálására összpontosítani. Előfordulhat, hogy egy alkalmazásnak csak egy 8 csúcsos kockát kell rajzolni. A kocka által elfoglalt képernyőterület azonban valószínűleg több millió képpontból áll. Így az árnyékolási kód mondjuk 10 művelettel való csökkentése jelentősen több munkát takaríthat meg, ha a képpont árnyékolón csökkenti a csúcs árnyékolását.

Ez az egyik fő oka az MRTK Standard árnyékolónak, mivel ez az árnyékoló általában sokkal kevesebb utasítást hajt végre képpontonkénti csúcsonként, mint a Unity Standard árnyékoló, ugyanakkor 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 Rajzolható objektumok & sokszögszámának csökkentése
Szemétgyűjtés kezelése Transzparens objektumok számának csökkentése
Gyorsítótár-hivatkozások Utófeldolgozási/teljes képernyős hatások elkerülése

Hívás instancing hívása

A Unity egyik leggyakoribb, a teljesítményt csökkentő hibája az anyagok klónozása futásidőben. Ha a GameObjects ugyanazon az anyagon és/vagy hálón osztozik, optimalizálhatja őket egypontos hívásokra olyan technikákkal, mint a statikus kötegelés, a dinamikus kötegelés ésa GPU instancing. Ha azonban a fejlesztő módosítja egy Renderer-anyag tulajdonságait futásidőben, a Unity létrehozza a hozzárendelt anyag klónozott másolatát.

Ha például egy jelenetben 100 kocka van, előfordulhat, hogy egy fejlesztő egyedi színt szeretne hozzárendelni mindegyikhez futásidőben. A renderer.material.color hozzáférése c# esetén a Unity új anyagot hoz létre a memóriában ehhez a renderelőhez/GameObjecthez. A 100 kocka mindegyikének saját anyaga lesz, ezért nem egyesíthetők egyetlen hívásban, hanem 100 hívás lesz a CPU és a GPU között.

Ennek az akadálynak a leküzdéséhez és a kockánként egyedi színek hozzárendelése érdekében 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ű, a szerkesztőbe épített teljesítménybeli eszközöket biztosít.

Ha egy árnyékoló és egy másik árnyaló között megbecsüli a teljesítményre vonatkozó becslést, hasznos lehet minden egyes árnyékolót lefordítani, és megtekinteni a műveletek számát az egyes árnyékolási fázisok szerint. Ehhez válasszon ki egy árnyékolóeszközt, majd kattintson a Fordítás és kód megjelenítése gombra. Ezzel lefordítja az összes árnyékoló változatot, és megnyitja a Visual Studiót az eredményekkel. Megjegyzés: A kapott statisztikai eredmények attól függően változhatnak, hogy milyen funkciók vannak engedélyezve az adott árnyékolót használó anyagokon. A Unity csak az aktuális projektben közvetlenül használt árnyékoló változatokat fordítja le.

Példa Unity Standard árnyékoló statisztikáira

Unity Standard Shader Statistics 1

Példa AZ MRTK Standard árnyékoló statisztikáira

MRTK Standard Shader Statistics 2

Lásd még

Unity

Windows Mixed Reality

Oculus

Hálóoptimalizálás