Gestion des performances

Gérer la puissance et les performances des appareils Android peut vous aider à vous assurer que les applications s'exécutent de manière cohérente et fluide sur un large éventail de matériel. Sous Android 7.0 et versions ultérieures, les OEM peuvent implémenter la prise en charge des indices de performances durables qui permettent aux applications de maintenir des performances d'appareil cohérentes et de spécifier un cœur exclusif pour améliorer les performances des applications de premier plan gourmandes en CPU.

Performances soutenues

Pour les applications de longue durée (jeux, appareil photo, RenderScript, traitement audio), les performances peuvent varier considérablement lorsque les limites de température de l'appareil sont atteintes et que les moteurs du système sur puce (SoC) sont limités. Les développeurs d'applications qui créent des applications hautes performances et de longue durée sont limités, car les fonctionnalités de la plate-forme sous-jacente sont une cible mobile lorsque l'appareil commence à chauffer.

Pour remédier à ces limites, Android 7.0 a introduit la prise en charge des performances soutenues, ce qui permet aux OEM de fournir des indications sur les capacités de performances de l'appareil pour les applications de longue durée. Les développeurs d'applications peuvent utiliser ces indices pour optimiser les applications afin d'obtenir un niveau de performances de l'appareil prévisible et cohérent sur de longues périodes.

Architecture

Une application Android peut demander à la plate-forme de passer en mode de performances soutenues, dans lequel l'appareil Android peut maintenir un niveau de performances cohérent pendant de longues périodes.

Figure 1 : Architecture du mode Performances soutenues.

Implémentation

Pour assurer des performances durables sous Android 7.0 et versions ultérieures, les OEM doivent:

  • Apportez des modifications spécifiques à l'appareil au HAL d'alimentation pour verrouiller les fréquences maximales du processeur/GPU ou effectuer d'autres optimisations pour éviter le throttling thermique.
  • Implémentez le nouvel indice POWER_HINT_SUSTAINED_PERFORMANCE dans le HAL d'alimentation.
  • Déclarez la prise en charge en renvoyant "TRUE" via l'API isSustainedPerformanceModeSupported().
  • Implémentez Window.setSustainedPerformanceMode.

Dans l'implémentation de référence Nexus, l'indice d'alimentation limite les fréquences maximales du processeur et du GPU aux niveaux les plus élevés possibles. N'oubliez pas que baisser la barre MAX dans la fréquence du CPU/GPU réduit la fréquence d'images, mais ce taux inférieur est préférable dans ce mode en raison de sa durabilité. Par exemple, un appareil utilisant des horloges maximales normales peut être capable de générer des images à 60 FPS pendant quelques minutes, mais une fois qu'il s'est réchauffé, il peut être limité à 30 FPS au bout de 30 minutes. En mode durable, l'appareil peut, par exemple, afficher une fréquence d'images constante de 45 FPS pendant les 30 minutes. L'objectif est d'obtenir une fréquence d'images lorsque vous utilisez le mode qui est aussi élevée (ou plus élevée) que la fréquence d'images lorsque vous n'utilisez pas le mode, et qui est cohérente au fil du temps afin que les développeurs n'aient pas à courir après une cible mobile.

Nous vous recommandons vivement d'implémenter le mode durable afin que l'appareil atteigne les performances soutenues les plus élevées possibles, et non seulement les valeurs minimales requises pour réussir le test (par exemple, choisissez les limites de fréquence MAX les plus élevées possibles qui n'entraînent pas de limitation thermique de l'appareil au fil du temps).

Remarque: Il n'est pas nécessaire de limiter les fréquences d'horloge MAX pour implémenter le mode soutenu.

Validation

Les OEM peuvent utiliser un test CTS (Android 7.0 et versions ultérieures) pour vérifier leur implémentation de l'API de performances soutenues. Le test exécute une charge de travail pendant environ 30 minutes et compare les performances avec et sans le mode durable activé:

  • Lorsque le mode soutenu est activé, la fréquence d'images doit rester relativement constante (le test mesure le pourcentage de variation de la fréquence d'images au fil du temps et nécessite une variation de moins de 5 %).
  • Lorsque le mode soutenu est activé, la fréquence d'images ne doit pas être inférieure à celle atteinte au bout de 30 minutes lorsque le mode est désactivé.

En outre, vous pouvez tester manuellement votre implémentation avec plusieurs charges de travail intensives pour le processeur et le GPU afin de vous assurer que l'appareil ne subit pas de limitation thermique après 30 minutes d'utilisation. Lors des tests internes, nous avons utilisé des exemples de charges de travail, y compris des jeux et des applications de benchmark (par exemple, gfxbench).

Cœurs exclusifs

Pour les charges de travail gourmandes en CPU et sensibles au temps, être préempté par un autre thread peut faire la différence entre respecter les délais de frame et non. Pour les applications qui présentent des exigences strictes en termes de latence et de fréquence d'images (telles que les applications audio ou de réalité virtuelle), disposer d'un cœur de processeur exclusif peut garantir un niveau de performances acceptable.

Les appareils équipés d'Android 7.0 ou version ultérieure peuvent désormais réserver un cœur explicitement pour l'application de premier plan la plus importante, ce qui améliore les performances de toutes les applications de premier plan et permet aux applications avec des charges de travail à forte intensité de mieux contrôler la répartition de leur travail sur les cœurs de processeur.

Pour prendre en charge un cœur exclusif sur un appareil:

  • Activez cpusets et configurez un cpuset qui ne contient que l'application de premier plan supérieure.
  • Assurez-vous qu'un cœur (c'est le cœur exclusif) est réservé aux threads de ce cpuset.
  • Implémentez l'API getExclusiveCores pour renvoyer le numéro de cœur du cœur exclusif.

Pour déterminer les processus programmés sur quels cœurs, utilisez systrace lorsque vous exécutez une charge de travail et vérifiez qu'aucun thread d'espace utilisateur d'applications autres que l'application de premier plan n'est programmé sur le cœur exclusif.

Pour afficher une implémentation de référence pour le Nexus 6P, consultez android//device/huawei/angler/power/power.c.