La biblioteca Android Frame Pacing, también conocida como Swappy, es parte del SDK de juegos de Android . Ayuda a los juegos OpenGL y Vulkan a lograr una representación fluida y un ritmo de fotogramas correcto en Android.
El ritmo de fotogramas es la sincronización de la lógica de un juego y el bucle de representación con el subsistema de visualización de un sistema operativo y el hardware de visualización subyacente. El subsistema de visualización de Android se diseñó para evitar ciertos artefactos visuales, como el desgarro. El subsistema de visualización evita el desgarro haciendo lo siguiente:
- Almacenamiento en búfer de fotogramas pasados internamente
- Detección de envíos tardíos de fotogramas
- Continuar mostrando el cuadro actual cuando se detecta un cuadro tardío
Los tiempos de visualización de fotogramas inconsistentes son causados por el bucle de renderizado de un juego que se ejecuta a una velocidad diferente a la que admite el hardware de visualización nativo. Los problemas surgen cuando el bucle de procesamiento de un juego se ejecuta demasiado lento para el hardware de visualización subyacente, lo que genera tiempos de visualización inconsistentes. Por ejemplo, cuando un juego que se ejecuta a 30 fps intenta renderizarse en un dispositivo que admite de forma nativa 60 fps, el bucle de renderizado del juego hace que un fotograma repetido permanezca en la pantalla durante 16 ms adicionales. Este tipo de desconexión crea inconsistencias sustanciales en los tiempos de trama, como 33 ms, 16 ms, 49 ms, etc. Las escenas demasiado complejas agravan aún más este problema porque provocan que se pierdan fotogramas.
La biblioteca Frame Pacing realiza estas tareas:
- Compensa la tartamudez debido a los marcos de juego cortos.
- Agrega marcas de tiempo de presentación para que los marcos se presenten a tiempo, no antes.
- Utiliza las extensiones de marca de tiempo de presentación
EGL_ANDROID_presentation_time
yVK_GOOGLE_display_timing
.
- Utiliza vallas de sincronización para fotogramas largos que provocan tartamudeos y latencia.
- Inyecta esperas en la aplicación. Estos permiten que la tubería de visualización se ponga al día, en lugar de permitir que se acumule contrapresión.
- Utiliza vallas de sincronización (
EGL_KHR_fence_sync
yVkFence
).
- Elige una frecuencia de actualización para brindar flexibilidad y una presentación fluida, si su dispositivo admite múltiples frecuencias de actualización.
- Proporciona estadísticas para la depuración y creación de perfiles utilizando estadísticas de marcos .
Para obtener información sobre cómo configurar la biblioteca para que funcione en diferentes modos según sus necesidades, consulte Modos de funcionamiento admitidos .
Para implementar usando el renderizador OpenGL o el renderizador Vulkan, consulte
- Integre Android Frame Pacing en su renderizador OpenGL
- Integre Android Frame Pacing en su renderizador Vulkan
Para obtener más información, consulte Lograr un ritmo de fotogramas adecuado .
Intervención de limitación de fotogramas por segundo (FPS)
FPS Throttling Intervention permite que los juegos se desarrollen a un FPS apropiado utilizando solo cambios en el lado de la plataforma y sin requerir ninguna acción por parte de los desarrolladores.
La implementación de la intervención de limitación de FPS utiliza los siguientes componentes:
GameManagerService
El componente GameManagerService mantiene toda la información por usuario y por juego del modo de juego y la intervención del juego. La información de FPS se almacena en GameManagerService con otra información de intervención, como el factor de reducción de resolución, en una asignación de <PACKAGE_NAME, Interventions>
para cada perfil de usuario. Se accede a la información de FPS cuando se cambia el modo de juego o se actualiza la intervención. Un UID
es único para cada PACKAGE_NAME
y usuario, y se puede traducir a un par <UID, Frame Rate>
para enviar a SurfaceFlinger.
Deflector de superficie
El componente SurfaceFlinger ya admite la aceleración de los FPS de una aplicación siempre que la velocidad de fotogramas sea un divisor de la frecuencia de actualización de la pantalla. En el caso de un vsync, SurfaceFlinger verifica la validez del vsync para la aplicación limitada al verificar si la marca de tiempo del vsync está en fase con la velocidad de fotogramas de la aplicación. Si la velocidad de fotogramas no está en fase con vsync, SurfaceFlinger retiene el fotograma hasta que la velocidad de fotogramas y vsync estén en fase.
La siguiente figura describe la interacción entre GameManagerService y SurfaceFlinger:

Figura 1. Interacción entre GameServiceManager y SurfaceFlinger
SurfaceFinger mantiene una asignación de pares de <UID, Frame Rate>
para establecer una nueva prioridad de limitación de velocidad de fotogramas. El UID
es único entre usuarios y juegos, por lo que cada usuario en un solo dispositivo puede tener diferentes configuraciones de velocidad de fotogramas en el mismo juego. Para acelerar la velocidad de fotogramas de un juego, GameServiceManager llama a SurfaceFlinger para anular la velocidad de fotogramas de un UID. Con este mecanismo, SurfaceFlinger actualiza el mapeo cada vez que se cambia el modo de juego o se actualiza la intervención. El SurfaceFlinger maneja el cambio de FPS bloqueando los búferes en consecuencia.
Para obtener más información sobre la limitación de FPS, consulte Introducción a la limitación de FPS.