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.
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.
Unity Profiler
De Unity Profiler is een handig hulpprogramma om details van toepassingsprestaties op frame-voor-frameniveau te onderzoeken.
Tijd besteed aan de CPU
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.
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.
Aanbevolen instellingen voor Unity
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.
- De hoekpunt-arcering uitvoeren
- 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.
- Hoekpunt-arceringen transformeren mesh-hoekpunten naar coördinaten in schermruimte (bijvoorbeeld code die per hoekpunt wordt uitgevoerd)
- 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
Voorbeeld van MRTK Standard-arceringsstatistieken
Zie ook
Eenheid
- Unity Performance Optimization voor beginners
- Zelfstudies voor Unity Performance Optimization
- Aanbevolen procedures voor Unity Optimization
- Grafische prestaties optimaliseren
- Praktische handleiding voor mobiele optimalisatie
Windows Mixed Reality
- Aanbevolen instellingen voor Unity
- Inzicht in prestaties voor Mixed Reality
- Prestatieaanbeveling voor Unity
- Handleiding gebeurtenistracering voor Windows Unity