Rythme d'images

La bibliothèque Android Frame Pacing, également connue sous le nom de Swappy, fait partie du SDK de jeu Android . Il aide les jeux OpenGL et Vulkan à obtenir un rendu fluide et un rythme d'image correct sur Android.

La stimulation des images est la synchronisation de la logique d'un jeu et de la boucle de rendu avec le sous-système d'affichage d'un système d'exploitation et le matériel d'affichage sous-jacent. Le sous-système d'affichage Android a été conçu pour éviter certains artefacts visuels, tels que les déchirures. Le sous-système d'affichage évite le déchirement en procédant comme suit :

  • Mise en mémoire tampon des images passées en interne
  • Détection des soumissions de trames tardives
  • Continuer à afficher l'image actuelle lorsqu'une image en retard est détectée

Les temps d'affichage des images incohérents sont causés par le fait que la boucle de rendu d'un jeu s'exécute à une vitesse différente de celle prise en charge par le matériel d'affichage natif. Des problèmes surviennent lorsque la boucle de rendu d'un jeu s'exécute trop lentement pour le matériel d'affichage sous-jacent, ce qui entraîne des temps d'affichage incohérents. Par exemple, lorsqu'un jeu fonctionnant à 30 ips tente d'effectuer un rendu sur un appareil prenant en charge nativement 60 ips, la boucle de rendu du jeu fait qu'une image répétée reste à l'écran pendant 16 ms supplémentaires. Ce type de déconnexion crée des incohérences substantielles dans les temps de trame, telles que 33 ms, 16 ms, 49 ms, etc. Les scènes trop complexes aggravent encore ce problème car elles entraînent des images manquées.

La bibliothèque Frame Pacing effectue les tâches suivantes :

  • Compense le bégaiement dû aux images de jeu courtes.
  • Utilise des barrières de synchronisation pour les images longues qui entraînent des bégaiements et une latence.
    • Injecte les attentes dans l'application. Ceux-ci permettent au pipeline d’affichage de rattraper son retard, plutôt que de permettre à la contre-pression de s’accumuler.
    • Utilise des clôtures de synchronisation ( EGL_KHR_fence_sync et VkFence ).
  • Choisit un taux de rafraîchissement pour offrir une flexibilité et une présentation fluide, si votre appareil prend en charge plusieurs taux de rafraîchissement.
  • Fournit des statistiques pour le débogage et le profilage à l’aide de frame stats .

Pour savoir comment configurer la bibliothèque pour qu'elle fonctionne dans différents modes en fonction de vos besoins, consultez Modes de fonctionnement pris en charge .

Pour implémenter à l'aide du moteur de rendu OpenGL ou du moteur de rendu Vulkan, voir

Pour en savoir plus, consultez Obtenir une stimulation d'image appropriée .

Intervention de limitation d'images par seconde

L'intervention de limitation des images par seconde (FPS) permet aux jeux de fonctionner à un FPS approprié en utilisant uniquement des changements côté plate-forme et sans nécessiter aucune action de la part des développeurs.

La mise en œuvre de l’intervention de limitation des FPS utilise les composants suivants :

ServiceGameManager

Le composant GameManagerService conserve toutes les informations par utilisateur et par jeu sur le mode de jeu et l'intervention dans le jeu. Les informations FPS sont stockées dans GameManagerService avec d'autres informations d'intervention, telles que le facteur de réduction de résolution, dans un mappage <PACKAGE_NAME, Interventions> pour chaque profil utilisateur. Les informations FPS sont accessibles lorsque le mode de jeu est modifié ou que l'intervention est mise à jour. Un UID est unique à chaque PACKAGE_NAME et utilisateur, et peut en outre être traduit en une paire <UID, Frame Rate> à envoyer au SurfaceFlinger.

SurfaceFlinger

Le composant SurfaceFlinger prend déjà en charge la limitation du FPS d'une application tant que la fréquence d'images est un diviseur de la fréquence de rafraîchissement de l'affichage. En cas de vsync, SurfaceFlinger vérifie la validité du vsync pour l'application limitée en vérifiant si l'horodatage du vsync est en phase avec la fréquence d'images de l'application. Si la fréquence d'images n'est pas en phase avec le vsync, alors le SurfaceFlinger maintient la trame jusqu'à ce que la fréquence d'images et le vsync soient en phase.

La figure suivante décrit l'interaction entre GameManagerService et SurfaceFlinger :

Interaction entre GameManagerService et SurfaceFlinger

Figure 1. Interaction entre GameServiceManager et SurfaceFlinger

Le SurfaceFinger maintient un mappage de paire <UID, Frame Rate> pour définir une nouvelle priorité de limitation de fréquence d'images. L' UID est unique entre les utilisateurs et les jeux, de sorte que chaque utilisateur d'un même appareil peut avoir différents paramètres de fréquence d'images sur le même jeu. Pour limiter la fréquence d'images d'un jeu, GameServiceManager appelle SurfaceFlinger pour remplacer la fréquence d'images d'un UID. Avec ce mécanisme, le SurfaceFlinger met à jour la cartographie à chaque fois que le mode de jeu est modifié ou que l'intervention est mise à jour. Le SurfaceFlinger gère le changement de FPS en verrouillant les tampons en conséquence.

Pour en savoir plus sur la limitation des FPS, consultez l'introduction à la limitation des FPS .