Informazioni sulle prestazioni per la realtà mista

Questo articolo è un'introduzione alla comprensione del significato delle prestazioni per l'app Realtà mista. L'esperienza utente può essere notevolmente danneggiata se l'applicazione non viene eseguita a una frequenza di fotogrammi ottimale. Gli ologrammi verranno visualizzati instabili e il rilevamento della testa dell'ambiente sarà impreciso, causando un'esperienza scarsa per l'utente. Le prestazioni devono essere considerate una funzionalità di prima classe per lo sviluppo di realtà mista e non un'attività lucida.

Di seguito sono elencati i valori di framerate con prestazioni elevate per ogni piattaforma di destinazione.

Piattaforma Frequenza dei fotogrammi di destinazione
HoloLens 60 FPS
PC Windows Mixed Reality Ultra 90 FPS
WINDOWS MIXED REALITY PC 60 FPS

Il framework seguente illustra le procedure consigliate per raggiungere la frequenza dei fotogrammi di destinazione. Per suggerimenti sulla misurazione e il miglioramento della frequenza dei fotogrammi nell'ambiente Unity, è consigliabile leggere l'articolo raccomandazioni sulle prestazioni per Unity

Informazioni sui colli di bottiglia delle prestazioni

Se l'app ha una frequenza dei fotogrammi inferiore, il primo passaggio consiste nell'analizzare e comprendere dove l'applicazione è a elevato utilizzo di calcolo. Esistono due processori principali responsabili del lavoro per il rendering della scena: la CPU e la GPU, ognuna delle quali gestisce aspetti diversi dell'app Realtà mista. I tre punti chiave in cui possono verificarsi colli di bottiglia sono:

  1. Thread dell'app - CPU - Responsabile della logica dell'app, tra cui l'elaborazione di input, animazioni, fisica e altra logica dell'app.
  2. Thread di rendering - CPU in GPU - Responsabile dell'invio delle chiamate di disegno alla GPU. Quando l'app vuole eseguire il rendering di un oggetto, ad esempio un cubo o un modello, questo thread invia una richiesta alla GPU per eseguire le operazioni.
  3. GPU : in genere gestisce la pipeline grafica dell'applicazione per trasformare i dati 3D (modelli, trame e così via) in pixel. In definitiva, produce un'immagine 2D da inviare allo schermo del dispositivo.

Durata di un frame

In genere, le applicazioni HoloLens saranno associate alla GPU, ma non sempre. Usa gli strumenti e le tecniche seguenti per capire dove è colli di bottiglia la tua app specifica.

Come analizzare l'applicazione

Esistono molti strumenti che consentono di comprendere il profilo delle prestazioni e i potenziali colli di bottiglia nell'applicazione di realtà mista.

Di seguito sono riportati alcuni strumenti comuni che consentono di raccogliere informazioni di profilatura approfondite per l'applicazione:

Come profilare in qualsiasi ambiente

Un modo per determinare se l'app è associata a GPU o CPU consiste nel ridurre la risoluzione dell'output della destinazione di rendering. Riducendo il numero di pixel da calcolare, si ridurrà il carico della GPU. Il dispositivo eseguirà il rendering in una trama più piccola, quindi eseguirà un esempio per visualizzare l'immagine finale.

Dopo aver abbassato la risoluzione del rendering, se:

  1. Aumenta la frequenza dei fotogrammi dell'applicazione, quindi è probabile che sia associato a GPU
  2. La frequenza dei fotogrammi dell'applicazione rimane invariata, quindi è probabile che sia associato cpu

Nota

Unity consente di modificare facilmente la risoluzione della destinazione di rendering dell'applicazione in fase di esecuzione tramite la proprietà XRSettings.renderViewportScale . L'immagine finale presentata nel dispositivo ha una risoluzione fissa. La piattaforma campionerà l'output con risoluzione inferiore per creare un'immagine ad alta risoluzione per il rendering nei display.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

Come migliorare l'applicazione

Consigli sulle prestazioni della CPU

In genere, la maggior parte delle operazioni in un'applicazione di realtà mista nella CPU comporta l'esecuzione della "simulazione" della scena e l'elaborazione della logica dell'applicazione. Le aree seguenti sono destinate all'ottimizzazione:

  • Animazioni
  • Fisica
  • Allocazioni di memoria
  • Algoritmi complessi (ad esempio inverse kinematics, path-finding)

Consigli sulle prestazioni della GPU

Informazioni sulla larghezza di banda e sulla frequenza di riempimento

Quando si esegue il rendering di un frame nella GPU, un'applicazione è associata alla larghezza di banda della memoria o alla frequenza di riempimento.

  • La larghezza di banda della memoria è la frequenza di letture e scritture che la GPU può eseguire dalla memoria
    • Per identificare le limitazioni della larghezza di banda, ridurre la qualità della trama e verificare se la frequenza dei fotogrammi è migliorata.
    • Per identificare le limitazioni della frequenza di riempimento, ridurre la risoluzione dello schermo e verificare se la frequenza dei fotogrammi migliora.

Nota

Se si usa Unity, vedere le raccomandazioni sulle prestazioni della GPU specifiche di Unity. - In Unity usare la proprietà XRSettings.renderViewportScale

La larghezza di banda della memoria comporta in genere ottimizzazioni per:

  1. Risoluzioni delle trame inferiori
  2. Usare meno trame (normali, speculari e così via)

La frequenza di riempimento è incentrata sulla riduzione del numero di operazioni che devono essere calcolate per un pixel di cui è stato eseguito il rendering finale, tra cui:

  1. Numero di oggetti da eseguire per il rendering o il processo
  2. Numero di operazioni per shader
  3. Numero di fasi GPU al risultato finale (geometry shader, effetti post-elaborazione e così via)
  4. Numero di pixel di cui eseguire il rendering (risoluzione dello schermo)

Ridurre il numero di poligoni

I conteggi dei poligoni più elevati comportano più operazioni per la GPU, quindi la riduzione del numero di poligoni nella scena riduce il tempo di rendering. Esistono altri fattori che rendono l'ombreggiatura costosa della geometria, ma il conteggio dei poligoni è la metrica più semplice per determinare il lavoro necessario per eseguire il rendering di una scena.

Limitare le sovrapposizioni

L'overdraw elevato si verifica quando viene eseguito il rendering di più oggetti ma non visualizzati sullo schermo perché sono nascosti da un oggetto occlusione. Immagina di guardare un muro che contiene oggetti dietro di esso. Tutte le geometrie verranno elaborate per il rendering, ma è necessario eseguire il rendering solo della parete opaca, che comporta operazioni non necessarie.

Shader

Gli shader sono piccoli programmi eseguiti sulla GPU ed eseguono due passaggi importanti per il rendering:

  1. Determinazione dei vertici da disegnare e della posizione in cui si trovano nello spazio dello schermo (vertex shader)
    • Il vertex shader viene eseguito per ogni vertice per ogni mesh.
  2. Determinazione del colore di ogni pixel (pixel shader)
    • Il pixel shader viene eseguito per pixel e sottoposto a rendering dalla geometria alla trama di rendering di destinazione.

In genere, gli shader eseguono molte trasformazioni e calcoli di illuminazione. Anche se modelli di illuminazione complessi, ombre e altre operazioni possono generare risultati fantastici, sono anche dotati di un prezzo. La riduzione del numero di operazioni calcolate negli shader può ridurre notevolmente il lavoro necessario per la GPU per frame.

Raccomandazioni per la scrittura del codice shader
  • Usare il filtro bilineare, quando possibile
  • Ridisporre le espressioni per usare oggetti intrinseci MAD per eseguire una moltiplicazione e un'aggiunta contemporaneamente
  • Precalcolate il più possibile sulla CPU e passate come costanti al materiale
  • Favorire le operazioni di spostamento dal pixel shader al vertex shader
    • In genere, il numero di vertici è molto inferiore al numero di pixel (720p è 921.600 pixel, 1080p è 2.073.600 pixel e così via)

Rimuovere le fasi gpu

Gli effetti post-elaborazione possono essere costosi e aumentare la frequenza di riempimento dell'applicazione, incluse tecniche di anti-aliasing come MSAA. In HoloLens è consigliabile evitare queste tecniche e fasi aggiuntive dello shader, ad esempio geometria, scafo e shader di calcolo.

Consigli sulla memoria

L'allocazione eccessiva della memoria e le operazioni di deallocazione possono comportare prestazioni incoerenti, frame bloccati e altri comportamenti dannosi. È particolarmente importante comprendere le considerazioni sulla memoria durante lo sviluppo in Unity, poiché la gestione della memoria è controllata dal Garbage Collector.

Pooling di oggetti

Il pooling di oggetti è una tecnica comune per ridurre il costo delle allocazioni continue e delle deallocazione degli oggetti. Viene eseguito allocando un pool di grandi dimensioni di oggetti identici e riutilizzando le istanze inattive disponibili di questo pool invece di generare ed eliminare costantemente gli oggetti nel tempo. I pool di oggetti sono la soluzione ideale per i componenti riutilizzabili con durata variabile durante l'esecuzione di un'app.

Vedi anche