Android 11 prend en charge les appareils avec plusieurs fréquences d'actualisation. Il y a trois composants principaux de cette fonctionnalité:
- 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 précédentes
Les HAL de Composer sont compatibles de façon limitée avec le changement de fréquence d'actualisation.
Groupes de configuration
Un nouvel attribut CONFIG_GROUP
a été ajouté à
IComposerClient::Attribute
pouvant être interrogée à l'aide de la classe
getDisplayAttribute_2_4
. Cet attribut permet aux fournisseurs de regrouper des configurations d'affichage. Les configurations d'un même groupe permettent
un basculement fluide de l'un
à l'autre dans la plupart des cas. La plate-forme utilise le groupe de configuration pour différencier les configurations pouvant être modifiées afin de modifier la fréquence d'actualisation et non d'autres attributs d'une configuration.
Prenons l'exemple suivant, qui montre les avantages de l'utilisation de la configuration avec un appareil compatible avec quatre configurations d'affichage:
- 1080p à 60 Hz
- 1080p à 90 Hz
- 1080i à 72 Hz
- 1080i@48Hz
Même si l'appareil est compatible avec les fréquences d'actualisation 48, 60 Hz, 72 Hz et 90 Hz, l'écran fonctionne dans un mode différent, et le passage de la fréquence 60 Hz à la 72 Hz modifie configuration d'affichage 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 et 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'une simple modification de la fréquence d'actualisation.


Mises à jour de l'API Composer
- getDisplayVsyncPeriod
- Pour un contrôle et une prévisibilité améliorés lors de la modification des fréquences d'actualisation
getDisplayVsyncPeriod
a été ajouté.getDisplayVsyncPeriod
renvoie la fréquence d'actualisation actuelle (en termes de période vsync) de l'écran. C'est particulièrement utile quand entre la fréquence d'actualisation et la fréquence d'actualisation actuelle est nécessaire plateforme pour décider quand lancer le frame suivant. - setActiveConfigWithConstraints
- La méthode
setActiveConfigWithConstraints
est une nouvelle extension à la méthodesetActiveConfig
existante et fournit plus des informations sur le changement de configuration. Les contraintes sont définies dans le cadrevsyncPeriodChangeConstraints
et contiennent les éléments suivants : paramètres. - Heures souhaitéesNanos
- Heure au bout de laquelle la période vsync peut s'écouler dans
CLOCK_MONOTONIC
modifier (la période vsync ne doit pas être modifiée avant cette date). Ceci est utile lorsque la plate-forme souhaite planifier à l'avance une fréquence d'actualisation modifier, mais il a déjà des 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 le la transition de la fréquence d'actualisation sera aussi fluide que possible. - seamlessRequired
- Si la valeur est "true", nécessite que le changement de la période vsync s'effectue de manière transparente.
sans artefact visuel notable. Cet indicateur est utilisé par la plate-forme lorsqu'un
la fréquence d'actualisation est nécessaire suite à une modification de contenu (par exemple,
l'appareil est inactif et l'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 facilement et
seamlessRequired
est défini surtrue
, l'implémentation est devrait renvoyerSEAMLESS_NOT_POSSIBLE
comme code de retour. appeler le nouveau rappelonSeamlessPossible
lorsque la même configuration le changement se font de façon 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'heure dansCLOCK_MONOTONIC
à laquelle le nouvel écran commencera à s'actualiser à la nouvelle période de 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. Ce permet une transition fluide de la fréquence d'actualisation.Certaines implémentations nécessitent l'envoi d'un frame de rafraîchissement avant que la fréquence de rafraîchissement puisse être envoyée. Pour cela, le HAL dispose du
refreshRequired
pour indiquer qu'une image d'actualisation est nécessaire.refreshTimeNanos
pour indiquer la première vsync où un frame d'actualisation est disponible doit être envoyé après.- onVsyncPeriodTimingChanged [rappel]
- Nouveau rappel qui peut être appelé par le HAL pour indiquer à la plate-forme que certains du paramètre de chronologie modifié et 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
- La règle
DisplayManager
définit la règle générale autour de la fréquence d'actualisation. Il définit une configuration d'affichage par défaut, identique à celle la configuration HAL de Composer. De plus, il définit une plage de valeurs minimale et maximale des valeurs pourSurfaceFlinger
à choisir comme actualisation taux de conversion. - SurfaceFlinger
- Détermine la fréquence d'actualisation en définissant une configuration qui se trouve dans la même configuration comme configuration par défaut, avec une fréquence d'actualisation comprise entre la plage d'adresses IP.
Le Gestionnaire d'affichage procède comme suit pour déterminer règlement:
- Il trouve 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ées pendant l'exécution pour refléter les paramètres actuels de l'appareil (par exemple, dans un 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 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 0. Il n'y a donc pas de minimum par défaut. - ID de mode demandé par l'application: les applications peuvent définir
WindowManager.LayoutParams.preferredDisplayModeId
. afin de refléter la 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 le taux de rafraîchissement minimal et maximal pour qu'il corresponde au taux de rafraîchissement 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, ce qui est indiqué par
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 la fréquence d'actualisation en fonction des couches actives (c'est-à-dire des couches qui
mises à jour de trame). Si le propriétaire de la couche définit un frame rate, 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
choisira la fréquence 120 Hz, si elle est disponible. Si cette fréquence d'actualisation n'est pas disponible
SurfaceFlinger essaie de choisir la fréquence d'actualisation
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 gère une heuristique qui détermine les FPS moyens que la couche publie en examinant le code temporel de présentation associé au tampon.ro.surface_flinger.set_touch_timer_ms
: if > 0, valeur par défaut la fréquence d'actualisation sera utilisée lorsqu'un utilisateur touche l'écran pour la le délai avant expiration. Cette heuristique est faite pour être prêt avec la fréquence d'actualisation par défaut pour des animations.ro.surface_flinger.set_idle_timer_ms
: if > 0, fréquence d'actualisation min sera utilisé en l'absence de mise à jour de l'écran pendant le délai d'inactivité configuré.ro.surface_flinger.set_display_power_timer_ms
: if > 0, le la fréquence d'actualisation par défaut est utilisée lors de l'allumage de l'écran en dehors du mode Always-on) pour le délai avant expiration configuré.
API Frame Rate
L'API de fréquence d'images permet aux applications d'indiquer à la plate-forme Android à la fréquence d'images et 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 pour afficher ou 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.