Android 11 ajoute la prise en charge des appareils avec plusieurs fréquences d'actualisation. Cette fonctionnalité comporte trois composants principaux :
- Nouvelles API HAL introduites dans
android.hardware.graphics.composer@2.4
. - Code de plate-forme permettant d'analyser les configurations d'appareil pour différentes fréquences d'actualisation et de définir la fréquence d'actualisation souhaitée
- Nouvelles API SDK et NDK permettant aux applications de définir la fréquence d'images souhaitée
Implémentation
Une assistance dédiée au changement de fréquence d'actualisation a été ajoutée à android.hardware.graphics.composer@2.4 HAL
.
Nous vous recommandons vivement d'utiliser cette version, car les versions précédentes de composer HAL offrent une compatibilité limitée avec le changement de fréquence d'actualisation.
Groupes de configuration
Un nouvel attribut CONFIG_GROUP
a été ajouté à IComposerClient::Attribute
, qui peut être interrogé à l'aide de l'API getDisplayAttribute_2_4
. Cet attribut permet aux fournisseurs de regrouper les configurations d'affichage. Les configurations d'un même groupe permettent de passer facilement de l'une à l'autre dans la plupart des cas. Le groupe de configuration est utilisé par la plate-forme pour différencier les configurations entre lesquelles il est possible de basculer afin de modifier la fréquence d'actualisation et non d'autres attributs pour une configuration.
Prenons l'exemple suivant, qui illustre les avantages de l'utilisation de groupes de configuration avec un appareil compatible avec quatre configurations d'affichage :
- 1080p à 60 Hz
- 1080p à 90 Hz
- 1080i@72Hz
- 1080i à 48 Hz
Même si l'appareil est compatible avec les fréquences d'actualisation de 48 Hz, 60 Hz, 72 Hz et 90 Hz, l'écran fonctionne dans un mode différent. Le passage de 60 Hz à 72 Hz modifie la configuration de l'écran de 1080p à 1080i, ce qui n'est peut-être pas le comportement souhaité. Pour résoudre ce problème, utilisez des groupes de configuration. En regroupant les fréquences 60 Hz et 90 Hz dans un groupe de configuration, et les fréquences 48 Hz et 72 Hz dans un autre groupe de configuration. La plate-forme sait qu'elle peut passer de 60 Hz à 90 Hz et de 48 Hz à 72 Hz, mais pas de 60 Hz à 72 Hz, car cela entraînerait une modification de la configuration plutôt qu'un simple changement de la fréquence d'actualisation.


Mises à jour de l'API Composer
- getDisplayVsyncPeriod
- a été ajouté pour améliorer le contrôle et la prévisibilité lors du changement de fréquence d'actualisation.
getDisplayVsyncPeriod
getDisplayVsyncPeriod
renvoie la fréquence d'actualisation actuelle (en termes de période de synchronisation verticale) à laquelle l'écran fonctionne. Cela est particulièrement utile lors de la transition entre la fréquence d'actualisation et la fréquence d'actualisation actuelle, qui est nécessaire à la plate-forme pour décider quand démarrer le prochain frame. - setActiveConfigWithConstraints
- La méthode
setActiveConfigWithConstraints
est une nouvelle extension de la méthodesetActiveConfig
existante. Elle fournit plus d'informations sur la modification de la configuration. Les contraintes sont fournies dans les paramètresvsyncPeriodChangeConstraints
et contiennent les paramètres suivants. - desiredTimeNanos
- Heure (en
CLOCK_MONOTONIC
) après laquelle la période de synchronisation verticale peut changer (c'est-à-dire que la période de synchronisation verticale ne doit pas changer avant cette heure). Cela est utile lorsque la plate-forme souhaite planifier à l'avance un changement de fréquence d'actualisation, mais qu'elle dispose déjà de certains tampons dans la file d'attente à présenter. La plate-forme définit cette heure en conséquence pour tenir compte de ces marges et s'assurer que la transition du taux d'actualisation sera aussi fluide que possible. - seamlessRequired
- Si la valeur est "true", la modification de la période de synchronisation verticale doit se faire de manière fluide, sans artefact visuel perceptible. Cette option est utilisée par la plate-forme lorsqu'un changement de fréquence d'actualisation est nécessaire à la suite d'un changement de contenu (par exemple, l'appareil est inactif et une animation démarre). Cela permet au fournisseur de ne pas autoriser certaines modifications de configuration lorsqu'elles peuvent entraîner un artefact visuel notable. Si les configurations ne peuvent pas être modifiées de manière fluide et que
seamlessRequired
est défini surtrue
, l'implémentation est censée renvoyerSEAMLESS_NOT_POSSIBLE
comme code de retour et appeler le nouveau rappelonSeamlessPossible
lorsque la même modification de configuration peut être effectuée de manière fluide. En cas de réussite, l'implémentation renvoie un
VsyncPeriodChangeTimeline
qui indique à la plate-forme quand le changement de fréquence d'actualisation doit se produire. Les paramètresnewVsyncAppliedTimeNanos
doivent être définis sur l'heureCLOCK_MONOTONIC
à laquelle le nouvel écran commencera à s'actualiser à la nouvelle période de synchronisation verticale. Cela, associé àdesiredTimeNanos
, permet à la plate-forme de planifier à l'avance le changement de fréquence d'actualisation et de commencer à faire fonctionner les applications pour la nouvelle fréquence d'actualisation à l'avance. Cela permet une transition fluide de la fréquence d'actualisation.Certaines implémentations nécessitent l'envoi d'un frame d'actualisation avant que la fréquence d'actualisation puisse être envoyée. Pour cela, le HAL dispose du paramètre
refreshRequired
pour indiquer qu'un frame d'actualisation est nécessaire et derefreshTimeNanos
pour indiquer le premier vsync après lequel un frame d'actualisation doit être envoyé.- onVsyncPeriodTimingChanged [callback]
- Un nouveau rappel qui peut être appelé par le HAL pour indiquer à la plate-forme qu'un paramètre de la timeline a changé et que la plate-forme doit ajuster sa timeline. Ce rappel est censé être appelé si, pour une raison quelconque, l'ancienne timeline a été manquée en raison d'un long temps de traitement sur le HAL ou d'une frame d'actualisation tardive.
Comment la plate-forme décide-t-elle de modifier la fréquence d'actualisation ?
La sélection du taux d'actualisation s'effectue dans les deux services système suivants :
- DisplayManager
DisplayManager
définit la règle de haut niveau concernant le taux d'actualisation. Il définit une configuration d'affichage par défaut, qui est identique à la configuration HAL du compositeur. Il définit également une plage de valeurs minimale et maximale pour queSurfaceFlinger
puisse choisir le taux d'actualisation.- SurfaceFlinger
- Détermine le taux d'actualisation en définissant une configuration qui se trouve dans le même groupe de configuration que la configuration par défaut et avec un taux d'actualisation compris dans la plage min/max.
Le Gestionnaire d'affichage suit les étapes suivantes pour déterminer la règle :
- Recherche l'ID de configuration par défaut en interrogeant la configuration active à partir de
SurfaceFlinger
- Restreindre la plage de valeurs minimale et maximale en itérant sur les conditions système
- Paramètre de fréquence d'actualisation par défaut : la valeur de la fréquence d'actualisation par défaut est définie dans la superposition de configuration
R.integer.config_defaultRefreshRate
. Cette valeur permet de déterminer la fréquence d'actualisation standard de l'appareil pour les animations et les interactions tactiles. - Paramètre de fréquence d'actualisation maximale : la valeur de la fréquence d'actualisation maximale est lue à partir de
Settings.System.PEAK_REFRESH_RATE
. Cette valeur est modifiée lors de l'exécution pour refléter le paramètre actuel de l'appareil (par exemple, à partir d'une option de menu). La valeur par défaut est définie dans la superposition de configurationR.integer.config_defaultPeakRefreshRate
. - Paramètre de fréquence d'actualisation minimale : la valeur de fréquence d'actualisation minimale est lue à partir de
Settings.System.MIN_REFRESH_RATE
. Cette valeur peut être modifiée lors de l'exécution pour refléter le paramètre actuel de l'appareil (par exemple, à partir d'une option de menu). La valeur par défaut est 0, ce qui signifie qu'il n'y a pas de minimum par défaut. - ModeId demandé par l'application : les applications peuvent définir
WindowManager.LayoutParams.preferredDisplayModeId
pour refléter une configuration préférée à laquelle l'écran doit fonctionner. Dans la plupart des cas,DisplayManager
définit l'ID de configuration par défaut en conséquence et définit la fréquence d'actualisation minimale et maximale pour qu'elle corresponde à celle de la configuration. - Économiseur de batterie : la fréquence d'actualisation est limitée à 60 Hz ou moins lorsque l'appareil est en mode basse consommation, ce qui est indiqué par l'icône
Settings.Global.LOW_POWER_MODE.
.
- Paramètre de fréquence d'actualisation par défaut : la valeur de la fréquence d'actualisation par défaut est définie dans la superposition de configuration
Une fois que DisplayManager
a défini la règle, SurfaceFlinger
définit le taux d'actualisation en fonction des calques actifs (calques qui mettent en file d'attente les mises à jour des frames). Si le propriétaire du calque définit une fréquence d'images, SurfaceFlinger tente de définir la fréquence d'actualisation sur une valeur qui est un multiple de cette fréquence.
Par exemple, si deux calques actifs définissent leur fréquence d'images sur 24 et 60, SurfaceFlinger choisira 120 Hz si cette fréquence est disponible. Si une telle fréquence d'actualisation n'est pas disponible pour SurfaceFlinger, il essaiera de choisir la fréquence d'actualisation qui présente l'erreur minimale pour la fréquence d'images. Pour en savoir plus, consultez la documentation pour les développeurs sur developer.android.com.
SurfaceFlinger
conserve les indicateurs suivants pour contrôler la façon dont la fréquence d'actualisation est déterminée :
ro.surface_flinger.use_content_detection_for_refresh_rate:
Si la fréquence d'actualisation est définie, elle est déterminée en fonction des calques actifs, même si aucune fréquence d'images n'a été définie. SurfaceFlinger maintient une heuristique qui permet de trouver le nombre moyen de FPS pour lequel le calque publie des tampons en examinant le code temporel de présentation associé au tampon.ro.surface_flinger.set_touch_timer_ms
: si la valeur est > 0, le taux d'actualisation par défaut sera utilisé lorsqu'un utilisateur appuie sur l'écran pendant le délai configuré. Cette heuristique est effectuée pour être prêt avec le taux d'actualisation par défaut pour les animations.ro.surface_flinger.set_idle_timer_ms
: si la valeur est > 0, la fréquence d'actualisation minimale sera utilisée en l'absence de mises à jour de l'écran pendant le délai d'inactivité configuré.ro.surface_flinger.set_display_power_timer_ms
: si la valeur est > 0, le taux d'actualisation par défaut sera utilisé lors de l'activation de l'écran (ou lors de la désactivation de l'AOD) pour le délai configuré.
API Frame Rate
L'API de fréquence d'images permet aux applications d'informer la plate-forme Android de la fréquence d'images qu'elles souhaitent utiliser. Elle est disponible sur les applications qui ciblent Android 11. Pour en savoir plus sur l'API de fréquence d'images, consultez la documentation pour les développeurs sur developer.android.com.
Options pour les développeurs

Une nouvelle option pour les développeurs a été ajoutée au menu. Elle permet d'activer ou de désactiver une superposition sur l'écran qui affiche la fréquence d'actualisation actuelle. La nouvelle option se trouve sous Paramètres > Système > Options pour les développeurs > Afficher la fréquence d'actualisation.