Android 11 aggiunge il supporto per i dispositivi con più frequenze di aggiornamento. Esistono 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
- Nuovo SDK e API NDK per consentire alle app di impostare la frequenza fotogrammi desiderata
Implementazione
È stato aggiunto il supporto dedicato per il passaggio della frequenza di aggiornamento a
android.hardware.graphics.composer@2.4 HAL
.
Ti consigliamo vivamente di utilizzare questa versione poiché le versioni precedenti
Composer HAL offre un supporto limitato per il cambio 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
configurazioni del display. Le configurazioni nello stesso gruppo consentono
nella maggior parte dei casi è possibile passare facilmente da una modalità all'altra. 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 l'esempio seguente che mostra i vantaggi dell'utilizzo della configurazione gruppi 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 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. Per risolvere questo problema, si usano i gruppi di configurazione. Raggruppando 60 Hz e 90 Hz in una e a 48 Hz e 72 Hz in un altro gruppo di configurazione. La piattaforma sa che può passare tra 60Hz e 90Hz e tra 48Hz e 72Hz ma non tra 60 Hz e 72 Hz, poiché ciò determina una modifica della configurazione anziché una semplice modifica la 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
setActiveConfigWithConstraints
metodo è una nuova estensione al metodosetActiveConfig
esistente e fornisce più dettagli informazioni sulla modifica della configurazione. I vincoli vengono forniti come partevsyncPeriodChangeConstraints
e contengono i seguenti parametri: parametri. - NanoSintesi desiderata
- L'ora in
CLOCK_MONOTONIC
dopo la quale il periodo vsync può cambiare (ovvero il periodo vsync non deve cambiare prima di questa ora). È utile quando la piattaforma vuole pianificare in anticipo una frequenza di aggiornamento. modifica, ma ha già alcuni buffer in coda per la presentazione. 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 è necessaria una
modifica della frequenza di aggiornamento a seguito di una modifica dei contenuti (ad esempio, il
dispositivo è inattivo e inizia 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 sutrue
, l'implementazione dovrebbe restituireSEAMLESS_NOT_POSSIBLE
come codice di ritorno e chiamare il nuovo callbackonSeamlessPossible
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 parametrinewVsyncAppliedTimeNanos
devono essere impostati sul momento inCLOCK_MONOTONIC
in cui il nuovo display inizierà ad aggiornarsi con il nuovo periodo vsync. Questo, insieme adesiredTimeNanos
, consente alla piattaforma di pianificare in anticipo il passaggio alla nuova frequenza di aggiornamento e di iniziare a contrassegnare le app per la nuova frequenza di aggiornamento in anticipo. Ciò consente una transizione senza interruzioni della frequenza di aggiornamento.Alcune implementazioni richiedono l'invio di un frame di aggiornamento prima dell'aggiornamento di Google Cloud. Per questo, l'HAL ha il
refreshRequired
per indicare che è necessario un frame di aggiornamento erefreshTimeNanos
per indicare la prima vsync in cui viene eseguito un frame di aggiornamento deve essere inviato successivamente.- onVsyncPeriodTimingChanged [callback]
- Un nuovo callback che può essere chiamato dall'HAL per indicare alla piattaforma che alcune della sequenza temporale è cambiato e la piattaforma deve adeguare la sequenza temporale. Questo callback dovrebbe essere chiamato se per qualche motivo la sequenza temporale precedente è stata non completata a causa di un tempo di elaborazione lungo nell'HAL o di un aggiornamento tardivo frame.
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:
- Gestore Display
- 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, imposta un intervallo di valori minimo e massimo perSurfaceFlinger
da scegliere come frequenza di aggiornamento. - SurfaceFlinger
- Determina la frequenza di aggiornamento impostando una configurazione che appartiene allo stesso gruppo della configurazione predefinita e con una frequenza di aggiornamento compresa nell'intervallo minimo/massimo.
Display Manager esegue i seguenti passaggi per determinare norme:
- Trova l'ID configurazione predefinito eseguendo una query sulla configurazione attiva da
SurfaceFlinger
- Limita l'intervallo di valori minimo e massimo eseguendo l'iterazione sul
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 interazioni tattili. - 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 nel Overlay di configurazioneR.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 condizioniDisplayManager
imposta l'ID configurazione predefinito di conseguenza e imposta la frequenza di aggiornamento minima e massima in base ai valori della configurazione e la frequenza di aggiornamento. - 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.
- Impostazione della frequenza di aggiornamento predefinita: il valore della frequenza di aggiornamento predefinita è impostato nell'overlay di configurazione
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). 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 frame su 24 e 60, SurfaceFlinger selezionerà 120 Hz se disponibile. Se questa frequenza di aggiornamento non è disponibile per
SurfaceFlinger, proverà a scegliere la frequenza di aggiornamento con minimo
errore per la frequenza frame. Per ulteriori informazioni, consulta la documentazione per gli sviluppatori all'indirizzo developer.android.com.
SurfaceFlinger
mantiene i seguenti flag per
controlla il modo in cui viene definita la frequenza di aggiornamento:
ro.surface_flinger.use_content_detection_for_refresh_rate:
Se la frequenza di aggiornamento viene decisa in base anche se non è stata impostata una frequenza fotogrammi. SurfaceFlinger mantiene una euristica in cui trova i f/s medi in base ai quali il livello pubblica i buffer esaminando il timestamp della presentazione allegato 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 è preparata con la frequenza di aggiornamento predefinita le animazioni.ro.surface_flinger.set_idle_timer_ms
: se > 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, il La frequenza di aggiornamento predefinita sarà usata all'accensione del display (o quando fuori AOD) 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ù su l'API frame rate, consulta la documentazione per sviluppatori all'indirizzo developer.android.com.
Opzioni sviluppatore

Al menu è stata aggiunta una nuova opzione per gli sviluppatori 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 di aggiornamento.