Sessioni lente

Una sessione lenta è una sessione in cui oltre il 25% dei frame è lento. Un frame è considerato lento se non viene presentato meno di 50 ms dopo il frame precedente (equivalente a 20 FPS). Android vitals registra anche una seconda metrica relativa alle sessioni lente con un target di 34 ms (equivalente a 30 FPS). Tramite i dati sulle sessioni lente puoi capire l'andamento della frequenza frame del tuo gioco, che incide sulla fluidità del gioco percepita dagli utenti.

A tempo debito, Google Play inizierà ad indirizzerà gli utenti lontano dai giochi che non possono raggiungere i 20 FPS sul telefono. Tieni presente che Android vitals inizia a monitorare la frequenza fotogrammi solo dopo che il gioco è stato in esecuzione per un minuto.

Per ulteriori dettagli sulla metrica, visita il nostro Centro assistenza.

Grafici simili a grafici a torta che mostrano il numero di frame lenti e non lenti.
Figura 1. Una sessione lenta in Android vitals.
.

Come misurare gli FPS e rilevare i frame lenti

Il comando Android dumpsys surfaceflinger timestats fornisce la frequenza FPS media e l'istogramma dei tempi present to present per tutti i livelli di cui viene eseguito il rendering. Il tempo present to present di un frame è l'intervallo tra il frame corrente e il frame precedente di cui è stato eseguito il rendering. 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 eseguito per un periodo di tempo sufficiente, esegui di nuovo il comando con il flag dump per eseguire il dump delle informazioni:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    Le informazioni scaricate forniscono i frame totali e l'istogramma presentToPresent per tutti i livelli di cui è stato eseguito il rendering da 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 può essere calcolata in base alle informazioni di ogni livello.

    Ad esempio, la percentuale di frame lenti a 20 FPS = (somma dei valori da 54 ms a 1000 ms) / frame totali 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 visualizzata anche la frequenza FPS media di ogni livello:

    ...
    averageFPS = 30.179
    ...
    
  3. Dopo aver raccolto tutte le informazioni, devi disattivare 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 presentato o di cui potrebbe essere eseguito il rendering sullo schermo per un periodo di tempo più lungo rispetto al target dello sviluppatore. Il gioco potrebbe essere vincolato alla CPU/GPU. Oppure il dispositivo si sta surriscaldando e attiva uno stato termico limitato. Oppure c'è una mancata corrispondenza tra la frequenza frame 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 Android Frame Pacing, nota anche come Swappy, fa parte delle librerie AGDK. Swappy aiuta i giochi OpenGL e Vulkan a ottenere un rendering fluido e una frequenza frame corretta su Android.

La frequenza frame è la sincronizzazione della logica di un gioco e del loop di rendering con il sottosistema di visualizzazione di un sistema operativo e l'hardware di visualizzazione sottostante. Il sottosistema di visualizzazione di Android è stato progettato per evitare artefatti visivi (noti come tearing) che possono verificarsi quando l'hardware di visualizzazione 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 gli invii di frame in ritardo
  • Ripete la visualizzazione dei frame precedenti quando vengono rilevati frame in ritardo

Scopri in che modo 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 (Frequenza frame ottimizzata) in Project Settings > Player > Settings (Impostazioni progetto > Player > Impostazioni) per Android > Resolution and Presentation (Android > Risoluzione e presentazione):

Finestra di dialogo Impostazioni progetto.
Figura 2. Attiva la frequenza frame nel motore Unity.

In alternativa, puoi attivare a livello di programmazione l'opzione Optimized Frame Pacing (Frequenza frame ottimizzata) nel codice logico per consentire a Unity di distribuire uniformemente i frame per una minore varianza della frequenza frame, 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 la frequenza frame dal codice C++.

Che cos'è Vulkan

Vulkan è una moderna API grafica 3D multipiattaforma 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, e 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 sovraccarico 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 le API senza binding e il ray tracing

Come utilizzare Vulkan nei progetti Android nativi

Il codelab Introduzione a Vulkan su Android ti guida nella configurazione della pipeline di rendering Vulkan e nel rendering di un triangolo con texture e rotante sullo schermo. Utilizza il codelab per scoprire come eseguire il rendering della grafica del gioco.

Come utilizzare Vulkan nel motore grafico Unity

Per attivare la selezione automatica del dispositivo su Unity, segui i passaggi per configurare l'API Auto Graphics.

Finestra di dialogo Impostazioni progetto.
Figura 3. Attiva l'API Auto Graphics di Unity.

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

Finestra di dialogo Impostazioni progetto.
Figura 4. Scegli manualmente Vulkan come API grafica 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 (Impostazioni progetto > Piattaforme > Android > Compila) e seleziona Support Vulkan (Supporta Vulkan). Quando selezioni sia Support Vulkan (Supporta Vulkan) sia Support OpenGL ES3.2 (Supporta OpenGL ES3.2), Unreal utilizza Vulkan per impostazione predefinita. Se il dispositivo non supporta Vulkan, Unreal torna a OpenGL ES 3.2.

Finestra di dialogo Impostazioni progetto.
Figura 5. Attiva Vulkan in Unreal Engine.

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

Che cos'è ADPF

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

ADPF è un insieme di API che consentono ai giochi e alle app che richiedono un elevato utilizzo delle prestazioni 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 del gioco a un livello sostenibile che non surriscalda 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 delle prestazioni corrette (ad esempio, punto operativo o core della CPU) per il carico di lavoro.
  • API Game Mode e API Game State: attiva l'ottimizzazione del 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à Fixed Performance: attiva la modalità a prestazioni fisse su un dispositivo durante il benchmarking per ottenere misurazioni che non vengono modificate dal clock dinamico della CPU.
  • Modalità Power Efficiency: indica alla sessione che i thread in Performance Hint Session 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 Integrazione delle funzionalità di adattabilità nel gioco nativo 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 del giocatore (massimizzare le prestazioni o preservare la batteria) e regolale di conseguenza.
  • API Game State: comunica al sistema lo stato del tuo gioco (caricamento, riproduzione, UI e così via) e il sistema può regolare le risorse di conseguenza (aumentare l'I/O, la CPU, la GPU e così via).
  • API Performance Hint: comunica al sistema il tuo modello di threading e il carico di lavoro in modo che il sistema 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 in tempo reale alle prestazioni e alle caratteristiche termiche del dispositivo, 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 6. Integra ADPF in Unity Engine.

Come utilizzare ADPF nel motore grafico Unreal

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

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