Frame Pacing

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

Le frame pacing est 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 d'affichage sous-jacent. Écran Android a été conçu pour éviter certains artefacts visuels, tels que la déchirure. La le sous-système d'affichage évite de se déchirer en procédant comme suit:

  • Mettre en mémoire tampon les images précédentes en interne
  • Détecter les envois d'images tardifs
  • Continuer à afficher l'image actuelle lorsqu'une image tardive est détectée

Des temps d'affichage incohérents des frames s'expliquent par l'exécution de la boucle de rendu d'un jeu un débit différent de celui compatible avec 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, entraînant des durées d'affichage incohérentes. Par exemple, lorsqu'un jeu Tentatives d'affichage de 30 images par seconde sur un appareil compatible de manière native avec la fréquence d'images de 60 images par seconde la boucle de rendu du jeu fait en sorte qu'une image répétée reste affichée à l'écran pendant une 16 ms supplémentaires. Ce type de déconnexion crée des incohérences importantes dans les temps de rendu telles que 33 ms, 16 ms, 49 ms, etc. Scènes trop complexes s'aggravant ce problème car ils provoquent des frames manqués.

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 longues images qui provoquent du stuttering et de la latence.
    • L'injection attend dans l'application. Elles permettent au pipeline d'affichage au lieu de laisser monter la contre-pression.
    • Utilise des barrières de synchronisation (EGL_KHR_fence_sync et VkFence).
  • choisit une fréquence d'actualisation pour plus de flexibilité et une présentation fluide ; si votre appareil est compatible avec plusieurs fréquences d'actualisation.
  • Fournit des statistiques de débogage et de profilage à l'aide du frame statistiques.

Pour apprendre à configurer la bibliothèque pour qu'elle fonctionne dans différents modes en fonction selon 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 la section Atteindre un frame pacing approprié.

Intervention de limitation du nombre d'images par seconde

L'intervention de limitation du nombre d'images par seconde (FPS) permet aux jeux de suivre le rythme à un FPS approprié en utilisant uniquement le côté de la plate-forme sans qu'aucune action ne soit requise de la part des développeurs .

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

Service GameManager

Le GameManagerService gère tous les paramètres par utilisateur et des informations sur le mode et l'intervention lors du jeu, pour chaque jeu. Les informations du 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 le FPS sont accessibles lorsque le mode de jeu est modifié ou que l'intervention est mise à jour. A UID est propre à chaque PACKAGE_NAME et utilisateur, et peut être traduit dans une paire <UID, Frame Rate> pour l'envoyer au SurfaceFlinger.

SurfaceFlinger

Le composant SurfaceFlinger accepte déjà une limitation du nombre d'images par seconde d'une application, à condition que la fréquence d'images soit un diviseur par rapport à la fréquence d'actualisation de l'affichage. Dans le cas d'une vsync, SurfaceFlinger vérifie la validité de vsync pour détecter les limitations en vérifiant si l'horodatage vsync est en phase avec la fréquence d'images application. Si la fréquence d'images n'est pas en phase avec vsync, SurfaceFlinger contient 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 GameManagerService et SurfaceFlinger

Figure 1 : Interaction entre GameServiceManager et SurfaceFlinger

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

Pour en savoir plus sur la limitation du FPS, consultez <ph type="x-smartling-placeholder"></ph> Introduction à la limitation du FPS.