Android 11 prend en charge les 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 de l'appareil pour différents taux d'actualisation et de définir le taux d'actualisation souhaité
- Nouvelles API de SDK et de NDK permettant aux applications de définir la fréquence d'images souhaitée
Implémentation
La prise en charge dédiée du 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 HAL Composer ne prennent pas en charge de manière optimale 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 des configurations d'affichage. Dans la plupart des cas, les configurations d'un même groupe permettent de basculer facilement entre elles. Le groupe de configuration est utilisé par la plate-forme pour différencier les configurations pouvant être basculées entre elles afin de modifier la fréquence d'actualisation et non les autres attributs d'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 à 72 Hz
- 1080i@48Hz
Bien que l'appareil soit compatible avec les fréquences d'actualisation de 48, 60 Hz, 72 Hz et 90 Hz, l'écran fonctionne dans un mode différent. En passant de 60 Hz à 72 Hz, la configuration de l'écran passe de 1080p à 1 080i, 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.
Nouveautés concernant l'API Composer
- getDisplayVsyncPeriod
- Pour un meilleur contrôle et une meilleure prévisibilité lors du changement de fréquence d'actualisation,
getDisplayVsyncPeriod
a été ajouté.getDisplayVsyncPeriod
renvoie la fréquence d'actualisation actuelle (en termes de période vsync) à 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, dont la plate-forme a besoin pour décider quand lancer le frame suivant. - setActiveConfigWithConstraints
- La méthode
setActiveConfigWithConstraints
est une nouvelle extension de la méthodesetActiveConfig
existante et fournit plus d'informations sur la modification de configuration. Les contraintes sont fournies dans les paramètresvsyncPeriodChangeConstraints
et contiennent les paramètres suivants. - desiredTimeNanos
- Heure dans
CLOCK_MONOTONIC
après laquelle la période vsync peut changer (c'est-à-dire que la période vsync ne doit pas être modifiée 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 tampons dans la file d'attente à présenter. La plate-forme définit ce délai en conséquence pour tenir compte de ces tampons et s'assurer que la transition de fréquence d'actualisation sera aussi fluide que possible. - transparenteRequis
- Si la valeur est "true", la modification de la période de vsync doit se produire de manière transparente, sans artefact visuel notable. Cet indicateur est utilisé par la plate-forme lorsqu'un changement de fréquence d'actualisation est nécessaire en raison d'un changement de contenu (par exemple, l'appareil est inactif et l'animation commence). 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 transparente et que
seamlessRequired
est défini surtrue
, l'implémentation doit renvoyerSEAMLESS_NOT_POSSIBLE
comme code de retour et appeler le nouveau rappelonSeamlessPossible
lorsque le même changement de configuration peut être effectué de manière transparente. 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'heure dansCLOCK_MONOTONIC
à laquelle le nouvel affichage commencera à s'actualiser à la nouvelle période vsync. En plus dedesiredTimeNanos
, cela permet à la plate-forme de planifier à l'avance le changement de fréquence d'actualisation et de commencer à cocher les applications pour le nouveau taux d'actualisation à l'avance. Cela permet une transition fluide de la fréquence d'actualisation.Certaines implémentations nécessitent l'envoi d'une image 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]
- Nouveau rappel pouvant être appelé par le HAL pour indiquer à la plate-forme qu'un paramètre de la chronologie a changé et que la plate-forme doit ajuster sa chronologie. Ce rappel doit être appelé si, pour une raison quelconque, l'ancienne chronologie a été manquée en raison d'un long temps de traitement sur le HAL ou d'un frame d'actualisation tardif.
Comment la plate-forme décide-t-elle de modifier la fréquence d'actualisation ?
La sélection de la fréquence d'actualisation se fait dans les deux services système suivants:
- DisplayManager
DisplayManager
définit la stratégie de haut niveau autour du taux d'actualisation. Il définit une configuration d'affichage par défaut, qui est identique à la configuration HAL du compilateur. En outre, il définit une plage de valeurs minimales et maximales queSurfaceFlinger
peut choisir comme fréquence d'actualisation.- SurfaceFlinger
- Détermine la fréquence 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 une fréquence d'actualisation comprise dans la plage minimale/maximale.
Le Gestionnaire d'affichage effectue 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
. - Limiter la plage de valeurs minimales et maximales en itérant sur les conditions du 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 crête: la valeur de la fréquence d'actualisation crête est lue à partir de
Settings.System.PEAK_REFRESH_RATE
. Cette valeur est modifiée au moment 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 la 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. Il n'y a donc pas de valeur minimale par défaut. - ModeId demandé par l'application: les applications peuvent définir
WindowManager.LayoutParams.preferredDisplayModeId
pour refléter la configuration préférée à laquelle l'écran doit fonctionner. Dans la plupart des conditions,DisplayManager
définit l'ID de configuration par défaut en conséquence, ainsi que les fréquences d'actualisation minimale et maximale afin qu'elles correspondent à la fréquence d'actualisation de la configuration. - Économiseur de batterie: la fréquence d'actualisation est limitée à 60 Hz ou moins lorsque l'appareil est en mode Économie d'énergie, comme indiqué via
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
définit la stratégie, SurfaceFlinger
définit la fréquence d'actualisation en fonction des calques actifs (calques qui mettent en file d'attente les mises à jour de frame). Si le propriétaire du calque définit une fréquence d'images, SurfaceFlinger tente de définir la fréquence d'actualisation sur un multiplicateur de cette fréquence.
Par exemple, si deux couches actives définissent leur fréquence d'images sur 24 et 60, SurfaceFlinger choisit la fréquence 120 Hz si elle est disponible. Si ce taux de rafraîchissement n'est pas disponible pour SurfaceFlinger, il essaiera de sélectionner le taux de rafraîchissement qui présente l'erreur minimale pour la fréquence d'images. Pour en savoir plus, consultez la documentation destinée aux développeurs sur developer.android.com.
SurfaceFlinger
gère les indicateurs suivants pour contrôler la détermination de la fréquence d'actualisation:
ro.surface_flinger.use_content_detection_for_refresh_rate:
Si défini, la fréquence d'actualisation est déterminée en fonction des calques actifs, même si aucune fréquence d'images n'a été définie. SurfaceFlinger utilise une méthode heuristique qui détermine le nombre moyen de FPS que la couche publie des tampons en examinant le code temporel de présentation associé au tampon.ro.surface_flinger.set_touch_timer_ms
: si elle est supérieure à 0, la fréquence d'actualisation par défaut est utilisée lorsqu'un utilisateur touche l'écran pendant le délai d'inactivité configuré. Cette heuristique est conçue pour être prête avec le taux de rafraîchissement par défaut pour les animations.ro.surface_flinger.set_idle_timer_ms
: si la valeur est supérieure à 0, la fréquence d'actualisation minimale est utilisée lorsqu'il n'y a pas de mises à jour d'écran pour le délai avant expiration configuré.ro.surface_flinger.set_display_power_timer_ms
: si la valeur est supérieure à 0, le taux de rafraîchissement par défaut est utilisé lorsque l'écran est allumé (ou lorsque vous quittez le mode AOD) pour le délai de sortie 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 prévue. 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 destinée aux développeurs sur developer.android.com.
Options pour les développeurs
Une nouvelle option pour les développeurs a été ajoutée au menu, qui permet d'afficher ou de masquer une superposition à l'écran avec 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.