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.
- Ajoute des codes temporels de présentation afin que les images soient présentées à l'heure, et non plus tôt.
- Utilise les extensions de code temporel de présentation
EGL_ANDROID_presentation_time
etVK_GOOGLE_display_timing
.
- 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
etVkFence
).
- 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
- Intégrer le frame pacing Android dans votre moteur de rendu OpenGL
- Intégrer Android Frame Pacing dans votre moteur de rendu Vulkan
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:
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.