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 fluida 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 seccionamientos. El subsistema de visualización evita la seccionamiento de la siguiente manera:

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

Los tiempos de visualización de fotogramas incoherentes se deben a que el bucle de renderización de un juego se ejecuta a una velocidad diferente de la que admite el hardware de visualización nativo. Los problemas surgen cuando el bucle de renderización 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, 49 ms, etcétera. 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 fotogramas de juego cortos.
  • Usa cercas de sincronización para fotogramas largos que generan saltos y latencia.
    • Inserta esperas en la app. Estas permiten que la canalización de pantalla se actualice, en lugar de permitir que se acumule la contrapresión.
    • Usa cercas de sincronización (EGL_KHR_fence_sync y VkFence).
  • Elige una frecuencia de actualización para proporcionar 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 lo que necesites, consulta Modos de operación compatibles.

Para implementar el renderizador de OpenGL o Vulkan, consulta

Para obtener más información, consulta Cómo lograr un ritmo de fotogramas adecuado.

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 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 se puede traducir a un par <UID, Frame Rate> para enviarlo a SurfaceFlinger.

SurfaceFlinger

El componente SurfaceFlinger ya admite la limitación de los 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 un vsync, SurfaceFlinger verifica la validez del vsync para la aplicación regulada 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 la vsync, SurfaceFlinger retiene el fotograma hasta que la velocidad de fotogramas y la vsync estén en fase.

En la siguiente imagen, 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 par <UID, Frame Rate> para establecer una nueva prioridad de limitación de la 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 reducir la frecuencia de fotogramas de un juego, GameServiceManager llama a SurfaceFlinger para anular la frecuencia 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 con la activación de los búferes según corresponda.

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