Fréquence d'actualisation multiple

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é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 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 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 affichage commencera à s'actualiser à la nouvelle période 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'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 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 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 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 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..

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.