Estimulación del cuadro

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 renderizado con el subsistema de visualización de un sistema operativo y el hardware de visualización subyacente. El subsistema de visualización de Android fue diseñado para evitar ciertos artefactos visuales, como el desgarro. El subsistema de visualización evita el corte 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 se deben a que el bucle de renderizado de un juego se ejecuta a una velocidad diferente a la que admite el hardware de visualización nativo. Los problemas surgen cuando el bucle de renderizado 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 fotograma, como 33 ms, 16 ms, 49 ms, etc. Las escenas demasiado complejas agravan aún más este problema porque provocan la pérdida de fotogramas.

La biblioteca Frame Pacing realiza estas tareas:

  • Compensa el tartamudeo debido a cuadros de juego cortos.
  • Utiliza barreras de sincronización para fotogramas largos que provocan tartamudeo y latencia.
    • Inyecta esperas en la aplicación. Esto permite 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 y VkFence ).
  • 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 depurar y crear perfiles utilizando estadísticas de fotogramas .

Para aprender cómo configurar la biblioteca para que funcione en diferentes modos según lo que necesite, consulte Modos de funcionamiento admitidos .

Para implementar el uso del renderizador OpenGL o el renderizador Vulkan, consulte

Para obtener más información, consulte Lograr un ritmo de fotograma adecuado .

Intervención de limitación de fotogramas por segundo

La intervención de limitación de fotogramas por segundo (FPS) permite que los juegos avancen a un FPS apropiado utilizando solo cambios en 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:

Servicio GameManager

El componente GameManagerService mantiene toda la información por usuario y por juego sobre el modo de juego y la intervención en el 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 <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 además puede traducirse en un par <UID, Frame Rate> para enviarlo a SurfaceFlinger.

SuperficieFlinger

El componente SurfaceFlinger ya admite la limitación de 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 una vsync, SurfaceFlinger verifica la validez de la vsync para la aplicación limitada verificando si la marca de tiempo de vsync está en fase con la velocidad de fotogramas de la aplicación. Si la velocidad de fotogramas no está en fase con vsync, entonces 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:

Interacción entre GameManagerService y SurfaceFlinger

Figura 1. Interacción entre GameServiceManager y SurfaceFlinger

SurfaceFinger mantiene una asignación de par <UID, Frame Rate> para establecer una nueva prioridad de limitación de velocidad de fotogramas. El UID es único entre usuarios y juegos, de modo que cada usuario en un solo dispositivo puede tener diferentes configuraciones de velocidad de fotogramas en el mismo juego. Para limitar 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. SurfaceFlinger maneja el cambio de FPS bloqueando los buffers en consecuencia.

Para comprender más sobre la limitación de FPS, consulte Introducción a la limitación de FPS .