Frame Pacing

La biblioteca de Android Frame Pacing, también conocida como Swappy, es parte del SDK de juegos de Android. Permite que los juegos de OpenGL y Vulkan logren una renderización eficaz y un ritmo de fotogramas correcto en Android.

El ritmo de fotogramas es la sincronización de la lógica y el bucle de renderización de un juego con el subsistema de visualización del SO y el hardware de visualización subyacente. El subsistema de visualización de Android se diseñó para evitar ciertos artefactos visuales, como el seccionamiento. El subsistema de visualización evita el tearing de la siguiente manera:

  • Almacena en búfer los fotogramas anteriores de forma interna
  • Detecta envíos tardíos de fotogramas
  • Seguir mostrando el fotograma actual cuando se detecta un fotograma tardío

La latencia de fotogramas errática se debe a que el bucle de procesamiento de un juego se ejecuta a una frecuencia diferente de 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 incoherentes. Por ejemplo, cuando un juego que se ejecuta a 30 FPS intenta renderizarse en un dispositivo que admite 60 FPS de forma nativa, el bucle de renderización 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 fotogramas, como 33 ms, 16 ms y 49 ms. Las escenas demasiado complejas complican aún más este problema, ya que provocan la pérdida de fotogramas.

La biblioteca de Frame Pacing realiza las siguientes tareas:

  • Compensa los saltos debido a los fotogramas de juego cortos.
  • Usa barreras de sincronización para los fotogramas largos que producen saltos y latencia.
    • Inserta esperas en la app, lo que permite que se actualice la canalización de pantalla, en lugar de permitir la generación de contrapresión.
    • Usa barreras de sincronización (EGL_KHR_fence_sync y VkFence).
  • Elige una frecuencia de actualización para brindar flexibilidad y una presentación fluida si tu dispositivo admite varias frecuencias de actualización.
  • Proporciona estadísticas para la depuración y la generación de perfiles con estadísticas de fotogramas.

Para obtener información sobre cómo configurar la biblioteca para que funcione en diferentes modos según tus necesidades, consulta Modos de funcionamiento admitidos.

Para implementar el renderizador de OpenGL o el renderizador de Vulkan, consulta lo siguiente:

Para obtener más información, consulta la biblioteca de Frame Pacing.

Intervención de regulación de fotogramas por segundo

La intervención de regulación de fotogramas por segundo (FPS) permite que los juegos tengan un ritmo adecuado de FPS usando solo los cambios en la plataforma y sin que los desarrolladores necesiten realizar ninguna acción.

La implementación de la intervención de limitación de FPS usa 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 la 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 en un par <UID, Frame Rate> para enviarlo a SurfaceFlinger.

SurfaceFlinger

El componente SurfaceFlinger ya admite la limitación del FPS de una aplicación, siempre y cuando 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. Para ello, verifica si la marca de tiempo de la VSync está en fase con la velocidad de fotogramas de la aplicación. Si la velocidad de fotogramas no está en fase con la VSync, SurfaceFlinger mantiene el fotograma hasta que la velocidad de fotogramas y la VSync estén en fase.

En la siguiente figura, se 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 pares <UID, Frame Rate> para establecer una nueva prioridad de limitación de velocidad de fotogramas. El UID es único entre los usuarios y los juegos, de modo que cada usuario en un solo dispositivo puede tener diferentes parámetros de configuración de la 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 la asignación cada vez que se cambia el modo de juego o se actualiza la intervención. SurfaceFlinger controla el cambio de FPS al bloquear los búferes según corresponda.

Para obtener más información sobre la limitación de FPS, consulta Limitación de FPS.