Fréquence d'actualisation multiple

Android 11 est compatible avec les appareils dotés de 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. Les configurations d'un même groupe permettent de passer facilement de l'une à l'autre dans la plupart des cas. La plate-forme utilise le groupe de configuration pour différencier les configurations pouvant être commutées afin de modifier la fréquence d'actualisation et non d'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

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 autre mode. Passer 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.

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 le taux de rafraîchissement et le taux de rafraîchissement actuel, car la plate-forme doit décider quand commencer le frame suivant.
setActiveConfigWithConstraints
La méthode setActiveConfigWithConstraints est une nouvelle extension de la méthode setActiveConfig existante et fournit plus d'informations sur la modification de configuration. Les contraintes sont fournies dans les paramètres vsyncPeriodChangeConstraints et contiennent les paramètres suivants.
    desiredTimeNanos
    Heure dans CLOCK_MONOTONIC après laquelle la période de vsync peut changer (c'est-à-dire que la période de vsync 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 tampons dans la file d'attente à présenter. La plate-forme définit cette durée en conséquence pour tenir compte de ces tampons et s'assurer que la transition de la fréquence d'actualisation sera aussi fluide que possible.
    seamlessRequired
    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 sur true, l'implémentation doit renvoyer SEAMLESS_NOT_POSSIBLE comme code de retour et appeler le nouveau rappel onSeamlessPossible 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ètres newVsyncAppliedTimeNanos doivent être définis sur l'heure dans CLOCK_MONOTONIC à laquelle le nouvel écran commencera à s'actualiser à la nouvelle période de vsync. En plus de desiredTimeNanos, 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'un frame de rafraîchissement avant que la fréquence de rafraîchissement puisse être envoyée. Pour cela, le HAL dispose du paramètre refreshRequired pour indiquer qu'un frame d'actualisation est nécessaire et de refreshTimeNanos 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 que SurfaceFlinger peut choisir comme fréquence d'actualisation.
SurfaceFlinger
Détermine la fréquence d'actualisation en définissant une configuration qui appartient au même groupe de configuration que la configuration par défaut et avec une fréquence d'actualisation comprise dans la plage min/max.

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 configuration R.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 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 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..

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 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 calques actifs définissent leur fréquence d'images sur 24 et 60, SurfaceFlinger sélectionnera 120 Hz s'il 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 gère une heuristique qui permet de trouver le nombre moyen d'images par seconde que la couche publie en examinant le code temporel de présentation associé au tampon.
  • ro.surface_flinger.set_touch_timer_ms: si la valeur est supérieure à 0, la fréquence d'actualisation par défaut est utilisée lorsqu'un utilisateur appuie sur l'écran pendant le délai avant expiration 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 mise à jour de l'écran pendant 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 souhaitée. 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. Elle active ou désactive une superposition sur 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.