Prestanda – MRTK2

Komma igång

Det enklaste sättet att rationalisera prestanda är via framerate eller hur många gånger programmet kan rendera en bild per sekund. Det är viktigt att uppfylla målramhastigheten, vilket beskrivs av den plattform som riktas (dvs. Windows Mixed Reality, Oculus osv.). På HoloLens är till exempel målramhastigheten 60 FPS. Program med låg ramhastighet kan resultera i försämrade användarupplevelser, till exempel försämrad hologramstabilisering, världsspårning, handspårning med mera. För att hjälpa utvecklare att spåra och uppnå kvalitetsramhastighet tillhandahåller Mixed Reality Toolkit en mängd olika verktyg och skript.

Visuell profilerare

För att kontinuerligt spåra prestanda under utvecklingens livslängd rekommenderar vi starkt att du alltid visar ett visuellt bildruteobjekt när du kör & felsöka ett program. Mixed Reality Toolkit tillhandahåller diagnostikverktyget Visual Profiler som ger realtidsinformation om den aktuella FPS- och minnesanvändningen i programvyn. Visual Profiler kan konfigureras via inställningarna för diagnostiksystem under MRTK-profilkontroll.

Dessutom är det särskilt viktigt att använda Visual Profiler för att spåra framerate när den körs på enheten i stället för att köras i Unity-redigeraren eller en emulator. De mest exakta prestandaresultaten visas när du kör på enheten med versionskonfigurationsversioner.

Anteckning

Om du skapar för Windows Mixed Reality distribuerar du med MASTER-konfigurationsversioner.

Visual Profiler-gränssnitt

Optimera fönster

MRTK-optimeringsfönstret erbjuder informations- och automatiseringsverktyg som hjälper utvecklare med mixad verklighet att konfigurera sin miljö för bästa resultat och identifiera potentiella flaskhalsar i deras scen & tillgångar. Vissa viktiga konfigurationer i Unity kan hjälpa dig att leverera betydligt mer optimerade resultat för projekt med mixad verklighet.

I allmänhet omfattar de här inställningarna återgivningskonfigurationer som är idealiska för mixad verklighet. Program för mixad verklighet är unika jämfört med traditionell 3D-grafikutveckling eftersom det finns två skärmar (dvs. två ögon) att rendera för hela scenen.

De rekommenderade inställningarna som refereras nedan kan konfigureras automatiskt i ett Unity-projekt genom att använda MRTK-optimeringsfönstret.

OPTIMERA fönsterinställningar för MRTK

Unity Profiler

Unity Profiler är ett användbart verktyg för att undersöka information om programprestanda på ram-för-bildruta-nivå.

Tid som spenderas på processorn

Exempel på Unity Profiler Graph

För att bibehålla bekväma bildfrekvenser (vanligtvis 60 bildrutor per sekund) måste programmen uppnå en maximal tidsram på 16,6 millisekunder cpu-tid. För att identifiera kostnaden för MRTK-funktioner innehåller Microsoft Mixed Reality Toolkit en markörer för inre loop (per ram) kodsökvägar. De här markörer använder följande format för att förstå de specifika funktioner som används:

[MRTK] className.methodName

Anteckning

Det kan finnas ytterligare data som följer metodnamnet. Detta används för att identifiera villkorligt utförda, potentiellt dyra funktioner som kan undvikas genom små ändringar i programkoden.

Exempel på Unity Profiler-hierarki

I det här exemplet har hierarkin expanderats för att visa att metoden UpdateHandData i klassen WindowsMixedRealityArticulatedHand förbrukar 0,44 ms CPU-tid under den bildruta som analyseras. Dessa data kan användas för att avgöra om ett prestandaproblem är relaterat till programkod eller från andra platser i systemet.

Vi rekommenderar starkt att utvecklare instrumentera programkod på ett liknande sätt. Primära fokusområden för programkodinstrumentation ligger inom händelsehanterare eftersom dessa metoder debiteras till MRTK-uppdateringsloopen när händelser aktiveras. Höga bildrutetider i MRTK-uppdateringsloopen kan vara ett tecken på dyr kod i händelsehanterarmetoder.

Single-Pass instansåtergivning

Standardåtergivningskonfigurationen för XR i Unity är Multi-pass. Den här inställningen instruerar Unity att köra hela återgivningspipelinen två gånger, en gång för varje öga. Detta kan optimeras genom att välja Enkel pass Instanced-återgivning i stället. Den här konfigurationen utnyttjar återgivning av målmatriser för att kunna utföra ett enda anrop som instanser till lämpligt återgivningsmål för varje öga. Dessutom gör det här läget att all återgivning kan göras i en enda körning av återgivningspipelinen. Därför kan du spara mycket tid på både CPU-& GPU och är den rekommenderade återgivningskonfigurationen genom att välja Enstaka pass-instanser som återgivningssökväg för ett mixed reality-program.

Men för att kunna utfärda ett enda draganrop för varje nät till varje öga måste GPU-instancing stödjas av alla skuggor. Med instancing kan GPU:n multiplexa anrop över båda ögonen. Unity-inbyggda skuggor samt MRTK Standard-skuggning innehåller som standard nödvändiga instancing-instruktioner i skuggningskoden. Om du skriver anpassade skuggor för Unity kan dessa skuggor behöva uppdateras för att stödja återgivning med enkel passinstans.

Exempelkod för anpassad skuggning

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

Kvalitetsinställningar

Unity tillhandahåller förinställningar för att styra renderingskvaliteten för varje plattformsslutpunkt. Dessa förinställningar styr vilka grafiska funktioner som kan aktiveras, till exempel skuggor, aliasskydd, global belysning med mera. Vi rekommenderar att du sänker inställningarna och optimerar antalet beräkningar som utförs under återgivningen.

Steg 1: Uppdatera Unity-projekt med mixad verklighet för att använda inställningen Låg kvalitetsnivå
Redigera>Projektinställningar och välj sedan kategorin >Kvalitet Välj låg kvalitet för UWP-plattformen

Steg 2: Inaktivera global belysning i realtid för varje Unity-scenfil
Fönstret>Rendering>Belysningsinställningar>Avmarkera Global belysning i realtid

Djupbuffertdelning (HoloLens)

Om du utvecklar för Windows Mixed Reality-plattformen och i synnerhet HoloLens kan det hjälpa att aktivera delning av djupbuffert under XR-inställningar med hologramstabilisering. Bearbetning av djupbufferten kan dock medföra en prestandakostnad, särskilt om du använder 24-bitars djupformat. Därför rekommenderar vi starkt att du konfigurerar djupbufferten till 16-bitars precision.

Om z-fighting inträffar på grund av det lägre bitformatet bekräftar du att det långt urklippsplanet för alla kameror är inställt på det lägsta möjliga värdet för programmet. Unity anger som standard ett långt klippplan på 1 000 meter. På HoloLens är ett långt klippplan på 50 m i allmänhet mer än tillräckligt för de flesta programscenarier.

Anteckning

Om du använder 16-bitars djupformat fungerar inte stencilbufferten som krävs eftersom Unity inte skapar en stencilbuffert i den här inställningen. Om du väljer 24-bitars djupformat omvänt skapas vanligtvis en 8-bitars stencilbuffert, om tillämpligt på slutpunktsgrafikplattformen.

Om du använder en maskkomponent som kräver stencilbufferten bör du överväga att använda RectMask2D i stället, vilket inte kräver stencilbufferten och därmed kan användas tillsammans med ett 16-bitars djupformat.

Anteckning

För att snabbt avgöra vilka objekt i en scen som inte skriver till djupbufferten visuellt kan man använda verktyget Render Depth Buffer under Redigerarinställningar i MRTK-konfigurationsprofilen.

Optimera Mesh-data

Inställningarna för Optimera meshdata försöker ta bort oanvända hörnattribut i ditt program. Inställningen utför detta genom att köra över varje skuggningspass i varje material som finns i varje nät i bygget. Detta är bra för speldatastorlek och körningsprestanda, men kan drastiskt hindra byggtider.

Vi rekommenderar att du inaktiverar den här inställningen under utveckling och återaktiverar när "Master" skapas. Inställningen finns under Redigera>projektinställningar>Spelare>Andra inställningar>Optimera mesh-data.

Allmänna rekommendationer

Prestanda kan vara en tvetydig och ständigt föränderlig utmaning för utvecklare av mixad verklighet och spektrumet av kunskap för att rationalisera prestanda är stort. Det finns dock några allmänna rekommendationer för att förstå hur du närmar dig prestanda för ett program.

Det är användbart att förenkla körningen av ett program i de delar som körs på processorn eller GPU :n och därmed identifiera om en app begränsas av någon av komponenterna. Det kan finnas flaskhalsar som omfattar både bearbetningsenheter och vissa unika scenarier som måste undersökas noggrant. Men för att komma igång är det bra att förstå var ett program körs under den mesta tiden.

GPU avgränsad

Eftersom de flesta plattformar för program för mixad verklighet använder stereoskopisk återgivning är det mycket vanligt att GPU-begränsas på grund av att återgivningen är en "dubbelomfattande" skärm. Dessutom kommer mobila plattformar för mixad verklighet som HoloLens eller Oculus Quest att begränsas av processor i mobilklass & GPU-processorkraft.

När du fokuserar på GPU:n finns det vanligtvis två viktiga steg som ett program måste slutföra varje bildruta.

  1. Kör hörnskuggningen
  2. Kör pixelskuggaren (kallas även fragmentskuggning)

Utan djupdykning i det komplexa fältet med datorgrafik & renderingspipelines är varje skuggningssteg ett program som körs på GPU:n för att producera följande.

  1. Hörnskuggor transformerar näthörn till koordinater i skärmutrymme (t.ex. kod som körs per hörn)
  2. Pixelskuggare beräknar vilken färg som ska ritas för en viss pixel och ett nätfragment (t.ex. kod som körs per pixel)

När det gäller prestandajustering är det vanligtvis mer givande att fokusera på att optimera åtgärderna i pixelskuggningen. Ett program kanske bara behöver rita en kub som bara är 8 hörn. Skärmutrymmet som kuben upptar är dock troligtvis i storleksordningen miljontals bildpunkter. Att minska skuggningskoden genom att säga 10 åtgärder kan därför spara betydligt mer arbete om det minskas på pixelskuggaren än hörnskuggaren.

Det här är en av de främsta orsakerna till att använda MRTK Standard-skuggningen eftersom den här skuggningen vanligtvis kör många färre instruktioner per pixel & hörn än Unity Standard-skuggningen samtidigt som jämförbara estetiska resultat uppnås.

CPU-optimeringar GPU-optimeringar
Logik för appsimulering Återgivningsåtgärder
Förenkla fysiken Minska belysningsberäkningar
Förenkla animeringar Minska antalet polygoner & antal ritade objekt
Hantera skräpinsamling Minska antalet transparenta objekt
Cachereferenser Undvik efterbearbetning/helskärmseffekter

Dra samtals-instancing

Ett av de vanligaste misstagen i Unity som minskar prestanda är kloning av material vid körning. Om GameObjects delar samma material och/eller är samma nät kan de optimeras till anrop med enkel dragning via tekniker som statisk batchbearbetning, dynamisk batchbearbetning och GPU-instancing. Men om utvecklaren ändrar egenskaperna för en renderares material vid körning skapar Unity en klonkopia av det tilldelade materialet.

Om det till exempel finns 100 kuber i en scen kan en utvecklare vilja tilldela en unik färg till var och en vid körning. Åtkomsten till renderer.material.color i C# gör att Unity skapar ett nytt material i minnet för just den här renderaren/GameObject. Var och en av de 100 kuberna har sitt eget material och kan därför inte slås samman till ett anrop, utan blir i stället 100 anropsbegäranden från processorn till GPU:n.

För att lösa det här hindret och ändå tilldela en unik färg per kub bör utvecklare använda 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-prestandaverktyg

Unity tillhandahåller utmärkta prestandaverktyg som är inbyggda i redigeringsprogrammet.

Om du beräknar den ungefärliga prestandaavvägningen mellan en skuggning och en annan är det användbart att kompilera varje skuggning och visa antalet åtgärder per skuggningssteg. Du kan göra detta genom att välja en skuggningstillgång och klicka på knappen Kompilera och visa kod . Då kompileras alla skuggningsvarianter och Visual Studio öppnas med resultatet. Obs! Statistikresultaten kan variera beroende på vilka funktioner som har aktiverats på material som använder den givna skuggningen. Unity kompilerar bara de skuggningsvarianter som används direkt i det aktuella projektet.

Exempel på Unity Standard-skuggningsstatistik

Unity Standard Shader Statistics 1

Exempel på mrtk-standardskuggningsstatistik

MRTK Standard Shader Statistics 2

Se även

Unity

Windows Mixed Reality

Oculus

Nätoptimering