Sessioni lente (solo giochi)

Una sessione di gioco lenta è una sessione in cui una parte significativa dei frame (ad esempio, più del 25% dei frame) non riesce a soddisfare la durata frame target, ad esempio 50 ms per frame (equivalente a 20 FPS) o 34 ms per frame (equivalente a 30 FPS). Il monitoraggio e l'ottimizzazione delle prestazioni della frequenza fotogrammi sono fondamentali perché i fotogrammi persi o in ritardo influiscono direttamente sulla fluidità e sulla reattività del gioco per i giocatori.

Su Android, le frequenze frame delle sessioni vengono misurate utilizzando i dati di SurfaceFlinger in base all'intervallo di tempo tra i frame disegnati sulle superfici di proprietà del gioco (incluse le superfici OpenGL, Vulkan e del toolkit per la UI di Android). Se la tua app utilizza il toolkit per l'interfaccia utente basato su View, in cui la parte dell'app visibile all'utente viene estratta da Canvas o dalla gerarchia View, consulta Rendering lento.

Come misurare gli FPS e rilevare i frame lenti

Il comando Android dumpsys surfaceflinger timestats fornisce l'FPS medio e l'istogramma dei tempi present to present per tutti i livelli sottoposti a rendering. Il tempo present to present di un frame è l'intervallo tra il frame corrente e il frame precedente in fase di disegno. Ecco i passaggi per utilizzare il comando per raccogliere gli FPS del tuo gioco:

  1. Esegui il comando con i flag enable e clear per iniziare ad acquisire le informazioni:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Quando il gioco è stato giocato abbastanza a lungo, esegui di nuovo il comando con il flag dump per scaricare le informazioni:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    Le informazioni di dump forniscono l'istogramma dei frame totali e presentToPresent per tutti i livelli di rendering di SurfaceFlinger. Devi trovare la sezione del tuo gioco filtrando in base a layerName:

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

    La frequenza fotogrammi lenta della sessione potrebbe essere calcolata in base alle informazioni di ogni livello.

    Ad esempio, percentuale di frame lenti a 20 FPS = (somma dei valori da 54 ms a 1000 ms) / totalFrames x 100

    totalFrames = 274
    ...
    presentToPresent histogram is as below:
    0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0
    13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0
    24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0
    66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0
    110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0
    150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0
    650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
    

    Nel dump viene visualizzato anche l'FPS medio di ogni livello:

    ...
    averageFPS = 30.179
    ...
    
  3. Dopo aver raccolto tutte le informazioni, disattiva timestats utilizzando il flag disable:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Cause e soluzioni per i frame lenti

Esistono molti motivi per cui un frame potrebbe essere visualizzato o sottoposto a rendering più a lungo sullo schermo rispetto al target dello sviluppatore. Il gioco potrebbe essere limitato dalla CPU/GPU. Oppure il dispositivo si sta surriscaldando e attiva uno stato termico limitato. Oppure c'è una mancata corrispondenza tra il framerate del gioco e la frequenza di aggiornamento del display del dispositivo.

Utilizza Android Frame Pacing (Swappy), Vulkan e ADPF per risolvere questi problemi e migliorare le prestazioni del tuo gioco.

Che cos'è Swappy

La libreria Frame Pacing di Android, nota anche come Swappy, fa parte delle librerie AGDK. Swappy aiuta i giochi OpenGL e Vulkan a ottenere un rendering fluido e una corretta spaziatura dei frame su Android.

Il frame pacing è la sincronizzazione del ciclo di logica e rendering di un gioco con il sottosistema di visualizzazione di un sistema operativo e l'hardware di visualizzazione sottostante. Il sottosistema di visualizzazione Android è stato progettato per evitare artefatti visivi (noti come tearing) che possono verificarsi quando l'hardware del display passa a un nuovo frame a metà di un aggiornamento. Per evitare questi artefatti, il sottosistema di visualizzazione esegue le seguenti operazioni:

  • Memorizza internamente i frame precedenti
  • Rileva l'invio di frame in ritardo
  • Ripete la visualizzazione dei fotogrammi precedenti quando vengono rilevati fotogrammi in ritardo

Scopri come Mir 2 ha utilizzato Swappy per ridurre la percentuale di sessioni lente dal 40% al 10%.

Come utilizzare Swappy nei progetti nativi

Consulta le seguenti guide per integrare la libreria Android Frame Pacing nel tuo gioco:

Come utilizzare Swappy nel motore grafico Unity

Unity ha integrato Android Frame Pacing nel suo motore. Per attivare questa funzionalità in Unity 2019.2 o versioni successive, seleziona la casella di controllo Optimized Frame Pacing (Pacing dei frame ottimizzato) in Project Settings > Player > Settings (Impostazioni progetto > Player > Impostazioni) per Android > Resolution and Presentation (Android > Risoluzione e presentazione):

Finestra di dialogo Impostazioni progetto.
Figura 1. Attiva Frame Pacing in Unity Engine.

In alternativa, abilita a livello di programmazione l'opzione di spaziatura ottimizzata dei frame nel codice logico per consentire a Unity di distribuire uniformemente i frame per una minore varianza della frequenza dei fotogrammi, creando un gameplay più fluido.

Come utilizzare Swappy nel motore grafico Unreal

Unreal 4.25 e versioni successive integrano la libreria Android Frame Pacing, che fa parte dell'Android Game Development Kit. L'articolo Mobile Frame Pacing spiega come attivare la libreria Android Frame Pacing e come controllare il pacing dei frame dal codice C++.

Che cos'è Vulkan

Vulkan è un'API di grafica 3D multipiattaforma moderna progettata per ridurre al minimo l'astrazione tra l'hardware grafico del dispositivo e il gioco. Vulkan è l'API grafica di basso livello principale su Android, che sostituisce OpenGL ES. OpenGL ES è ancora supportato su Android, ma non è più in fase di sviluppo attivo delle funzionalità.

Vulkan offre i seguenti vantaggi rispetto a OpenGL ES:

  • Un'architettura più efficiente con un overhead della CPU inferiore nel driver grafico
  • Nuove strategie di ottimizzazione per migliorare le prestazioni della CPU
  • Nuove funzionalità grafiche non disponibili in OpenGL ES, come API bindless e ray tracing

Come utilizzare Vulkan nei progetti Android nativi

Il codelab Inizia a utilizzare Vulkan su Android ti guida nella configurazione della pipeline di rendering Vulkan e poi nel rendering di un triangolo ruotante con texture sullo schermo. Utilizza il codelab per imparare a eseguire il rendering della grafica del gioco.

Come utilizzare Vulkan nel motore grafico Unity

Per attivare la selezione automatica dei dispositivi su Unity, segui i passaggi per configurare Auto Graphics API.

Finestra di dialogo Impostazioni progetto.
Figura 2. Abilita l'API Unity Auto Graphics.

In alternativa, puoi attivare Vulkan manualmente disattivando Auto Graphics API e impostando Vulkan come priorità più alta nell'elenco Graphics API. Se utilizzi Unity 2021.1 o una versione precedente, questo è l'unico modo per utilizzare Vulkan.

Finestra di dialogo Impostazioni progetto.
Figura 3. Scegli manualmente Vulkan come API Graphics principale in Unity.

Utilizza il plug-in del motore Unity VkQuality per fornire consigli sull'API grafica da utilizzare per il tuo gioco su dispositivi specifici al momento dell'avvio.

Come utilizzare Vulkan nel motore grafico Unreal

Per attivare l'API grafica Vulkan, vai a Project Settings > Platforms > Android > Build e seleziona Support Vulkan. Quando selezioni sia Supporta Vulkan sia Supporta OpenGL ES3.2, Unreal utilizza Vulkan per impostazione predefinita. Se il dispositivo non supporta Vulkan, Unreal utilizza OpenGL ES 3.2.

Finestra di dialogo Impostazioni progetto.
Figura 4. Abilita Vulkan in Unreal Engine.

Se utilizzi funzionalità Vulkan specifiche che hanno un comportamento anomalo su determinati dispositivi, puoi personalizzare il file BaseDeviceProfile.ini per escludere questi dispositivi. Consulta Personalizzazione dei profili dei dispositivi e scalabilità per Android per scoprire come personalizzare BaseDeviceProfile.ini. Poiché i nuovi driver dei dispositivi potrebbero correggere i dispositivi non funzionanti noti in precedenza, mantieni aggiornato il file BaseDeviceProfile.ini per ottenere tutte le ottimizzazioni.

Che cos'è ADPF

L'Android Dynamic Performance Framework (ADPF) ottimizza i giochi in base alle funzionalità di gestione dinamica termica, della CPU e della GPU su Android. L'attenzione è rivolta ai giochi, ma puoi utilizzare le funzionalità anche per altre app che richiedono molte risorse.

ADPF è un insieme di API che consentono a giochi e app a uso intensivo di risorse di interagire più direttamente con i sistemi di alimentazione e termici dei dispositivi Android. Con queste API, puoi monitorare il comportamento dinamico sui sistemi Android e ottimizzare le prestazioni di gioco a un livello sostenibile che non surriscaldi i dispositivi.

Ecco le principali funzionalità di ADPF:

  • API Thermal: monitora lo stato termico di un dispositivo in modo che l'applicazione possa regolare in modo proattivo il carico di lavoro prima che diventi insostenibile.
  • API CPU Performance Hint: fornisci suggerimenti sulle prestazioni che consentono ad Android di scegliere le impostazioni di rendimento giuste (ad esempio, punto di funzionamento o core della CPU) per il workload.
  • API Game Mode e API Game State: consentono di ottimizzare il gameplay dando la priorità alle caratteristiche di prestazioni o durata della batteria, in base alle impostazioni dell'utente e alle configurazioni specifiche del gioco.
  • Modalità prestazioni fisse: attiva la modalità prestazioni fisse su un dispositivo durante il benchmarking per ottenere misurazioni non alterate dal clock dinamico della CPU.
  • Modalità di efficienza energetica: indica alla sessione che i thread nella sessione di suggerimenti sulle prestazioni possono essere pianificati in modo sicuro per dare la priorità all'efficienza energetica rispetto alle prestazioni. Disponibile in Android 15 (livello API 35).

Come utilizzare ADPF nei progetti Android nativi

Il codelab Integrating Adaptability Features Into Your Native Game ti guida nell'integrazione delle funzionalità ADPF nel tuo gioco con passaggi che puoi seguire al tuo ritmo. Al termine del codelab, avrai integrato le seguenti funzionalità:

  • API Thermal: ascolta la condizione termica del dispositivo e reagisci prima che il dispositivo entri nello stato di limitazione termica.
  • API Game Mode: comprendi le preferenze di ottimizzazione dei giocatori (massimizzare le prestazioni o preservare la batteria) e regolale di conseguenza.
  • API Game State: consente al sistema di conoscere lo stato del gioco (caricamento, gioco, UI e così via) e di regolare le risorse di conseguenza (aumentare l'I/O o la CPU, la GPU e così via).
  • API Performance Hint: comunica al sistema il tuo modello di threading e il tuo carico di lavoro in modo che possa allocare le risorse di conseguenza.

Come utilizzare ADPF nel motore grafico Unity

Adaptive Performance di Unity è uno strumento per gli sviluppatori di giochi che vogliono ottimizzare i propri giochi sui dispositivi mobili, in particolare per il variegato ecosistema Android. Adaptive Performance consente al tuo gioco di adattarsi alle prestazioni e alle caratteristiche termiche del dispositivo in tempo reale, garantendo un'esperienza di gioco fluida ed efficiente.

Il provider Android Adaptive Performance ti guida nei passaggi per implementare ADPF in Unity.

Finestra di dialogo Impostazioni progetto.
Figura 5. Integra ADPF in Unity Engine.

Come utilizzare ADPF nel motore grafico Unreal

Finestra di dialogo Impostazioni progetto.
Figura 6. Integra ADPF in Unreal Engine.
  1. Scarica il plug-in
  2. Copia il plug-in nella cartella dei plug-in del progetto
  3. Abilitare il plug-in ADPF Unreal Engine nell'editor Unreal
  4. Riavvia l'editor di Unreal
  5. Crea e compila il gioco.

Il plug-in Android Dynamic Performance Framework(ADPF) per Unreal Engine offre prestazioni stabili ed evita la limitazione termica. Scarica il plug-in da GitHub. Questo plug-in modifica le funzionalità impostando valori della console Unreal.