Prestaties

Aan de slag

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

Visual Profiler

Als u de prestaties tijdens de ontwikkeling continu wilt bijhouden, is het raadzaam om altijd een framerate visual weer te geven tijdens het uitvoeren van & van een toepassing. De Mixed Reality Toolkit biedt het diagnostische hulpprogramma Visual Profiler dat realtime informatie geeft over de huidige FPS en het geheugengebruik in de toepassingsweergave. Visual Profiler kan worden geconfigureerd via het diagnosesysteem Instellingen de inspector MRTK-profielen.

Daarnaast is het met name belangrijk om visual profiler te gebruiken om framerate bij te houden bij het uitvoeren van het apparaat in plaats van in de Unity-editor of een emulator. De meest nauwkeurige prestatieresultaten worden weergegeven wanneer deze worden uitgevoerd op het apparaat met builds van releaseconfiguratie.

Notitie

Als u voor een Windows Mixed Reality, implementeert u met MASTER-configuratie-builds

Visual Profiler-interface

Venster Optimaliseren

Het MRTK Optimize Window biedt informatie en automatiseringshulpprogramma's om mixed reality ontwikkelaars te helpen hun omgeving in te stellen voor de best presterende resultaten en potentiële knelpunten in hun scène en assets & identificeren. Bepaalde belangrijke configuraties in Unity kunnen helpen 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 ontwikkeling van 3D-grafische afbeeldingen omdat er twee schermen zijn (dat wil zeggen twee ogen) om weer te geven voor de hele scène.

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

MrTK-venster optimaliseren Instellingen

Unity Profiler

De Unity Profiler is een handig hulpmiddel voor het onderzoeken van de prestaties van toepassingen op frame-voor-frameniveau.

Tijd besteed aan de CPU

Voorbeeld van Unity Profiler Graph

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

[MRTK] className.methodName

Notitie

Mogelijk volgen er aanvullende gegevens op de naam van de methode. 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 UpdateHandData-methode 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 ergens anders in het systeem.

Het wordt ten zeerste aanbevolen dat ontwikkelaars toepassingscode op een vergelijkbare manier instrumenteren. Primaire aandachtsgebieden voor instrumentatie van toepassingscode zijn binnen gebeurtenis-handlers, omdat deze methoden in rekening worden gebracht op de MRTK-updatelus wanneer gebeurtenissen worden verhoogd. Hoge frametijden binnen de MRTK-updatelus kunnen duiden op dure code in gebeurtenis-handlermethoden.

Single-Pass instanced rendering

De standaard renderingconfiguratie voor XR in Unity is Multi-Pass. Met deze instelling geeft u Unity de opdracht om de hele render-pijplijn twee keer voor elk oog uit te voeren. Dit kan worden geoptimaliseerd door in plaats daarvan Single Pass Instanced rendering te selecteren. Deze configuratie maakt gebruik van doel matrices voor renderen om één aanroep voor tekenen te kunnen uitvoeren die instanties naar het juiste renderdoel voor elk oog kan uitvoeren. Bovendien kan met deze modus alle rendering worden uitgevoerd in één uitvoering van de rendering-pijplijn. Als u dus Single Pass Instanced als renderingpad voor een mixed reality-toepassing selecteert, kan dit veel tijd besparen op zowel de CPU & GPU als de aanbevolen renderingconfiguratie.

Als u echter voor elk oog één aanroep voor tekenen wilt uitgeven, moet gpu-instancing worden ondersteund door alle shaders. Met instancing kan de GPU meerdere keren aanroepen tussen beide ogen tekenen. Ingebouwde Unity-shaders en de MRTK Standard-shader bevatten standaard de benodigde instructies voor het overspitsen van shaders in de shadercode. Als u echter aangepaste shaders schrijft voor Unity, moeten deze shaders mogelijk worden bijgewerkt om de rendering van single pass-instances te ondersteunen.

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 vooraf ingestelde instellingen om de kwaliteit van de rendering voor elk platform-eindpunt te bepalen. Met deze voorinstellingen kunt u bepalen welke grafische functies kunnen worden ingeschakeld, zoals schaduwen, anti-aliasing, wereldwijde ops en meer. Het is raadzaam om deze instellingen te verlagen en het aantal berekeningen te optimaliseren dat tijdens de rendering wordt uitgevoerd.

Stap 1: Werk mixed reality Unity-projecten bij om de instelling Niveau van lage kwaliteit te gebruiken
Bewerken > Project Instellingen vervolgens de categorie Kwaliteit > Selecteer Lage kwaliteit voor het UWP-platform

Stap 2: Schakel voor elk Unity-scènebestand realtime Global Unity uit
Venster > Rendering > Belichtings- Instellingen > Het selectievakje Realtime wereldwijde wereldwijde controle uit

Diepte buffer delen (HoloLens)

Als u ontwikkelt voor het Windows Mixed Reality-platform en met name HoloLens, kan het inschakelen van Dieptebuffer delen onder XR Instellingen helpen bij hologramstabilisatie. De verwerking van de dieptebuffer kan echter prestatiekosten met zich mee met zich mee, met name als u een 24-bits diepteindeling gebruikt. Daarom wordt het ten zeerste aanbevolen om de dieptebuffer te configureren op 16-bits precisie.

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

Notitie

Als u een 16-bits diepteindeling gebruikt, werkt de vereiste effecten van stencilbuffer niet omdat Unity in deze instelling geen stencilbuffer maakt. Als u daarentegen de 24-bits diepteindeling selecteert, wordt er meestal een 8-bits stencilbuffer aanmaken, indien van toepassing op het grafische eindpuntplatform.

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

Notitie

Als u snel wilt bepalen welke objecten in een scène niet visueel naar de dieptebuffer schrijven, kunt u het hulpprogramma Render Depth Buffer gebruiken onder de editor-Instellingen in het MRTK-configuratieprofiel.

Mesh-gegevens optimaliseren

De instellingen voor Mesh-gegevens optimaliseren proberen ongebruikte hoekpuntkenmerken in uw toepassing te verwijderen. De instelling voert dit uit door elke shader door te geven in elk materiaal dat zich op elke mesh in de build in de build. Dit is goed voor de grootte van gamegegevens en de prestaties van runtime, maar kan de buildtijden drastisch beïnvloeden.

Het is raadzaam deze instelling uit te schakelen tijdens de ontwikkeling en opnieuw in te schakelen tijdens het maken van de master-build. De instelling vindt u onder Edit > Project Instellingen > Player Other > Instellingen Optimize Mesh > Data.

Algemene aanbevelingen

Prestaties kunnen een dubbelzinnige en voortdurend veranderende uitdaging zijn mixed reality ontwikkelaars en het spectrum aan kennis om prestaties te rationaliseren is enorm. Er zijn echter enkele algemene aanbevelingen om te begrijpen hoe u de prestaties van een toepassing benadert.

Het is handig om de uitvoering van een toepassing te vereenvoudigen in de onderdelen die worden uitgevoerd op de CPU of de GPU en om zo te bepalen of een app wordt gebonden door een van beide onderdelen. Er kunnen knelpunten zijn die zowel verwerkingseenheden als enkele unieke scenario's bespannen 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 platformen voor mixed reality-toepassingen gebruikmaken van stereoscopic rendering,is het zeer 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-verwerkingskracht van mobiele & GPU.

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

  1. De hoekpunt-shader uitvoeren
  2. Voer de pixel-shader uit (ook wel bekend als de fragment-shader)

Zonder diep in te gaan op het complexe veld van computerafbeeldingen & renderingpijplijnen, is elke shaderfase een programma dat op de GPU wordt uitgevoerd om het volgende te produceren.

  1. Hoekpunt-shaders transformeren mesh-hoek punten naar coördinaten in de schermruimte (dat wil zeggen code uitgevoerd per hoekpunt)
  2. Pixel-shaders berekenen de kleur om te tekenen voor een bepaald pixel- en mesh-fragment (dat wil zeggen code uitvoeren per pixel)

Met betrekking tot het afstemmen van de prestaties is het meestal efficiënter om u te richten op het optimaliseren van de bewerkingen in de pixel-shader. Een toepassing hoeft alleen maar een kubus te tekenen die slechts 8 vertices zal zijn. De schermruimte die de kubus in beslag neemt, is echter waarschijnlijk in de orde van miljoenen pixels. Het verminderen van shadercode door bijvoorbeeld 10 bewerkingen kan aanzienlijk meer werk besparen als de pixel-shader minder is dan de hoekpunt-shader.

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

CPU-optimalisaties GPU-optimalisaties
App-simulatielogica Renderingbewerkingen
Fysica vereenvoudigen Belichtingsberekeningen verminderen
Animaties vereenvoudigen Het aantal veelhoeken & aantal drawable-objecten verminderen
Garbage collection beheren Aantal transparante objecten verminderen
Cacheverwijzingen Gevolgen na verwerking/volledig scherm voorkomen

Instancing van aanroepen tekenen

Een van de meest voorkomende fouten in Unity die de prestaties verminderen, is het klonen van materialen tijdens runtime. Als GameObjects hetzelfde materiaal delen en/of dezelfde mesh hebben, kunnen ze worden geoptimaliseerd voor enkelvoudige draw-aanroepen via technieken zoals statische batching, dynamische batching 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 een scène bijvoorbeeld 100 kubussen heeft, wil een ontwikkelaar elke scène tijdens runtime een unieke kleur toewijzen. Door de toegang tot renderer.material.color in C# maakt Unity een nieuw materiaal in het geheugen voor deze specifieke renderer/GameObject. Elk van de 100 kubussen heeft een eigen materiaal en kan dus niet worden samengevoegd in één draw-aanroep, maar wordt in plaats daarvan 100 aanroepaanvragen van de CPU naar de GPU.

Ontwikkelaars moeten MaterialPropertyBlockgebruiken om dit obstakel te overwinnen en nog steeds een unieke kleur per kubus toe te wijzen.

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

Prestatiehulpprogramma's van Unity

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

Als u de ruwe balans tussen de prestaties tussen de ene en de andere shader inschat, is het handig om elke shader te compileren en het aantal bewerkingen per shaderfase weer te geven. U kunt dit doen door een shader-asset te selecteren en op de knop Code compileren en weergeven te klikken. Hiermee compileert u alle shadervarianten en opent u Visual Studio met de resultaten. Opmerking: de geproduceerde resultaten van statistieken kunnen variëren, afhankelijk van welke functies zijn ingeschakeld op materialen die gebruikmaken van de opgegeven shader. Unity compileert alleen de shadervarianten die rechtstreeks in het huidige project worden gebruikt.

Voorbeeld van statistieken van Unity Standard-shader

Unity Standard Shader Statistics 1

Voorbeeld van statistieken van MRTK Standard-shader

MrTK Standard Shader Statistics 2

Zie ook

Unity

Windows Mixed Reality

Oculus

Mesh-optimalisatie