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 correct 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 déchirement. 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 en interne
  • Détecter les envois d'images tardifs
  • Continue d'afficher l'image actuelle lorsqu'une image tardive est détectée

Les temps d'affichage des frames irréguliers sont dus à une boucle de rendu de jeu qui s'exécute à une fréquence 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 à 30 FPS tente de générer son rendu sur un appareil compatible nativement avec 60 FPS, 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écalage crée des incohérences importantes dans les durées des frames, comme 33 ms, 16 ms et 49 ms. 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 :

  • Compense le stuttering dû aux images de jeu courtes.
  • Utilise des barrières de synchronisation pour les longs frames qui entraînent du stuttering et de la latence.
    • Injecte des temps d'attente dans l'application. Cela permet au pipeline d'affichage de rattraper son retard plutôt que de faire monter la pression.
    • Utilise des barrières de synchronisation (EGL_KHR_fence_sync et VkFence).
  • Choisit une fréquence d'actualisation pour offrir de la 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 afin qu'elle fonctionne dans différents modes en fonction de vos besoins, consultez Modes de fonctionnement compatibles.

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

Pour en savoir plus, consultez la bibliothèque Frame Pacing.

Intervention de limitation des images par seconde

L'intervention de limitation du nombre de frames par seconde (FPS) permet aux jeux de s'exécuter à un FPS approprié en utilisant uniquement les modifications côté plate-forme, sans nécessiter d'action de la part des développeurs.

L'implémentation de l'intervention de limitation des FPS utilise les composants suivants.

GameManagerService

Le composant GameManagerService conserve toutes les informations par utilisateur et par jeu concernant le mode et l'intervention du jeu. Les informations sur les FPS sont stockées dans le 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 jeu est modifié ou que l'intervention est mise à jour. Un UID est unique à chaque PACKAGE_NAME et utilisateur, et peut être traduit en une paire <UID, Frame Rate> à envoyer à SurfaceFlinger.

SurfaceFlinger

Le composant SurfaceFlinger prend déjà en charge la limitation du nombre de 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 VSync, SurfaceFlinger conserve le frame jusqu'à ce que la fréquence d'images et VSync soient en phase.

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

Interaction entre le GameManagerService et SurfaceFlinger

Figure 1 : Interaction entre GameServiceManager et SurfaceFlinger.

SurfaceFinger conserve un mappage de paires <UID, Frame Rate> pour définir une nouvelle priorité de limitation de la fréquence d'images. La valeur UID est unique pour chaque utilisateur et chaque jeu. Ainsi, chaque utilisateur sur un même appareil peut 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, le GameServiceManager appelle SurfaceFlinger pour remplacer la fréquence d'images d'un UID. Avec ce mécanisme, SurfaceFlinger met à jour le mappage chaque fois que le mode 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 nombre d'images par seconde, consultez Limitation du nombre d'images par seconde.