Delen via


Prestaties — MRTK2

Aan de slag

De eenvoudigste manier om prestaties te rationaliseren is via de framerate of hoe vaak uw toepassing een afbeelding per seconde kan weergeven. Het is belangrijk om te voldoen aan de doelframerate, zoals beschreven door het platform waarop het doel 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 behalen van een framerate van hoge 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 & foutopsporing van een toepassing. Mixed Reality Toolkit biedt het diagnostische hulpprogramma Visual Profiler dat realtime informatie geeft over het huidige FPS- en geheugengebruik in de toepassingsweergave. De Visual Profiler kan worden geconfigureerd via de diagnostische systeeminstellingen onder de CONTROLE VAN MRTK-profielen.

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

Opmerking

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 potentiële knelpunten in hun scène & assets te identificeren. Bepaalde sleutelconfiguraties in Unity kunnen helpen om aanzienlijk meer geoptimaliseerde resultaten te leveren voor mixed reality-projecten.

Over het algemeen omvatten deze instellingen renderingconfiguraties die ideaal zijn voor mixed reality. Mixed reality-toepassingen zijn uniek in vergelijking met traditionele 3D-grafische ontwikkeling, omdat er twee schermen (d.w.w. 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-venster optimaliseren.

Vensterinstellingen voor MRTK 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 te behouden (meestal 60 frames per seconde), moeten toepassingen een maximale frametijd van 16,6 milliseconden CPU-tijd bereiken. Microsoft Mixed Reality Toolkit bevat een markering voor interne lus (per frame) codepaden 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

Opmerking

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 ergens anders in het systeem.

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

weergave met exemplaar van Single-Pass

De standaardweergaveconfiguratie voor XR in Unity is Multi-pass. Met deze instelling geeft Unity de opdracht om de volledige renderpijplijn 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 in het juiste renderdoel voor elk oog wordt weergegeven. 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 als de aanbevolen renderingconfiguratie.

Als u echter één draw-aanroep wilt uitvoeren voor elke 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 instructies voor instancing in shader-code. Als u echter aangepaste shaders schrijft voor Unity, moeten deze shaders mogelijk worden bijgewerkt om single pass instanced rendering 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 presets om de kwaliteit van de rendering voor elk platformeindpunt te beheren. 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> Kwaliteit Selecteer Lage kwaliteit voor het UWP-platform

Stap 2: Schakel voor elk Unity-scènebestand de globale verlichting in realtime uit
Venster>Weergave>Verlichtingsinstellingen>Schakel 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 Dieptebuffer delen onder XR-instellingen helpen bij het stabiliseren van hologrammen. Voor de verwerking 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 tot 16-bits precisie.

Als z-fighting optreedt vanwege de lagere bitindeling, 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 meter over het algemeen meer dan genoeg voor de meeste toepassingsscenario's.

Opmerking

Als u een 16-bits diepteindeling gebruikt, werken vereiste effecten voor stencilbuffers niet omdat Unity in deze instelling geen stencilbuffer maakt . Als u omgekeerd een 24-bits diepte-indeling selecteert, wordt over het algemeen een 8-bits stencilbuffer gemaakt, indien van toepassing op het platform voor eindpuntafbeeldingen.

Als u een onderdeel Masker gebruikt waarvoor de stencilbuffer is vereist, kunt u overwegen in plaats daarvan RectMask2D te gebruiken, waarvoor de stencilbuffer niet is vereist en dus kan worden gebruikt in combinatie met een 16-bits diepte-indeling.

Opmerking

Als u snel wilt bepalen welke objecten in een scène niet visueel 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 voor 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 net in de build bevindt. Dit is goed voor de grootte van gamegegevens en runtimeprestaties, maar kan de buildtijden drastisch belemmeren.

Het wordt aanbevolen om deze instelling tijdens de ontwikkeling uit te schakelen en opnieuw in te schakelen tijdens het maken van de master-build. 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 om prestaties te rationaliseren is enorm. Er zijn echter enkele algemene aanbevelingen voor het begrijpen van de prestaties voor 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 is gebonden door een van de onderdelen. 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 gebruikmaken van stereoscopische rendering, is het heel gebruikelijk om GPU-gebonden te zijn vanwege de aard van het weergeven van een 'dubbelbreed' scherm. Bovendien worden mobiele mixed reality-platforms zoals HoloLens of Oculus Quest beperkt door de 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-arcering uitvoeren
  2. De pixel-arcering uitvoeren (ook wel de fragment-arcering 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-arceringen transformeren mesh-hoekpunten naar coördinaten in schermruimte (bijvoorbeeld code die per hoekpunt wordt uitgevoerd)
  2. Pixel-arceringen berekenen de kleur die moet worden getekend voor een bepaalde pixel en mesh-fragment (bijvoorbeeld code uitvoeren per pixel)

Met betrekking tot het afstemmen van prestaties is het meestal beter om u te richten op het optimaliseren van de bewerkingen in de pixel-shader. Een toepassing hoeft mogelijk alleen een kubus te tekenen die slechts 8 hoekpunten bevat. De schermruimte die de kubus inneemt, is echter waarschijnlijk in de orde van miljoenen pixels. Als u de arceringscode vermindert met bijvoorbeeld 10 bewerkingen, kunt u aanzienlijk meer werk besparen als u de pixel-arcering vermindert dan de hoekpuntschaduw.

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 uitvoert & hoekpunt dan de Unity Standard-shader, 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 voorkomen

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 hetzelfde mesh zijn, kunnen ze worden geoptimaliseerd tot aanroepen met één tekenbewerking via technieken zoals statische batching, 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 een scène bijvoorbeeld 100 kubussen bevat, 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 kan dus niet worden samengevoegd tot één draw-aanroep, maar in plaats daarvan worden 100 callaanvragen van de CPU naar de GPU.

Om dit obstakel te overwinnen en toch een unieke kleur per kubus toe te wijzen, moeten ontwikkelaars MaterialPropertyBlock gebruiken.

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

Hulpprogramma's voor Unity-prestaties

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

Als u een schatting maakt van de ruwe prestatie-afweging tussen de ene en de andere arcering, is het handig om elke arcering 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 worden alle arceringsvarianten gecompileerd en visual studio geopend met de resultaten. Opmerking: De statistische resultaten die worden geproduceerd, kunnen variëren, afhankelijk van welke functies zijn ingeschakeld voor materialen die gebruikmaken van de gegeven arcering. 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 Standard-arceringsstatistieken

MRTK Standard Shader Statistics 2

Zie ook

Eenheid

Windows Mixed Reality

Oculus

Mesh-optimalisatie