Prestaties — MRTK2

Aan de slag

De eenvoudigste manier om prestaties te rationaliseren is via framerate of hoe vaak uw toepassing een afbeelding per seconde kan weergeven. Het is belangrijk om te voldoen aan de doelframerate, zoals wordt beschreven door het platform waarop het is gericht (bijvoorbeeld Windows Mixed Reality, Oculus, enzovoort). Op HoloLens is de doelframerate bijvoorbeeld 60 FPS. Toepassingen met een lage framesnelheid kunnen leiden tot verslechterde gebruikerservaringen, zoals verslechterde hologramstabilisatie, wereldtracering, handtracering en meer. Om ontwikkelaars te helpen bij het bijhouden en bereiken van framerate van kwaliteit, biedt Mixed Reality Toolkit een verscheidenheid aan hulpprogramma's en scripts.

Visual Profiler

Als u de prestaties gedurende de levensduur van de ontwikkeling continu wilt bijhouden, wordt het ten zeerste aanbevolen om altijd een framerate-visual weer te geven tijdens het uitvoeren van & het opsporen van fouten in een toepassing. Mixed Reality Toolkit biedt het diagnostische hulpprogramma Visual Profiler dat realtime informatie biedt over het huidige FPS- en geheugengebruik in de toepassingsweergave. De Visual Profiler kan worden geconfigureerd via de diagnostische systeeminstellingen onder de CONTROLE MRTK-profielen.

Bovendien is het met name belangrijk om de Visual Profiler te gebruiken om de framesnelheid bij te houden bij uitvoering op het apparaat in plaats van in de Unity-editor of een emulator. De meest nauwkeurige prestatieresultaten worden weergegeven wanneer ze worden uitgevoerd op het apparaat met Release-configuratiebuilds.

Notitie

Als u bouwt voor Windows Mixed Reality, implementeert u met MASTER-configuratiebuilds.

Visual Profiler Interface

Venster optimaliseren

Het MRTK-venster optimaliseren biedt informatie en automatiseringsprogramma's om mixed reality-ontwikkelaars te helpen hun omgeving in te stellen voor de best presterende resultaten en mogelijke knelpunten in hun scène & assets te identificeren. Bepaalde belangrijke configuraties in Unity kunnen helpen om aanzienlijk meer geoptimaliseerde resultaten te leveren voor mixed reality-projecten.

Over het algemeen hebben deze instellingen betrekking op renderingconfiguraties die ideaal zijn voor mixed reality. Mixed reality-toepassingen zijn uniek in vergelijking met traditionele 3D-grafische ontwikkeling omdat er twee schermen (dat wil zeggen twee ogen) zijn om voor de hele scène weer te geven.

De aanbevolen instellingen waarnaar hieronder wordt verwezen, kunnen automatisch worden geconfigureerd in een Unity-project door gebruik te maken van het MRTK-optimalisatievenster.

MRTK Vensterinstellingen optimaliseren

Unity Profiler

De Unity Profiler is een handig hulpprogramma om details van toepassingsprestaties op frame-voor-frameniveau te onderzoeken.

Tijd besteed aan de CPU

Voorbeeld van Unity Profiler Graph

Om comfortabele framesnelheden (meestal 60 frames per seconde) te behouden, moeten toepassingen een maximale frametijd van 16,6 milliseconden CPU-tijd bereiken. Microsoft Mixed Reality Toolkit bevat markeringen voor binnenste luscodepaden (per frame) om de kosten van MRTK-functionaliteit te identificeren. Deze markeringen gebruiken de volgende indeling om inzicht te krijgen in de specifieke functionaliteit die wordt gebruikt:

[MRTK] className.methodName

Notitie

Er kunnen aanvullende gegevens achter de naam van de methode staan. Dit wordt gebruikt om voorwaardelijk uitgevoerde, mogelijk dure functionaliteit te identificeren die kan worden vermeden door kleine wijzigingen in de toepassingscode.

Voorbeeld van Unity Profiler-hiërarchie

In dit voorbeeld is de hiërarchie uitgebreid om aan te geven dat de methode UpdateHandData van de klasse WindowsMixedRealityArticulatedHand 0,44 ms CPU-tijd verbruikt tijdens het frame dat wordt geanalyseerd. Deze gegevens kunnen worden gebruikt om te bepalen of een prestatieprobleem te maken heeft met toepassingscode of van een andere locatie in het systeem.

Het wordt ten zeerste aanbevolen dat ontwikkelaars toepassingscode op een vergelijkbare manier instrumenteert. De primaire aandachtsgebieden voor instrumentatie van toepassingscode bevinden zich in gebeurtenis-handlers, omdat deze methoden in rekening worden gebracht bij de MRTK-updatelus wanneer gebeurtenissen worden gegenereerd. Hoge frametijden binnen de MRTK-updatelus kunnen wijzen op dure code in gebeurtenis-handlermethoden.

Single-Pass instanced rendering

De standaard renderingconfiguratie voor XR in Unity is Multi-pass. Deze instelling instrueert Unity om de hele render-pijplijn twee keer uit te voeren, één keer voor elk oog. Dit kan worden geoptimaliseerd door in plaats daarvan Single Pass Instanced rendering te selecteren. Deze configuratie maakt gebruik van renderdoelmatrices om een enkele draw-aanroep uit te voeren die exemplaren in het juiste renderdoel voor elk oog uitvoert. Bovendien kan met deze modus alle rendering worden uitgevoerd in één uitvoering van de rendering-pijplijn. Het selecteren van Single Pass Instanced rendering als het renderingpad voor een mixed reality-toepassing kan dus aanzienlijke tijd besparen op zowel de CPU & GPU . Dit is de aanbevolen renderingconfiguratie.

Als u echter één trekoproep wilt uitvoeren voor elk mesh naar elk oog, moet GPU-instancing worden ondersteund door alle shaders. Met instancing kan de GPU meerdere aanroepen over beide ogen trekken. Ingebouwde Unity-shaders en de MRTK Standard-shader bevatten standaard de benodigde instancing-instructies in shader-code. Als u echter aangepaste shaders schrijft voor Unity, moeten deze shaders mogelijk worden bijgewerkt om ondersteuning te bieden voor single pass instanced rendering.

Voorbeeldcode voor aangepaste 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;
}

Kwaliteitsinstellingen

Unity biedt voorinstellingen voor het beheren van de kwaliteit van de rendering voor elk platformeindpunt. Deze voorinstellingen bepalen welke grafische functies kunnen worden ingeschakeld, zoals schaduwen, anti-aliasing, globale verlichting en meer. Het wordt aanbevolen om deze instellingen te verlagen en het aantal berekeningen dat tijdens de rendering wordt uitgevoerd te optimaliseren.

Stap 1: Mixed reality Unity-projecten bijwerken om de instelling Laag kwaliteitsniveau te gebruiken
Bewerken>Projectinstellingen en selecteer vervolgens de categorie >KwaliteitSelecteer Lage kwaliteit voor het UWP-platform

Stap 2: Schakel voor elk Unity-scènebestand realtime Globale verlichting uit
Venster>Rendering>Instellingen voor> verlichtingSchakel realtime globale verlichting uit

Dieptebuffer delen (HoloLens)

Als u ontwikkelt voor het Windows Mixed Reality-platform en in het bijzonder HoloLens, kan het inschakelen van Depth Buffer Sharing onder XR-instellingen helpen bij het stabiliseren van hologrammen. Voor het verwerken van de dieptebuffer kunnen echter prestatiekosten in rekening worden gebracht, met name als u een 24-bits diepteindeling gebruikt. Het wordt daarom ten zeerste aanbevolen om de dieptebuffer te configureren naar 16-bits precisie.

Als z-fighting optreedt vanwege de lagere bit-indeling, controleert u of het verklede vlak van alle camera's is ingesteld op de laagst mogelijke waarde voor de toepassing. Unity stelt standaard een ver klemvlak in van 1000m. Op HoloLens is een ver klemvlak van 50 m over het algemeen meer dan voldoende voor de meeste toepassingsscenario's.

Notitie

Als u de 16-bits diepteindeling gebruikt, werken vereiste effecten van de stencilbuffer niet omdat Unity in deze instelling geen stencilbuffer maakt . Als u omgekeerd de 24-bits diepteindeling selecteert, wordt er in het algemeen een 8-bits stencilbuffer gemaakt, indien van toepassing op het eindpuntafbeeldingsplatform.

Als u een maskeronderdeel gebruikt waarvoor de stencilbuffer is vereist, kunt u in plaats daarvan RectMask2D gebruiken, waarvoor de stencilbuffer niet is vereist en dus kan worden gebruikt in combinatie met een 16-bits diepteindeling.

Notitie

Als u snel wilt bepalen welke objecten in een scène visueel niet naar de dieptebuffer schrijven, kunt u het hulpprogramma Dieptebuffer weergeven gebruiken onder de Editor-instellingen in het MRTK-configuratieprofiel.

Mesh-gegevens optimaliseren

Met de instellingen mesh-gegevens optimaliseren wordt geprobeerd ongebruikte hoekpuntkenmerken in uw toepassing te verwijderen. De instelling voert dit uit door over elke arceringspas te lopen in elk materiaal dat zich op elk mesh in de build bevindt. Dit is goed voor de grootte van gamegegevens en runtimeprestaties, maar kan de buildtijden drastisch belemmeren.

Het wordt aanbevolen deze instelling uit te schakelen tijdens de ontwikkeling en opnieuw in te schakelen tijdens het maken van de hoofdbuild. De instelling vindt u onderProjectinstellingen>bewerken>Speler>Overige instellingen>Mesh-gegevens optimaliseren.

Algemene aanbevelingen

Prestaties kunnen een dubbelzinnige en voortdurend veranderende uitdaging zijn voor mixed reality-ontwikkelaars en het kennisspectrum voor het rationaliseren van prestaties is enorm. Er zijn echter enkele algemene aanbevelingen voor het begrijpen van de prestaties van een toepassing.

Het is handig om de uitvoering van een toepassing te vereenvoudigen in de onderdelen die worden uitgevoerd op de CPU of de GPU en zo te bepalen of een app door een van beide onderdelen wordt begrensd. Er kunnen knelpunten zijn die zowel verwerkingseenheden als enkele unieke scenario's omvatten die zorgvuldig moeten worden onderzocht. Om aan de slag te gaan, is het echter goed om te begrijpen waar een toepassing de meeste tijd wordt uitgevoerd.

GPU gebonden

Omdat de meeste platforms voor mixed reality-toepassingen stereoscopische rendering gebruiken, is het heel gebruikelijk om GPU-gebonden te zijn vanwege de aard van het weergeven van een 'dubbelbreed' scherm. Daarnaast worden mobiele mixed reality-platforms, zoals HoloLens of Oculus Quest, beperkt door cpu-& GPU-verwerkingskracht van mobiele klasse.

Wanneer u zich op de GPU richt, zijn er over het algemeen twee belangrijke fasen die een toepassing elk frame moet voltooien.

  1. De hoekpunt-shader uitvoeren
  2. De pixel-shader uitvoeren (ook wel de fragment-shader genoemd)

Zonder dieper in te gaan op het complexe gebied van computerafbeeldingen & rendering-pijplijnen, is elke shader-fase een programma dat wordt uitgevoerd op de GPU om het volgende te produceren.

  1. Hoekpunt-shaders transformeren mesh-hoekpunten naar coördinaten in de schermruimte (dat wil zeggen code die per hoekpunt wordt uitgevoerd)
  2. Pixel-shaders berekenen de kleur die moet worden getekend voor een bepaalde pixel en mesh-fragment (dat wil zeggen dat code per pixel wordt uitgevoerd)

Met betrekking tot het afstemmen van prestaties is het meestal vruchtbaarder om u te richten op het optimaliseren van de bewerkingen in de pixel-shader. Een toepassing hoeft mogelijk slechts een kubus te tekenen die uit slechts 8 hoekpunten zal zijn. De schermruimte die de kubus inneemt, is echter waarschijnlijk in de orde van miljoenen pixels. Het verminderen van arceringscode met bijvoorbeeld 10 bewerkingen kan aanzienlijk meer werk besparen als de pixel-arcering wordt verminderd dan de hoekpuntschaduw.

Dit is een van de belangrijkste redenen voor het gebruik van de MRTK Standard-arcering , omdat deze arcering over het algemeen veel minder instructies per pixel & hoekpunt uitvoert dan de Unity Standard-arcering, terwijl vergelijkbare esthetische resultaten worden bereikt.

CPU-optimalisaties GPU-optimalisaties
App-simulatielogica Renderingbewerkingen
Fysica vereenvoudigen Verlichtingsberekeningen verminderen
Animaties vereenvoudigen Het aantal veelhoeken verminderen & aantal tekenbare objecten
Garbagecollection beheren Aantal transparante objecten verminderen
Cacheverwijzingen Naverwerking/effecten op volledig scherm vermijden

Oproep instancing tekenen

Een van de meest voorkomende fouten in Unity die de prestaties vermindert, is het klonen van materialen tijdens runtime. Als GameObjects hetzelfde materiaal delen en/of dezelfde mesh hebben, kunnen ze worden geoptimaliseerd in single draw-aanroepen via technieken zoals statische batchverwerking, dynamische batchverwerking en GPU-instancing. Als de ontwikkelaar echter eigenschappen van het materiaal van een Renderer tijdens runtime wijzigt, maakt Unity een kloonkopie van het toegewezen materiaal.

Als er bijvoorbeeld 100 kubussen in een scène zijn, kan een ontwikkelaar tijdens runtime een unieke kleur aan elk van deze kubussen toewijzen. De toegang van renderer.material.color in C# zorgt ervoor dat Unity een nieuw materiaal in het geheugen maakt voor deze specifieke renderer/GameObject. Elk van de 100 kubussen heeft een eigen materiaal en daarom kunnen ze niet worden samengevoegd tot één draw-aanroep, maar worden in plaats daarvan 100 oproepaanvragen van de CPU naar de GPU.

Om dit obstakel te overwinnen en toch een unieke kleur per kubus toe te wijzen, moeten ontwikkelaars Gebruikmaken van 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);
}

Unity-prestatiehulpprogramma's

Unity biedt geweldige prestatiehulpprogramma's die zijn ingebouwd in de editor.

Als u de ruwe prestatie-afweging tussen de ene shader en een andere wilt schatten, is het handig om elke arcering te compileren en het aantal bewerkingen per arceringsfase weer te geven. Dit kunt u doen door een arceringsasset te selecteren en op de knop Code compileren en weergeven te klikken. Hiermee worden alle arceringsvarianten gecompileerd en visual studio geopend met de resultaten. Opmerking: de gegenereerde statistische resultaten kunnen variëren, afhankelijk van welke functies zijn ingeschakeld voor materialen die gebruikmaken van de opgegeven shader. Unity compileert alleen de arceringsvarianten die rechtstreeks in het huidige project worden gebruikt.

Voorbeeld van Unity Standard-arceringsstatistieken

Unity Standard Shader Statistics 1

Voorbeeld van mrtk-standaard-arceringsstatistieken

MRTK Standard Shader Statistics 2

Zie ook

Unity

Windows Mixed Reality

Oculus

Mesh-optimalisatie