Prestazioni - MRTK2

Guida introduttiva

Il modo più semplice per razionalizzare le prestazioni è tramite framerate o quante volte l'applicazione può eseguire il rendering di un'immagine al secondo. È importante soddisfare il framerate di destinazione, come descritto dalla piattaforma di destinazione (ad esempio Windows Mixed Reality, Oculus e così via). Ad esempio, in HoloLens, il framerate di destinazione è 60 FPS. Le applicazioni con framerate ridotto possono causare un peggioramento delle esperienze utente, ad esempio la stabilizzazione dell'ologramma peggiorata, il rilevamento del mondo, il rilevamento delle mani e altro ancora. Per consentire agli sviluppatori di tenere traccia e ottenere il framerate di qualità, Realtà mista Toolkit offre un'ampia gamma di strumenti e script.

Profiler visivo

Per tenere continuamente traccia delle prestazioni durante la durata dello sviluppo, è consigliabile visualizzare sempre un oggetto visivo framerate durante l'esecuzione di & debug di un'applicazione. Realtà mista Toolkit fornisce lo strumento di diagnostica di Visual Profiler che fornisce informazioni in tempo reale sull'utilizzo corrente di FPS e memoria nella visualizzazione applicazione. Visual Profiler può essere configurato tramite le impostazioni di sistema di diagnostica nel controllo profili MRTK.

Inoltre, è particolarmente importante usare Visual Profiler per tenere traccia del framerate durante l'esecuzione nel dispositivo anziché in esecuzione nell'editor di Unity o in un emulatore. I risultati delle prestazioni più accurati verranno illustrati quando vengono eseguiti nel dispositivo con build di configurazione versione.

Nota

Se si compila per Windows Mixed Reality, distribuire con build di configurazione MASTER.

Interfaccia di Visual Profiler

Finestra Di ottimizzazione

La finestra di ottimizzazione MRTK offre informazioni e strumenti di automazione per aiutare gli sviluppatori di realtà mista a configurare l'ambiente per ottenere risultati migliori e identificare potenziali colli di bottiglia nella loro scena & asset. Alcune configurazioni chiave in Unity possono offrire risultati notevolmente più ottimizzati per i progetti di realtà mista.

In genere, queste impostazioni comportano configurazioni di rendering ideali per la realtà mista. Le applicazioni di realtà mista sono uniche rispetto allo sviluppo di grafica 3D tradizionale in cui sono presenti due schermi (ad esempio due occhi) per eseguire il rendering per l'intera scena.

Le impostazioni consigliate a cui si fa riferimento di seguito possono essere configurate automaticamente in un progetto Unity sfruttando la finestra di ottimizzazione MRTK.

Impostazioni della finestra di ottimizzazione MRTK

Unity Profiler

Unity Profiler è uno strumento utile per analizzare i dettagli delle prestazioni dell'applicazione a livello di frame.

Tempo trascorso sulla CPU

Esempio di Graph di Unity Profiler

Per mantenere le velocità di frame confortevoli (in genere 60 fotogrammi al secondo), le applicazioni devono ottenere un tempo massimo di 16,6 millisecondi di tempo della CPU. Per identificare il costo della funzionalità MRTK, Microsoft Realtà mista Toolkit contiene un indicatore per i percorsi di codice del ciclo interno (per fotogramma). Questi marcatori usano il formato seguente per facilitare la comprensione delle funzionalità specifiche usate:

[MRTK] className.methodName

Nota

Potrebbero essere presenti dati aggiuntivi che seguono il nome del metodo. Questa operazione viene usata per identificare in modo condizionale le funzionalità potenzialmente costose che possono essere evitate da piccole modifiche al codice dell'applicazione.

Gerarchia di Unity Profiler di esempio

In questo esempio la gerarchia è stata espansa per mostrare che il metodo UpdateHandData della classe WindowsMixedRealityArticulatedHand richiede 0,44 ms di tempo della CPU durante l'analisi del frame. Questi dati possono essere usati per determinare se un problema di prestazioni è correlato al codice dell'applicazione o da un'altra posizione del sistema.

È consigliabile che gli sviluppatori strumentino il codice dell'applicazione in modo simile. Le aree principali dello stato attivo per la strumentazione del codice dell'applicazione si trovano all'interno dei gestori eventi perché questi metodi vengono addebitati al ciclo di aggiornamento MRTK come eventi vengono generati. I tempi di frame elevati all'interno del ciclo di aggiornamento MRTK possono essere indicativi di codice costoso nei metodi del gestore eventi.

rendering Single-Pass Istanza

La configurazione di rendering predefinita per XR in Unity è Multi-pass. Questa impostazione indica a Unity di eseguire l'intera pipeline di rendering due volte, una volta per ogni occhio. Questa opzione può essere ottimizzata selezionando il rendering con istanza pass singola . Questa configurazione sfrutta le matrici di destinazione di rendering per poter eseguire una singola chiamata di disegno che le istanze nella destinazione di rendering appropriata per ogni occhio. Questa modalità consente inoltre di eseguire tutto il rendering in una singola esecuzione della pipeline di rendering. Quindi, selezionando il rendering a istanza singola come percorso di rendering per un'applicazione di realtà mista, è possibile risparmiare tempo significativo sulla GPU & CPU ed è la configurazione di rendering consigliata.

Tuttavia, per emettere una singola chiamata di disegno per ogni mesh a ogni occhio, l'instancing della GPU deve essere supportato da tutti gli shader. L'instancing consente alla GPU di disegnare chiamate multiplex in entrambi gli occhi. Gli shader predefiniti di Unity e lo shader standard MRTK per impostazione predefinita contengono le istruzioni di instancing necessarie nel codice shader. Se si scrivono shader personalizzati per Unity, potrebbe essere necessario aggiornare questi shader per supportare il rendering con istanza pass singola.

Codice di esempio per custom 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;
}

Impostazioni di qualità

Unity fornisce set di impostazioni per controllare la qualità del rendering per ogni endpoint della piattaforma. Questi set di impostazioni controllano quali funzionalità grafiche possono essere abilitate, ad esempio ombreggiature, anti-aliasing, illuminazione globale e altro ancora. È consigliabile ridurre queste impostazioni e ottimizzare il numero di calcoli eseguiti durante il rendering.

Passaggio 1: Aggiornare i progetti Unity di realtà mista per usare l'impostazione a livello di bassa qualità
Modifica>Impostazioni progetto, quindi selezionare la categoria >Qualità selezionare Bassa qualità per la piattaforma UWP

Passaggio 2: Per ogni file di scena unity, disabilitare l'illuminazione globale in tempo reale
Finestra>Rendering>Impostazioni> di illuminazioneDeselezionare l'illuminazione globale in tempo reale

Condivisione del buffer di profondità (HoloLens)

Se si sviluppa per la piattaforma Windows Mixed Reality e in particolare HoloLens, l'abilitazione della condivisione del buffer di profondità in Impostazioni XR può essere utile per la stabilizzazione dell'ologramma. Tuttavia, l'elaborazione del buffer di profondità può comportare un costo delle prestazioni, in particolare se si usa il formato di profondità a 24 bit. È quindi consigliabile configurare il buffer di profondità in precisione a 16 bit.

Se z-fighting si verifica a causa del formato di bit inferiore, verificare che il piano di clip lontano di tutte le fotocamere sia impostato sul valore più basso possibile per l'applicazione. Unity per impostazione predefinita imposta un piano di clip lontano di 1000m. In HoloLens un piano di clip di 50m è in genere più sufficiente per la maggior parte degli scenari dell'applicazione.

Nota

Se si usa un formato di profondità a 16 bit, gli effetti necessari del buffer stencil non funzioneranno perché Unity non crea un buffer stencil in questa impostazione. Se si seleziona un formato di profondità a 24 bit , in genere si creerà un buffer stencil a 8 bit, se applicabile nella piattaforma grafica dell'endpoint.

Se si usa un componente Mask che richiede il buffer stencil, prendere in considerazione l'uso di RectMask2D , che non richiede il buffer stencil e quindi può essere usato insieme a un formato di profondità a 16 bit.

Nota

Per determinare rapidamente quali oggetti in una scena non scrivono nel buffer di profondità visivamente, è possibile usare l'utilità Buffer profondità di rendering in Impostazioni editor nel profilo di configurazione MRTK.

Ottimizzare i dati mesh

Le impostazioni di Optimize Mesh Data tentano di rimuovere gli attributi del vertice inutilizzati all'interno dell'applicazione. L'impostazione esegue questa operazione eseguendo ogni passaggio shader in ogni materiale che si trova su ogni mesh nella compilazione. Questo è buono per le dimensioni dei dati del gioco e le prestazioni di runtime, ma può ostacolare drasticamente i tempi di compilazione.

È consigliabile disabilitare questa impostazione durante lo sviluppo e riabilitare durante la creazione della compilazione "Master". L'impostazione è disponibile in Modifica>impostazioni progettoLettore>altre impostazioni>>Ottimizza dati mesh.

Indicazioni generali

Le prestazioni possono essere una sfida ambigua e costantemente cambiata per sviluppatori di realtà mista e lo spettro di conoscenze per razionalizzare le prestazioni è vasto. Esistono alcuni consigli generali per comprendere come approcciare le prestazioni per un'applicazione.

È utile semplificare l'esecuzione di un'applicazione nelle parti eseguite sulla CPU o sulla GPU e quindi identificare se un'app è associata a entrambi i componenti. Possono essere presenti colli di bottiglia che si estendono sia nelle unità di elaborazione che in alcuni scenari univoci che devono essere esaminati attentamente. Tuttavia, per iniziare, è consigliabile comprendere dove un'applicazione viene eseguita per la maggior parte del tempo.

GPU associata

Poiché la maggior parte delle piattaforme per le applicazioni di realtà mista usa il rendering stereoscopico, è molto comune essere vincolata dalla GPU a causa della natura del rendering di uno schermo "double-wide". Futhermore, piattaforme di realtà mista mobile come HoloLens o Oculus Quest saranno limitate dalla CPU di classe mobile & potenza di elaborazione GPU.

Quando si concentra sulla GPU, esistono in genere due fasi importanti che un'applicazione deve completare ogni frame.

  1. Eseguire il vertex shader
  2. Eseguire lo shader pixel (noto anche come frammento shader)

Senza approfondire il campo complesso della grafica artificiale & pipeline di rendering, ogni fase shader è un programma che viene eseguito sulla GPU per produrre quanto segue.

  1. Vertex shader trasforma i vertici mesh in coordinate nello spazio dello schermo (ad esempio il codice eseguito per vertice)
  2. Gli shader pixel calcolano il colore da disegnare per un determinato frammento pixel e mesh (ad esempio codice eseguito per pixel)

Per quanto riguarda l'ottimizzazione delle prestazioni, in genere è più proficuo concentrarsi sull'ottimizzazione delle operazioni nel pixel shader. Un'applicazione potrebbe dover disegnare solo un cubo che sarà solo 8 vertici. Tuttavia, lo spazio dello schermo che occupa il cubo è probabilmente nell'ordine di milioni di pixel. Pertanto, riducendo il codice shader, si dice che 10 operazioni possono risparmiare molto più lavoro se ridotto sul pixel shader rispetto al vertex shader.

Questo è uno dei motivi principali per sfruttare lo shader STANDARD MRTK , poiché questo shader esegue in genere molte meno istruzioni per pixel & vertice rispetto allo shader Unity Standard, ottenendo risultati estetici paragonabili.

Ottimizzazioni CPU Ottimizzazioni GPU
Logica di simulazione delle app Operazioni di rendering
Semplificare la fisica Ridurre i calcoli di illuminazione
Semplificare le animazioni Ridurre il numero poligono & # di oggetti disegnabili
Gestire Garbage Collection Ridurre # di oggetti trasparenti
Riferimenti alla cache Evitare effetti post-elaborazione/schermo intero

Disegno chiamata instancing

Uno degli errori più comuni in Unity che riduce le prestazioni è clonare i materiali in fase di esecuzione. Se GameObjects condivide lo stesso materiale e/o è la stessa mesh, può essere ottimizzato in singole chiamate di disegno tramite tecniche come batch statico, batch dinamico e instancing GPU. Tuttavia, se le proprietà di modifica dello sviluppatore del materiale di un Renderer in fase di esecuzione, Unity creerà una copia clone del materiale assegnato.

Ad esempio, se in una scena sono presenti 100 cubi, uno sviluppatore potrebbe voler assegnare un colore univoco a ognuno in fase di esecuzione. L'accesso a renderer.material.color in C# creerà un nuovo materiale in memoria per questo particolare renderer/GameObject. Ognuno dei 100 cubi avrà il proprio materiale e pertanto non può essere unito in una chiamata di disegno, ma diventerà invece 100 richieste di chiamata di disegno dalla CPU alla GPU.

Per superare questo ostacolo e assegnare ancora un colore univoco per cubo, gli sviluppatori devono sfruttare 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);
}

Strumenti per le prestazioni di Unity

Unity offre strumenti di prestazioni ottimali integrati nell'editor.

Se si stima il compromesso delle prestazioni approssimative tra uno shader e un altro, è utile compilare ogni shader e visualizzare il numero di operazioni per ogni fase shader. Questa operazione può essere eseguita selezionando un asset shader e facendo clic sul pulsante Compila e mostra codice . Verrà compilata tutte le varianti dello shader e aprirà visual studio con i risultati. Nota: i risultati della statistica prodotti possono variare a seconda delle caratteristiche abilitate sui materiali che usano lo shader specificato. Unity compila solo le varianti dello shader direttamente usate nel progetto corrente.

Esempio di statistiche di Unity Standard shader

Statistiche di Unity Standard Shader 1

Esempio di statistiche dello shader standard MRTK

Statistiche di MRTK Standard Shader 2

Vedi anche

Unity

Windows Mixed Reality

Oculus

Ottimizzazione mesh