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 degradata se l'applicazione non viene eseguita a una frequenza ottimale dei fotogrammi. Ologrammi apparirà instabile e il rilevamento head 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.

I valori di framerate efficienti per ogni piattaforma di destinazione sono elencati di seguito.

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

Il framework seguente descrive le procedure consigliate per raggiungere i tassi di frame di destinazione. Per suggerimenti sulla misurazione e il miglioramento del framerate nell'ambiente Unity, è consigliabile leggere le raccomandazioni sulle prestazioni per l'articolo di Unity

Informazioni sui colli di bottiglia delle prestazioni

Se l'app ha un framerate inferiore, il primo passaggio consiste nell'analizzare e comprendere dove l'applicazione è intensivo a livello di calcolo. Esistono due processori primari responsabili del lavoro per eseguire il rendering della scena: la CPU e la GPU, ognuno dei 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. Eseguire il rendering del thread - CPU alla 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 : gestisce in genere 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 alla schermata del dispositivo.

Lifetime of a Frame

In genere, le applicazioni HoloLens saranno associate alla GPU, ma non sempre. Usare gli strumenti e le tecniche seguenti per comprendere dove è in bottiglia l'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 dettagliate sulla profilatura per l'applicazione:

Come profilare in qualsiasi ambiente

Un modo per determinare se l'app è associata a GPU o CPU è quella di ridurre la risoluzione dell'output di 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 un esempio su per visualizzare l'immagine finale.

Dopo aver abbassato la risoluzione del rendering, se:

  1. Aumento del framerate delle applicazioni, quindi è probabile che la GPU sia associata
  2. Framerate dell'applicazione invariato, quindi è probabile che il limite della CPU

Nota

Unity consente di modificare facilmente la risoluzione di 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 esempirà l'output di risoluzione inferiore per creare un'immagine di risoluzione più elevata 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 del lavoro in un'applicazione di realtà mista sulla 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 di 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 il framerate è migliorato.
    • Per identificare le limitazioni della frequenza di riempimento, ridurre la risoluzione dello schermo e verificare se il framerate migliora.

Nota

Se si usa Unity, vedere i consigli sulle prestazioni della GPU specifici di Unity. - In Unity usare la proprietà XRSettings.renderViewportScale

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

  1. Risoluzioni di trama 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 rendering finale, tra cui:

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

Ridurre il numero poligono

I conteggi 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 della geometria costosa, ma il conteggio poligono è la metrica più semplice per determinare quanto lavoro porterà a eseguire il rendering di una scena.

Limitare le sovrapposizioni

L'overdraw elevato si verifica quando vengono visualizzati più oggetti ma non visualizzati sullo schermo mentre sono nascosti da un oggetto occluding. Imagine guardare una parete 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

Shader sono programmi di piccole dimensioni che vengono eseguiti sulla GPU ed eseguire due passaggi importanti nel rendering:

  1. Determinazione dei vertici da disegnare e dove si trovano nello spazio dello schermo (vertex shader)
    • Il vertex shader viene eseguito per vertice per ogni mesh.
  2. Determinazione del colore di ogni pixel (pixel shader)
    • 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, vengono anche con un prezzo. La riduzione del numero di operazioni calcolate in shader può ridurre notevolmente il lavoro necessario per la GPU per ogni frame.

Raccomandazioni per la codifica shader
  • Usare il filtro bilineare, ogni volta che possibile
  • Riorganizzare le espressioni per usare gli intrinseci MAD per eseguire una moltiplicazione e un aggiunta contemporaneamente
  • Precalcolato il più possibile sulla CPU e passare le costanti al materiale
  • Spostamento delle operazioni dal pixel shader al vertex shader
    • In genere, il numero di vertici è molto più piccolo del numero di pixel (720p è 921.600 pixel, 1080p è 2.073.600 pixel e così via)

Rimuovere le fasi della GPU

Gli effetti post-elaborazione possono essere costosi e aumentare la frequenza di riempimento dell'applicazione, incluse le tecniche 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 causare 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 pool di oggetti è una tecnica popolare per ridurre il costo delle allocazioni continue e 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