Frame Pacing

La biblioteca de Android Frame Pacing, también conocida como Swappy, es parte del SDK de juegos de Android. Ayuda a que los juegos de OpenGL y Vulkan logren una renderización fluida. y el 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 de un SO y el hardware de visualización subyacente. La pantalla de Android se diseñó para evitar ciertos artefactos visuales, como el seccionamiento. El El subsistema de visualización evita el seccionamiento de la siguiente manera:

  • Almacenar en búfer los fotogramas anteriores de forma interna
  • Cómo detectar envíos de fotogramas tardíos
  • Mostrar el fotograma actual cuando se detecte uno tardío

Los tiempos de visualización de los fotogramas no son uniformes debido a que el bucle de renderización de un juego se ejecuta en con una tarifa diferente de la que admite el hardware de pantalla nativo. Surgen problemas 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 inconsistentes. Por ejemplo, cuando un juego que se ejecuta en Se intenta procesar la resolución de 30 FPS en un dispositivo que admite esa velocidad de forma nativa, bucle de renderización del juego hace que un fotograma repetido permanezca en la pantalla durante un 16 ms adicionales. Este tipo de desconexión crea inconsistencias sustanciales en la latencia de fotogramas como 33 ms, 16 ms, 49 ms, etcétera. Las escenas demasiado complejas agravan aún más este problema porque hacen que se pierdan fotogramas.

La biblioteca de Frame Pacing realiza las siguientes tareas:

  • Compensa el salto debido a fotogramas de juego cortos.
  • Usa vallas de sincronización para fotogramas largos que producen saltos y latencia.
    • Inyecta esperas en la app. Esto permite que la canalización de pantalla detecte en lugar de permitir que aumente la contrapresión.
    • Usa vallas 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 frame estadísticas.

Aprende a configurar la biblioteca para que funcione en diferentes modos según según lo que necesites, consulta Modos de operación compatibles.

Para implementar con el procesador OpenGL o Vulkan, consulta

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

Intervención de limitación de fotogramas por segundo

La intervención de regulación de fotogramas por segundo (FPS) permite que los juegos tengan un ritmo adecuado en FPS usando solo el lado de la plataforma, cambios y sin requerir ninguna acción sobre la configuración de una parte del proyecto.

La implementación de la intervención de limitación de FPS usa los siguientes componentes:

Servicio de administrador de juegos

El El componente GameManagerService mantiene todas información por juego del modo de juego y la intervención del juego. La información de FPS se almacena en el GameManagerService con otra información de intervención, como el factor de reducción de escala 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. R UID es único para cada PACKAGE_NAME y usuario, y se puede traducir en un par <UID, Frame Rate> para enviar a SurfaceFlinger.

SurfaceFlinger;

El componente SurfaceFlinger ya es compatible Limitar 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 el límite limitado. aplicación verificando si la marca de tiempo de vsync está en fase con la velocidad de fotogramas de y mantener la integridad de su aplicación. Si la velocidad de fotogramas no está en fase con vsync, SurfaceFlinger contiene la hasta que la velocidad de fotogramas y 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 par <UID, Frame Rate> para establecer un nuevo elemento. prioridad de la limitación de la velocidad de fotogramas. El elemento UID es único entre los usuarios y los juegos, de modo que cada uno de un usuario en un solo dispositivo puede tener distintas configuraciones de velocidad de fotogramas en el mismo juego. Para limitar la 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 controla el cambio de FPS bloqueando 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