Frame Pacing

La bibliothèque Android Frame Pacing, également appelée Swappy, fait partie du SDK Android Game. Elle permet aux jeux OpenGL et Vulkan de bénéficier d'un rendu fluide et d'un frame pacing optimal sur Android.

Le frame pacing désigne la synchronisation de la logique et de la boucle de rendu d'un jeu avec le sous-système d'affichage d'un système d'exploitation et le matériel utilisé pour l'affichage. Le sous-système d'affichage Android a été conçu pour éviter certains artefacts visuels, tels que le tearing. Le sous-système d'affichage évite le déchirement en procédant comme suit:

  • Mise en mémoire tampon des images précédentes
  • Détecter les envois d'images tardifs
  • Poursuite de l'affichage du frame actuel lorsqu'un frame tardif est détecté

Les temps d'affichage des images irréguliers sont dus au fait que la boucle de rendu d'un jeu s'exécute à une fréquence différente de celle du 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 à 30 FPS tente de générer son rendu sur un appareil compatible nativement avec 60 FPS, la boucle de rendu du jeu entraîne le maintien d'une image répétée à l'écran pendant 16 ms supplémentaires. Ce type de déconnexion crée des incohérences importantes dans les délais d'affichage, par exemple 33 ms, 16 ms, 49 ms, etc. Les scènes trop complexes aggravent ce problème, car elles donnent lieu à des images manquées.

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

  • Compenser le stuttering dû aux images de jeu courtes
  • Utilise des barrières de synchronisation pour les images de jeu longues qui provoquent du stuttering et de la latence.
    • Injecte des temps d'attente dans l'application. Ils permettent au pipeline d'affichage de rattraper son retard plutôt que de laisser monter la pression.
    • Utilise des barrières de synchronisation (EGL_KHR_fence_sync et VkFence).
  • Choisit une fréquence d'actualisation pour offrir une flexibilité et une présentation fluide, si votre appareil est compatible avec plusieurs fréquences d'actualisation.
  • Fournit des statistiques pour le débogage et le profilage à l'aide des statistiques de frame.

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

Pour implémenter l'utilisation du moteur de rendu OpenGL ou Vulkan, consultez

Pour en savoir plus, consultez Obtenir un débit de trames approprié.

Intervention de limitation des images par seconde

L'intervention de limitation du nombre de frames par seconde (FPS) permet aux jeux de définir un nombre de FPS approprié en utilisant uniquement des modifications côté plate-forme et sans aucune action de la part des développeurs.

L'implémentation de l'intervention de limitation du FPS utilise les composants suivants:

GameManagerService

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

SurfaceFlinger

Le composant SurfaceFlinger prend déjà en charge la limitation des FPS d'une application tant que la fréquence d'images est un diviseur de la fréquence d'actualisation de l'écran. En cas de vsync, SurfaceFlinger vérifie la validité du vsync pour l'application limitée en vérifiant si le code temporel 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, SurfaceFlinger maintient l'image jusqu'à ce que la fréquence d'images et le vsync soient en phase.

L'image suivante décrit l'interaction entre GameManagerService et SurfaceFlinger:

Interaction entre GameManagerService et SurfaceFlinger

Figure 1 : Interaction entre GameServiceManager et SurfaceFlinger

SurfaceFinger conserve un mappage de paire <UID, Frame Rate> pour définir une nouvelle priorité de limitation de la fréquence d'images. UID est unique entre les utilisateurs et les jeux, de sorte que chaque utilisateur sur un même appareil puisse avoir des paramètres de fréquence d'images différents pour 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, SurfaceFlinger met à jour la mise en correspondance chaque fois que le mode de jeu est modifié ou que l'intervention est mise à jour. SurfaceFlinger gère le changement de FPS en verrouillant les tampons en conséquence.

Pour en savoir plus sur la limitation du FPS, consultez la section Présentation de la limitation du FPS.