Novità sui prodotti

Ottimizzazione delle prestazioni per Android XR con Unity

Tempo di lettura: 6 min
Visualizza il profilo di Luke Hopkins
Luke Hopkins Developer Relations Engineer, Android

Samsung Galaxy XR è arrivato, con tecnologia Android XR. Questo blog post fa parte della nostra Android XR Spotlight Week, in cui forniamo risorse (blog post, video, codice campione e altro ancora) progettate per aiutarti a imparare, creare e preparare le tue app per Android XR.  

Questa settimana, Samsung ha lanciato Galaxy XR, realizzato in collaborazione con Google e Qualcomm. Questo è un momento entusiasmante per gli sviluppatori e vogliamo aiutarti a ottenere il massimo rendimento dalla tua app XR.

Sebbene le prestazioni scadenti di giochi e app su dispositivi non XR possano essere frustranti per l'utente, nel mondo XR le prestazioni non sono solo facoltative, ma sono fondamentali per il successo della tua app. Se non raggiungi la frequenza fotogrammi target in XR, possono verificarsi problemi molto più gravi, come la cinetosi. 

In questa guida, ti illustreremo le ottimizzazioni delle prestazioni essenziali che devi comprendere per lo sviluppo di Android XR. Scoprirai quali funzionalità offrono i maggiori miglioramenti delle prestazioni, quando utilizzarle e come interagiscono per aiutarti a raggiungere i tuoi obiettivi di frequenza fotogrammi.

Ecco i nostri obiettivi: 

  • Minimo: 72 f/s (parte delle nostre norme sulla qualità di gioco)
  • Facoltativo: 90 f/s con un budget di 11 ms per frame

Per saperne di più sul motivo per cui è importante mantenere una frequenza fotogrammi così elevata, consulta le nostre linee guida sul rendimento.   

Funzionalità di prestazioni specifiche per XR

Inizieremo con due funzionalità di prestazioni specifiche per XR: rendering foveated e sottocampionamento Vulkan. 

Rendering foveated

Il rendering foveated è un'ottimizzazione che prevede due modalità. La prima è una modalità statica che esegue il rendering del centro dello schermo a una risoluzione più elevata e riduce progressivamente la risoluzione man mano che ti allontani.

La seconda è la modalità di tracciamento oculare, che esegue il rendering dell'area che stai guardando in modo dettagliato, riducendo al contempo la qualità visualizzata nelle periferiche. In sostanza, imita il funzionamento della visione umana, in cui vediamo i dettagli solo nell'area specifica su cui ci concentriamo.

Il rendering foveated riduce notevolmente il carico di lavoro della GPU senza sacrificare la qualità dell'immagine percepita dall'utente. La bellezza del foveated rendering è che gli utenti non noteranno la qualità ridotta nella loro visione periferica, ma la tua GPU noterà sicuramente il miglioramento delle prestazioni.

Immagina di creare un'esperienza museale con manufatti 3D complessi. Senza il foveated rendering, sarebbe difficile mantenere 90 fps cercando di eseguire il rendering di tutto ciò che si trova nel "campo visivo". Con il foveated rendering, puoi mantenere i dettagli ad alto numero di poligoni dove l'utente sta guardando, ma l'ambiente di sfondo viene visualizzato con una qualità inferiore. I tuoi utenti non noteranno la differenza, ma avrai lo spazio necessario per aggiungere ulteriori dettagli alla scena.

Sottocampionamento Vulkan

Il sottocampionamento Vulkan è il miglior alleato del rendering foveated. Mentre il foveated rendering decide cosa eseguire il rendering a diversi livelli di qualità, il sottocampionamento Vulkan gestisce il modo in cui eseguire il rendering dei diversi livelli di qualità in modo efficiente utilizzando le mappe di densità dei frammenti.

Se combinato con il rendering foveated, il sottocampionamento Vulkan offre un ulteriore aumento delle prestazioni di 0,5 ms. Inoltre, aiuta a smussare i bordi frastagliati nella visione periferica, rendendo l'immagine complessiva più nitida.

Ad esempio, in un gioco di simulatore di volo in cui gli utenti si concentrano su strumenti e controlli, la combinazione del rendering foveated con il sottocampionamento Vulkan consente di eseguire il rendering dei controlli dettagliati in modo nitido, ma la struttura periferica della cabina di pilotaggio utilizza meno risorse. Questi 0,5 ms in più non sembrano molti, ma fanno la differenza tra avere spazio per un elemento interattivo aggiuntivo o perdere frame durante i momenti più intensi.

Funzionalità della GPU per scene complesse

Oltre al rendering foveated e al sottocampionamento Vulkan, esistono alcune funzionalità della GPU che riducono lo sforzo non necessario tramite l'instancing e il culling intelligenti. Questi sono particolarmente efficaci per scene complesse con geometria ripetuta o occlusione significativa.

GPU Resident Drawer

Il GPU Resident Drawer utilizza automaticamente l'instancing della GPU per ridurre le chiamate di disegno e liberare tempo di elaborazione della CPU. Quindi, invece di comunicare alla GPU ogni oggetto singolarmente, la CPU raggruppa gli oggetti simili.

Questa funzionalità è più efficace per scene di grandi dimensioni con mesh ripetute, come alberi in una foresta, mobili in un edificio per uffici o oggetti di scena sparsi in un ambiente.

Immagina una scena di una foresta con 200 alberi che utilizzano la stessa mesh di base. Senza il GPU Resident Drawer, hai 200 chiamate di disegno che consumano la GPU, liberando così la CPU. Quando attivi questa funzionalità, la GPU crea in modo intelligente le istanze di questi alberi, riducendo il numero di chiamate di disegno a 5-10. Si tratta di un enorme risparmio di GPU che puoi investire nella logica di gameplay o nei calcoli fisici.

GPU Occlusion Culling

GPU Occlusion Culling utilizza la GPU anziché la CPU per identificare e saltare il rendering degli oggetti nascosti. Rileva automaticamente ciò che è occluso (nascosto) dietro altri oggetti, in modo da non sprecare la GPU su elementi che l'utente non può vedere.

Questa funzionalità è particolarmente efficace negli spazi interni con più stanze, negli ambienti densi o nelle scene architettoniche in cui pareti, pavimenti e oggetti bloccano naturalmente la visuale.

Ad esempio, supponiamo che tu stia creando un'esperienza multiroom per una casa. Quando l'utente si trova in salotto, perché sprecare cicli della GPU per eseguire il rendering della cucina completamente dettagliata che è nascosta dietro un muro? L'occlusion culling della GPU ignora automaticamente il rendering degli oggetti nascosti, offrendoti un budget delle prestazioni maggiore per ciò che è effettivamente visibile.

Monitoraggio del rendimento

Non basta utilizzare queste funzionalità. Devi anche misurare le ottimizzazioni per quantificarne l'impatto e verificare che le modifiche funzionino effettivamente.

API Performance Metrics

L'API Performance Metrics fornisce il monitoraggio in tempo reale della memoria utilizzata, delle prestazioni della CPU e delle prestazioni della GPU delle tue app. Fornisce dati completi dai livelli di composizione e runtime, in modo da poter vedere esattamente cosa sta succedendo nella tua applicazione.

Stabilisci una base di riferimento prima di apportare le modifiche, applica un'ottimizzazione, misura l'impatto e ripeti. Questo approccio basato sui dati ti consente di sapere che stai effettivamente migliorando il rendimento, anziché tirare a indovinare.

Prima di attivare il rendering foveated, la durata frame della GPU potrebbe essere di 13 ms, ovvero superiore al budget di 11 ms. Attiva il foveated rendering, misura di nuovo e, se tutto va bene, vedrai che scende a 9 ms. In questo modo, hai guadagnato 4 ms di margine per aggiungere ulteriori dettagli alla scena, migliorare la qualità visiva altrove o semplicemente garantire prestazioni più fluide in una gamma più ampia di contenuti.

Senza queste metriche, l'ottimizzazione è cieca. L'API Performance Metrics ti dice la verità su ciò che sta effettivamente aiutando il tuo caso d'uso specifico.

Frame Debugger

Il Frame Debugger è lo strumento integrato di Unity per capire esattamente come viene eseguito il rendering della scena, frame per frame. Mostra la sequenza di chiamate di disegno e ti consente di esaminarle per verificare che le ottimizzazioni funzionino correttamente.

Vuoi verificare che SRP Batcher funzioni? Cerca le voci "RenderLoopNewBatcher" nel Frame Debugger. Verifica se il GPU Resident Drawer esegue il batching correttamente? Cerca le voci "Hybrid Batch Group". Queste conferme visive ti aiutano a capire se le impostazioni di ottimizzazione sono effettivamente applicate.

Esamina le prime 50 chiamate di disegno della scena. Se vedi che oggetti simili vengono disegnati singolarmente anziché in batch, significa che l'instancing o il batching non funzionano correttamente. Il debugger dei frame rende questi problemi immediatamente visibili, in modo che tu possa risolverli.

Altre ottimizzazioni

Oltre alle ottimizzazioni descritte sopra, la nostra guida completa alle prestazioni ne illustra anche altre. Ecco un breve riepilogo:

  • Impostazioni URP: disattiva l'HDR e il post-processing per XR mobile. Queste funzionalità offrono un impatto visivo minimo rispetto al costo delle prestazioni sull'hardware mobile, quindi otterrai miglioramenti delle prestazioni misurabili con differenze visive appena percettibili.
  • SRP Batcher: riduce l'overhead della CPU per le scene con molti materiali che utilizzano la stessa variante dello shader. Riducendo al minimo le modifiche dello stato di rendering tra le chiamate di disegno, puoi ridurre notevolmente il tempo di CPU impiegato per il rendering.
  • Frequenza di aggiornamento del display: regolazione dinamica tra 72 f/s e 90 f/s in base alla complessità della scena. Riduci la frequenza fotogrammi durante le sequenze complesse per mantenere la stabilità, quindi aumentala durante i momenti più semplici per un'interazione ultra fluida.
  • Texture di profondità/opache: disattivale, a meno che non siano necessarie per gli effetti degli shader. Provocano operazioni di copia della GPU non necessarie che riducono le prestazioni senza fornire vantaggi per la maggior parte delle applicazioni.
  • Scala di rendering URP : questa impostazione consente di eseguire il rendering a una risoluzione ridotta per migliorare le prestazioni o di eseguire l'upscaling del rendering per una qualità visiva migliore.

Per istruzioni passo passo su queste e altre ottimizzazioni, consulta la nostra guida completa alle prestazioni di Unity per Android XR.

Conclusione

Le prestazioni della tua app XR non sono solo un requisito tecnico da soddisfare. È la differenza tra un'esperienza confortevole e coinvolgente e una che fa sentire gli utenti a disagio o li fa stare male. Le ottimizzazioni che abbiamo trattato sono gli strumenti che ti consentono di raggiungere i target di frame rate critici sui dispositivi XR più recenti.

Ecco la tua roadmap:

  1. Inizia con il rendering foveated e il sottocampionamento Vulkan. Queste funzionalità specifiche per XR offrono risparmi immediati e notevoli sulla GPU.
  2. Aggiungi GPU Resident Drawer e Occlusion Culling se hai scene complesse con geometrie ripetute o spazi interni.
  3. Monitora tutto con l'API Performance Metrics per assicurarti che le modifiche siano effettivamente utili
  4. Esplora ulteriori ottimizzazioni di URP per un margine di prestazioni extra

È fondamentale misurare continuamente e ripetere. Non tutte le ottimizzazioni avranno lo stesso impatto su ogni progetto, quindi utilizza l'API Performance Metrics per avere un'idea chiara di ciò che aiuta effettivamente il tuo caso d'uso specifico.

Passaggi successivi: espandi le tue competenze

Vuoi saperne di più? Consulta queste risorse:

  • Guida alle prestazioni di Unity per Android XR: istruzioni complete per l'implementazione passo passo di tutte le funzionalità descritte qui.
  • Inizia a utilizzare Unity e Android XR: configura l'ambiente di sviluppo e inizia a creare.
Scritto da:
Continua a leggere