Frequenza di aggiornamento multipla

Android 11 aggiunge il supporto per i dispositivi con più frequenze di aggiornamento. Questa funzionalità è composta da tre componenti principali:

  • Nuove API HAL introdotte in android.hardware.graphics.composer@2.4.
  • Codice della piattaforma per analizzare le configurazioni del dispositivo per diverse frequenze di aggiornamento e impostare la frequenza di aggiornamento desiderata
  • Nuove API SDK e NDK per consentire alle app di impostare la frequenza fotogrammi desiderata

Implementazione

È stato aggiunto il supporto dedicato per il cambio della frequenza di aggiornamento a android.hardware.graphics.composer@2.4 HAL. Ti consigliamo vivamente di utilizzare questa versione, poiché le versioni precedenti di HAL del compositore hanno un supporto limitato per il passaggio della frequenza di aggiornamento.

Gruppi di configurazione

A IComposerClient::Attribute è stato aggiunto un nuovo attributo CONFIG_GROUP che può essere sottoposto a query utilizzando l'API getDisplayAttribute_2_4. Questo attributo consente ai fornitori di raggruppare le configurazioni display. Le configurazioni nello stesso gruppo consentono di passare facilmente da una all'altra nella maggior parte dei casi. Il gruppo di configurazione viene utilizzato dalla piattaforma per distinguere le configurazioni tra cui è possibile passare al fine di modificare la frequenza di aggiornamento e non altri attributi per una configurazione.

Considera il seguente esempio che mostra i vantaggi dell'utilizzo dei gruppi di configurazione con un dispositivo che supporta quattro configurazioni di visualizzazione:

  • 1080p a 60 Hz
  • 1080p a 90 Hz
  • 1080i a 72 Hz
  • 1080i a 48 Hz

Anche se il dispositivo supporta le frequenze di aggiornamento a 48 Hz, 60 Hz, 72 Hz e 90 Hz, il display funziona in una modalità diversa e il passaggio da 60 Hz a 72 Hz cambia la configurazione del display da 1080p a 1080i, comportamento che potrebbe non essere il comportamento desiderato. Questo problema viene risolto utilizzando i gruppi di configurazione. Raggruppando 60 Hz e 90 Hz in un gruppo di configurazione e 48 Hz e 72 Hz in un altro gruppo di configurazione. La piattaforma sa che può passare da 60 Hz a 90 Hz e da 48 Hz a 72 Hz, ma non da 60 Hz a 72 Hz, in quanto ciò comporterà una modifica della configurazione anziché semplicemente della frequenza di aggiornamento.

Aggiornamenti dell'API Composer

getDisplayVsyncPeriod
Per un maggiore controllo e una maggiore prevedibilità quando si modificano le frequenze di aggiornamento, è stato aggiunto getDisplayVsyncPeriod . getDisplayVsyncPeriod restituisce la frequenza di aggiornamento corrente (in termini di periodo vsync) a cui funziona il display. Questo è particolarmente utile durante la transizione tra la frequenza di aggiornamento e la frequenza di aggiornamento corrente, poiché la piattaforma deve decidere quando avviare il frame successivo.
setActiveConfigWithConstraints
Il metodo setActiveConfigWithConstraints è una nuova estensione al metodo setActiveConfig esistente e fornisce maggiori informazioni sulla modifica della configurazione. I vincoli vengono forniti come parte dei parametri vsyncPeriodChangeConstraints e contengono i seguenti parametri.
    desiredTimeNanos
    L'ora in CLOCK_MONOTONIC dopo la quale il periodo vsync può cambiare (ovvero il periodo vsync non deve cambiare prima di questa ora). Questo è utile quando la piattaforma vuole pianificare in anticipo una modifica della frequenza di aggiornamento, ma ha già alcuni buffer in coda da presentare. La piattaforma imposta questo tempo di conseguenza per tenere conto di questi buffer e assicurarsi che la transizione della frequenza di aggiornamento sia il più fluida possibile.
    seamlessRequired
    Se true, richiede che la modifica del periodo vsync debba avvenire senza interruzioni senza un artefatto visivo evidente. Questo flag viene utilizzato dalla piattaforma quando è necessario modificare la frequenza di aggiornamento in seguito a una modifica dei contenuti (ad esempio, quando il dispositivo è inattivo e viene avviata l'animazione). In questo modo il fornitore ha la possibilità di non consentire determinate modifiche alla configurazione se potrebbero comportare un artefatto visivo evidente. Se le configurazioni non possono essere modificate senza problemi e seamlessRequired è impostato su true, l'implementazione dovrebbe restituire SEAMLESS_NOT_POSSIBLE come codice di ritorno e chiamare il nuovo callback onSeamlessPossible quando la stessa modifica della configurazione può essere eseguita senza problemi.

In caso di esito positivo, l'implementazione restituisce un valore VsyncPeriodChangeTimeline che indica alla piattaforma quando deve verificarsi la variazione della frequenza di aggiornamento. I parametri newVsyncAppliedTimeNanos devono essere impostati sul momento in CLOCK_MONOTONIC in cui il nuovo display inizierà ad aggiornarsi con il nuovo periodo vsync. Questo, insieme a desiredTimeNanos, consente alla piattaforma di pianificare in anticipo il passaggio alla nuova frequenza di aggiornamento e di iniziare a conteggiare le app per la nuova frequenza di aggiornamento in anticipo. Ciò consente una transizione fluida della frequenza di aggiornamento.

Alcune implementazioni richiedono l'invio di un frame di aggiornamento prima di poter inviare la frequenza di aggiornamento. A tal fine, l'HAL dispone del parametro refreshRequired per indicare che è necessario un frame di aggiornamento e refreshTimeNanos per indicare il primo vsync dopo il quale deve essere inviato un frame di aggiornamento.

onVsyncPeriodTimingChanged [callback]
Un nuovo callback che può essere chiamato dall'HAL per indicare alla piattaforma che un parametro della sequenza temporale è cambiato e che la piattaforma deve modificarla. Questo callback dovrebbe essere chiamato se per qualche motivo la vecchia sequenza temporale è stata mancata a causa di un tempo di elaborazione lungo nell'HAL o di un frame di aggiornamento tardivo.

In che modo la piattaforma decide di modificare la frequenza di aggiornamento?

La selezione della frequenza di aggiornamento avviene nei seguenti due servizi di sistema:

DisplayManager
Il DisplayManager imposta il criterio di alto livello relativo alla frequenza di aggiornamento. Imposta una configurazione di visualizzazione predefinita, che corrisponde alla configurazione HAL del compositore. Inoltre, consente di impostare un intervallo di valori minimo e massimo che SurfaceFlinger può scegliere come frequenza di aggiornamento.
SurfaceFlinger
Determina la frequenza di aggiornamento impostando una configurazione che si trova nello stesso gruppo di configurazione della configurazione predefinita e con una frequenza di aggiornamento compresa nell'intervallo min/max.

Display Manager esegue i seguenti passaggi per determinare il criterio:

  • Trova l'ID configurazione predefinito eseguendo una query sulla configurazione attiva da SurfaceFlinger
  • Limitare l'intervallo di valori minimo e massimo iterando sulle condizioni di sistema
    • Impostazione della frequenza di aggiornamento predefinita: il valore della frequenza di aggiornamento predefinita è impostato nell'overlay di configurazione R.integer.config_defaultRefreshRate. Questo valore viene utilizzato per determinare la frequenza di aggiornamento standard del dispositivo per le animazioni e le interazioni touch.
    • Impostazione della frequenza di aggiornamento di picco: il valore della frequenza di aggiornamento di picco viene letto da Settings.System.PEAK_REFRESH_RATE. Questo valore viene modificato in fase di esecuzione per riflettere l'impostazione corrente del dispositivo (ad esempio da un'opzione di menu). Il valore predefinito è impostato nell'overlay di configurazione R.integer.config_defaultPeakRefreshRate.
    • Impostazione della frequenza di aggiornamento minima: il valore della frequenza di aggiornamento minima viene letto da Settings.System.MIN_REFRESH_RATE. Questo valore può essere modificato in fase di runtime in modo da riflettere l'impostazione corrente del dispositivo (ad esempio da un'opzione di menu). Il valore predefinito è 0, quindi non esiste un valore minimo predefinito.
    • ModeId richiesto dall'applicazione: le app possono impostare WindowManager.LayoutParams.preferredDisplayModeId in base a una configurazione preferita con cui deve funzionare il display. Nella maggior parte delle condizioni, DisplayManager imposta l'ID configurazione predefinito di conseguenza e imposta la frequenza di aggiornamento minima e massima in modo che corrisponda alla frequenza di aggiornamento della configurazione.
    • Risparmio energetico: la frequenza di aggiornamento è limitata a 60 Hz o meno quando il dispositivo è in modalità di risparmio energetico, come indicato da Settings.Global.LOW_POWER_MODE.

Una volta impostato il criterio, DisplayManager imposta la frequenza di aggiornamento in base ai livelli attivi (livelli che mettono in coda gli aggiornamenti dei frame).SurfaceFlinger Se il proprietario del livello imposta una frequenza fotogrammi, SurfaceFlinger versucht, di impostare la frequenza di aggiornamento su un valore che sia un moltiplicatore di questa frequenza. Ad esempio, se due livelli attivi impostano la frequenza fotogrammi su 24 e su 60, SurfaceFlinger sceglierà 120 Hz se disponibile. Se questa frequenza di aggiornamento non è disponibile per SurfaceFlinger, verrà selezionata la frequenza di aggiornamento con l'errore minimo per la frequenza frame. Per ulteriori informazioni, consulta la documentazione per gli sviluppatori all'indirizzo developer.android.com.

SurfaceFlinger gestisce i seguenti flag per controllare la modalità di determinazione della frequenza di aggiornamento:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: Se impostato, la frequenza di aggiornamento viene decisa in base ai livelli attivi, anche se non è stata impostata una frequenza fotogrammi. SurfaceFlinger gestisce un'euristica che trova i fotogrammi al secondo medi con cui il livello pubblica i buffer esaminando il timestamp della presentazione associato al buffer.
  • ro.surface_flinger.set_touch_timer_ms: se > 0, verrà utilizzata la frequenza di aggiornamento predefinita quando un utente tocca lo schermo per il timeout configurato. Questa euristica è stata creata per essere pronta con la frequenza di aggiornamento predefinita per le animazioni.
  • ro.surface_flinger.set_idle_timer_ms: se il valore è > 0, la frequenza di aggiornamento minima verrà utilizzata quando non ci sono aggiornamenti dello schermo per il timeout configurato.
  • ro.surface_flinger.set_display_power_timer_ms: se > 0, verrà utilizzata la frequenza di aggiornamento predefinita quando si accende il display (o quando si esce dal display sempre attivo) per il timeout configurato.

API Frame Rate

L'API frequenza frame consente alle app di comunicare alla piattaforma Android la frequenza frame prevista ed è disponibile nelle app che hanno come target Android 11. Per scoprire di più sull'API frame rate, consulta la documentazione per sviluppatori all'indirizzo developer.android.com.

Opzioni sviluppatore

Al menu è stata aggiunta una nuova opzione sviluppatore che attiva/disattiva un overlay sul display con la frequenza di aggiornamento corrente. La nuova opzione si trova in Impostazioni > Sistema > Opzioni sviluppatore > Mostra frequenza.