Sessioni lente

In Android vitals, 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 f/s). Android vitals segnala anche una seconda metrica Sessioni lente con un target di 34 ms (equivalente a 30 f/s). Tramite i dati sulle sessioni lente puoi capire le prestazioni della frequenza fotogrammi 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 saperne di più 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 i frame al secondo e rilevare i frame lenti

Il comando Android dumpsys SurfaceFlinger --timestats fornisce gli istogrammi dei tempi di FPS medi e 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 disegno del frame corrente e quello del frame precedente. Segui questi 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 informazioni:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Quando il gioco è stato utilizzato per un 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 visualizzati 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
    

    Puoi calcolare la frequenza fotogrammi lenta della sessione in base alle informazioni di ogni livello.

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

    totalFrames = 274
    ...
    presentToPresent histogram:
    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 mostrato anche il numero medio di f/s 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 dei frame lenti

Esistono molti motivi per cui un frame potrebbe essere presentato o visualizzato sullo schermo più a lungo del previsto. Il gioco potrebbe essere limitato dalla CPU o dalla GPU, il dispositivo potrebbe surriscaldarsi e attivare uno stato termico limitato oppure potrebbe esserci una mancata corrispondenza tra la frequenza fotogrammi 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 un frame pacing corretto su Android.

Il frame pacing è 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 Android è stato progettato per evitare artefatti visivi (noti come tearing) che possono verificarsi quando l'hardware del display passa a un nuovo frame durante 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 passati quando vengono rilevati frame 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 (Frame pacing ottimizzato) in Project Settings (Impostazioni progetto) > Player (Player) > Settings (Impostazioni) per Android > Resolution and Presentation (Risoluzione e presentazione):

Finestra Impostazioni progetto di Unity che mostra la casella di controllo Spaziatura dei frame ottimizzata.
Figura 2. Attiva l'allocazione del frame in Unity Engine.

In alternativa, attiva in modo programmatico l'opzione Optimized Frame Pacing nel codice logico per consentire a Unity di distribuire i frame in modo uniforme per ridurre la variazione della frequenza 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 di Android Game Development Kit. L'articolo Mobile Frame Pacing spiega come attivare la libreria Android Frame Pacing e come controllare il frame pacing dal codice C++.

Che cos'è Vulkan

Vulkan è un'API grafica 3D multipiattaforma moderna progettata per ridurre al minimo l'astrazione tra l'hardware grafico del dispositivo e il tuo 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.

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 le API bindless e il 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 nel rendering di un triangolo ruotante con texture 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 Auto Graphics API.

Finestra Impostazioni progetto di Unity con l'opzione Auto Graphics API attivata.
Figura 3. Abilita l'API Unity Auto Graphics.

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

Finestra Impostazioni progetto di Unity con Vulkan in cima all'elenco delle API Graphics.
Figura 4. Scegli manualmente Vulkan come API Graphics principale in Unity.

Utilizza il plug-in del motore Unity VkQuality per fornire consigli al momento del lancio dell'API di grafica che il tuo gioco deve utilizzare su dispositivi specifici.

Come utilizzare Vulkan nel motore grafico Unreal

Per attivare l'API grafica Vulkan, vai a Impostazioni progetto > Platforms > Android > Build e seleziona Support Vulkan. Se 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 Impostazioni progetto di Unreal Engine che mostra l'opzione Support Vulkan.
Figura 5. Abilita Vulkan in Unreal Engine.

Se utilizzi funzionalità Vulkan specifiche che sono note per comportarsi in modo anomalo su determinati dispositivi, puoi personalizzare il file BaseDeviceProfile.ini per escludere questi dispositivi. Per scoprire come personalizzare BaseDeviceProfile.ini, consulta Personalizzazione dei profili dei dispositivi e scalabilità per Android. Poiché i nuovi driver dei dispositivi potrebbero correggere i dispositivi non funzionanti precedentemente noti, mantieni aggiornato il file BaseDeviceProfile.ini per ottenere tutte le ottimizzazioni.

Che cos'è ADPF

Android Dynamic Performance Framework (ADPF) ottimizza i giochi in base alle funzionalità di gestione dinamica di temperatura, CPU e GPU su Android. L'attenzione è rivolta ai giochi, ma puoi utilizzare le funzionalità anche per altre app ad alte prestazioni.

ADPF è un insieme di API che consentono ai giochi e alle app ad alte 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 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 workload prima che diventi insostenibile.
  • API CPU Performance Hint: fornisce suggerimenti sulle prestazioni che consentono ad Android di scegliere le impostazioni di prestazioni giuste (ad esempio, punto operativo o core della CPU) per il workload.
  • API Game Mode e API Game State: consentono l'ottimizzazione del gameplay dando la priorità alle prestazioni o alla 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 preferire l'efficienza energetica alle prestazioni. Disponibile in Android 15 (livello API 35).

Come utilizzare ADPF nei progetti Android nativi

Il codelab Integrazione delle funzionalità di adattabilità nel tuo 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 le condizioni termiche del dispositivo e reagisci prima che il dispositivo entri in uno stato di limitazione termica.
  • API Game Mode: scopri le preferenze di ottimizzazione dei giocatori (massimizza le prestazioni o preserva la batteria) e apporta le modifiche necessarie.
  • API Game State: comunica al sistema lo stato del gioco (caricamento, riproduzione, UI e così via) in modo che il sistema possa regolare le risorse di conseguenza (potenziamento di I/O, CPU, GPU e così via).
  • API Performance Hint: comunica al sistema il tuo modello di threading e il tuo workload 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 loro 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.

Provider Android di Adaptive Performance ti guida attraverso i passaggi per implementare ADPF in Unity. Consulta anche ADPF Unity Adaptive Performance and Android provider.

Finestra Impostazioni progetto di Unity che mostra le impostazioni del provider Android di Adaptive Performance.
Figura 6. Integra ADPF in Unity Engine.

Come utilizzare ADPF nel motore grafico Unreal

Finestra dei plug-in di Unreal Engine che mostra il plug-in Android Dynamic Performance Framework.
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 Unreal Engine di ADPF nell'editor Unreal.
  4. Riavvia l'editor Unreal.
  5. Crea e prepara il gioco.

Il plug-in Android Dynamic Performance Framework (ADPF) per Unreal Engine offre prestazioni stabili e previene il throttling termico. Scarica il plug-in da GitHub. Questo plug-in modifica le funzionalità impostando i valori della console Unreal. Per maggiori dettagli, consulta il plug-in ADPF per Unreal Engine.