Frequenza di aggiornamento multipla

Android 11 aggiunge il supporto per dispositivi con più frequenze di aggiornamento. Ci sono tre componenti principali di questa funzionalità:

  • 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

Il supporto dedicato per la commutazione della frequenza di aggiornamento è stato aggiunto ad android.hardware.graphics.composer@2.4 HAL . Consigliamo vivamente di utilizzare questa versione poiché le versioni precedenti del compositore HAL hanno un supporto limitato per la commutazione della frequenza di aggiornamento.

Gruppi di configurazione

Un nuovo attributo CONFIG_GROUP è stato aggiunto a IComposerClient::Attribute su cui è possibile eseguire query utilizzando l'API getDisplayAttribute_2_4 . Questo attributo consente ai fornitori di raggruppare insieme le configurazioni di visualizzazione. Le configurazioni nello stesso gruppo consentono il passaggio diretto dall'una all'altra nella maggior parte dei casi. Il gruppo di configurazione viene utilizzato dalla piattaforma per differenziare quali configurazioni possono essere scambiate tra loro per cambiare la frequenza di aggiornamento e non altri attributi per una configurazione.

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

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

Anche se il dispositivo supporta frequenze di aggiornamento di 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 modifica la configurazione del display da 1080p a 1080i, il che potrebbe non essere il comportamento desiderato. Questo viene risolto utilizzando i gruppi di configurazione. Raggruppando 60Hz e 90Hz insieme in un gruppo di configurazione e 48Hz e 72Hz in un altro gruppo di configurazione. La piattaforma sa che può passare tra 60Hz e 90Hz e tra 48Hz e 72Hz ma non tra 60Hz e 72Hz poiché ciò comporterà una modifica della configurazione anziché una semplice modifica della frequenza di aggiornamento.

Aggiornamenti dell'API Composer

getDisplayVsyncPeriod
Per un migliore controllo e 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 opera il display. Ciò è particolarmente utile quando la transizione tra la frequenza di aggiornamento e la frequenza di aggiornamento corrente è necessaria alla piattaforma per decidere quando avviare il fotogramma successivo.
setActiveConfigWithConstraints
Il metodo setActiveConfigWithConstraints è una nuova estensione del metodo setActiveConfig esistente e fornisce ulteriori informazioni sulla modifica della configurazione. I vincoli vengono forniti come parte dei parametri vsyncPeriodChangeConstraints e contengono i seguenti parametri.
    desideratoTimeNanos
    L'ora in CLOCK_MONOTONIC dopo la quale il periodo vsync può cambiare (ovvero il periodo vsync non deve cambiare prima di quest'ora). Ciò è 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 vero, è necessario che la modifica del periodo di vsync avvenga senza problemi, senza artefatti visivi evidenti. Questo flag viene utilizzato dalla piattaforma quando è necessaria una modifica della frequenza di aggiornamento a seguito di una modifica del contenuto (ad esempio, il dispositivo è inattivo e viene avviata l'animazione). Ciò offre al fornitore l'opportunità di non consentire determinate modifiche alla configurazione quando potrebbero comportare un evidente artefatto visivo. Se le configurazioni non possono essere modificate senza problemi e seamlessRequired è impostato su true , si prevede che l'implementazione restituisca SEAMLESS_NOT_POSSIBLE come codice di ritorno e chiami il nuovo callback onSeamlessPossible quando la stessa modifica della configurazione può essere eseguita senza problemi.

In caso di successo, l'implementazione restituisce un VsyncPeriodChangeTimeline che indica alla piattaforma quando aspettarsi che si verifichi la modifica della frequenza di aggiornamento. I parametri newVsyncAppliedTimeNanos devono essere impostati sull'ora in CLOCK_MONOTONIC quando il nuovo display inizierà ad aggiornarsi nel nuovo periodo vsync. Questo, insieme a desiredTimeNanos , consente alla piattaforma di pianificare in anticipo il cambio della frequenza di aggiornamento e iniziare a spuntare in anticipo le app per la nuova frequenza di aggiornamento. Ciò consente una transizione fluida della frequenza di aggiornamento.

Alcune implementazioni richiedono l'invio di un frame di aggiornamento prima dell'invio della frequenza di aggiornamento. Per questo, l'HAL ha il 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 [richiamata]
Una nuova callback che può essere chiamata dall'HAL per indicare alla piattaforma che alcuni parametri della sequenza temporale sono cambiati e la piattaforma deve modificare la propria sequenza temporale. È previsto che questo callback venga chiamato se per qualche motivo la vecchia sequenza temporale è stata persa a causa di un lungo tempo di elaborazione sull'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 due servizi di sistema seguenti:

DisplayManager
Il DisplayManager imposta la politica di alto livello attorno alla frequenza di aggiornamento. Imposta una configurazione di visualizzazione predefinita, che è la stessa della configurazione HAL del compositore. Inoltre, imposta un intervallo di valori minimi e massimi 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 minimo/massimo.

Il Display Manager esegue i seguenti passaggi per determinare la policy:

  • Trova l'ID di configurazione predefinito eseguendo una query sulla configurazione attiva da SurfaceFlinger
  • Restrizione dell'intervallo dei valori minimo e massimo eseguendo un'iterazione sulle condizioni del 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 runtime per riflettere l'impostazione corrente del dispositivo (ad esempio da un'opzione di menu). Il valore predefinito è 0, quindi non esiste un minimo predefinito.
    • ModeId richiesto dall'applicazione : le app possono impostare WindowManager.LayoutParams.preferredDisplayModeId per riflettere una configurazione preferita in cui deve funzionare il display. Nella maggior parte delle condizioni DisplayManager imposta di conseguenza l'ID di configurazione predefinito e imposta la frequenza di aggiornamento minima e massima in modo che corrisponda alla frequenza di aggiornamento della configurazione.
    • Risparmio batteria : la frequenza di aggiornamento è limitata a 60 Hz o inferiore quando il dispositivo è in modalità di risparmio energetico, come indicato tramite Settings.Global.LOW_POWER_MODE.

Una volta che DisplayManager ha impostato la policy, SurfaceFlinger imposta la frequenza di aggiornamento in base ai livelli attivi (livelli che accodano gli aggiornamenti dei frame). Se il proprietario del livello imposta una frequenza fotogrammi , SurfaceFlinger tenta di impostare la frequenza di aggiornamento su qualcosa che sia un moltiplicatore di tale frequenza. Ad esempio, se due livelli attivi impostano la frequenza fotogrammi su 24 e 60, SurfaceFlinger sceglierà 120 Hz se disponibile. Se tale frequenza di aggiornamento non è disponibile per SurfaceFlinger, proverà a scegliere la frequenza di aggiornamento che presenta l'errore minimo per la frequenza dei fotogrammi. Per ulteriori informazioni, consultare la documentazione per gli sviluppatori su Developer.android.com

SurfaceFlinger mantiene i seguenti flag per controllare come viene decisa la 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 mantiene un'euristica in cui trova gli fps medi che il livello sta pubblicando nei buffer esaminando il timestamp della presentazione allegato al buffer.
  • ro.surface_flinger.set_touch_timer_ms : se > 0, la frequenza di aggiornamento predefinita verrà utilizzata quando un utente tocca lo schermo per il timeout configurato. Questa euristica viene eseguita per essere pronta con la frequenza di aggiornamento predefinita per le animazioni.
  • ro.surface_flinger.set_idle_timer_ms : se > 0, verrà utilizzata la frequenza di aggiornamento minima quando non ci sono aggiornamenti dello schermo per il timeout configurato.
  • ro.surface_flinger.set_display_power_timer_ms : se > 0, la frequenza di aggiornamento predefinita verrà utilizzata quando si accende il display (o quando si esce dall'AOD) per il timeout configurato.

API frequenza fotogrammi

L'API frame rate consente alle app di informare la piattaforma Android sulla frequenza fotogrammi prevista ed è disponibile sulle app destinate ad Android 11. Per ulteriori informazioni sull'API frame rate, consulta la documentazione per gli sviluppatori su Developer.android.com .

Opzioni sviluppatore

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