Sesiones lentas (solo para juegos)

Una sesión de juego lenta es aquella en la que una parte significativa de los fotogramas (por ejemplo, más del 25%) no cumple con la latencia de fotogramas objetivo, como 50 ms por fotograma (equivalente a 20 FPS) o 34 ms por fotograma (equivalente a 30 FPS). Supervisar y optimizar el rendimiento de la velocidad de fotogramas es fundamental porque los fotogramas descartados o retrasados afectan directamente la fluidez y la capacidad de respuesta del juego para los jugadores.

En Android, las velocidades de fotogramas de las sesiones se miden con datos de SurfaceFlinger según el intervalo de tiempo entre los fotogramas dibujados en las superficies que posee el juego (incluidas las superficies de OpenGL, Vulkan y el kit de herramientas de IU de Android). Si tu app usa el kit de herramientas de la IU basado en View, en el que la parte visible para el usuario de la app se dibuja desde Canvas o la jerarquía de View, consulta Renderización lenta.

Cómo medir los FPS y detectar los fotogramas lentos

El comando dumpsys surfaceflinger timestats de Android proporciona el promedio de FPS y el histograma de sincronización de present to present para todas las capas que se renderizan. El tiempo de presentación a presentación de un fotograma es el intervalo entre el fotograma actual y el fotograma anterior que se dibujó. Estos son los pasos para usar el comando y recopilar los FPS de tu juego:

  1. Ejecuta el comando con las marcas enable y clear para comenzar a capturar información:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Cuando se haya jugado lo suficiente, vuelve a ejecutar el comando con la marca dump para volcar la información:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    La información volcados proporciona el histograma de fotogramas totales y de presentToPresent para todas las capas renderizadas por SurfaceFlinger. Para encontrar la sección de tu juego, filtra por layerName:

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

    La velocidad de fotogramas lenta de la sesión se podría calcular en función de la información de cada capa.

    Por ejemplo, el porcentaje de fotogramas lentos de 20 FPS = (suma de los valores de 54 ms a 1,000 ms) / totalFrames x 100

    totalFrames = 274
    ...
    presentToPresent histogram is as below:
    0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0
    13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0
    24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0
    66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0
    110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0
    150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0
    650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
    

    En el volcado, también se muestra el FPS promedio de cada capa:

    ...
    averageFPS = 30.179
    ...
    
  3. Después de recopilar toda la información, debes inhabilitar las estadísticas de tiempo con la marca disable:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Causas y soluciones de los fotogramas lentos

Hay muchos motivos por los que un fotograma puede presentarse o renderizarse durante más tiempo en la pantalla que el objetivo del desarrollador. El juego podría estar vinculado a la CPU o la GPU. O bien el dispositivo se sobrecalienta y activa un estado térmico limitado. O bien hay una discrepancia entre la velocidad de fotogramas del juego y la frecuencia de actualización de la pantalla del dispositivo.

Usa Android Frame Pacing (Swappy), Vulkan y ADPF para abordar estos problemas y mejorar el rendimiento de tu juego.

Qué es Swappy

La biblioteca de Frame Pacing de Android, también conocida como Swappy, forma parte de las bibliotecas de AGDK. Swappy ayuda a los juegos de OpenGL y Vulkan a lograr 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ñó a fin de evitar artefactos visuales (conocidos como seccionamientos) que pueden ocurrir cuando el hardware de visualización cambia de fotograma a mitad de una actualización. Para evitar estos artefactos, el subsistema de visualización hace lo siguiente:

  • Almacena en búfer los fotogramas anteriores de forma interna
  • Detecta envíos tardíos de fotogramas
  • Cuando se detectan fotogramas tardíos, repite la visualización de los anteriores

Descubre cómo Mir 2 usó Swappy para reducir su tasa de sesiones lentas del 40% al 10%.

Cómo usar Swappy en proyectos nativos

Consulta las siguientes guías para integrar la biblioteca de Android Frame Pacing en tu juego:

Cómo usar Swappy en el motor de juegos de Unity

Unity integró Android Frame Pacing en su motor. Para habilitar esta función en Unity 2019.2 o versiones posteriores, marca la casilla de verificación Optimized Frame Pacing en Project Settings > Player > Settings para Android > Resolution and Presentation:

Cuadro de diálogo de configuración del proyecto.
Figura 1: Habilita la optimización del ritmo de fotogramas en Unity Engine.

Como alternativa, habilita la opción Optimized Frame Pacing de forma programática en tu código de lógica para permitir que Unity distribuya los fotogramas de manera uniforme y así reducir la variación en la velocidad de fotogramas, lo que genera un juego más fluido.

Cómo usar Swappy en el motor de juegos de Unreal

Unreal 4.25 y las versiones posteriores integran la biblioteca de Android Frame Pacing, que forma parte del Android Game Development Kit. En el artículo Mobile Frame Pacing, se explica cómo habilitar la biblioteca de Android Frame Pacing y cómo controlar el ritmo de fotogramas desde el código C++.

¿Qué es Vulkan?

Vulkan es una API de gráficos 3D multiplataforma moderna que se diseñó para minimizar la abstracción entre el hardware de gráficos del dispositivo y tu juego. Vulkan es la principal API de gráficos de bajo nivel de Android que reemplaza a OpenGL ES. OpenGL ES aún es compatible con Android, pero ya no se encuentra en desarrollo activo de funciones.

Vulkan ofrece las siguientes ventajas en comparación con OpenGL ES:

  • Arquitectura más eficiente con menor sobrecarga de CPU en el controlador de gráficos
  • Nuevas estrategias de optimización para mejorar el rendimiento de la CPU
  • Nuevas funciones de gráficos que no están disponibles en OpenGL ES, como las APIs desvinculadas y el trazado de rayos

Cómo usar Vulkan en proyectos nativos de Android

El codelab Cómo empezar a usar Vulkan en Android te guía para configurar tu canalización de renderización de Vulkan y, luego, renderizar un triángulo texturizado y rotativo en la pantalla. Usa el codelab para aprender a renderizar los gráficos de tu juego.

Cómo usar Vulkan en el motor de juegos de Unity

Para habilitar la selección automática de dispositivos en Unity, sigue los pasos para configurar la API de Auto Graphics.

Cuadro de diálogo de configuración del proyecto.
Figura 2: Habilita la API de Auto Graphics de Unity.

Como alternativa, puedes habilitar Vulkan de forma manual si inhabilitas la API de Auto Graphics y le asignas la prioridad más alta en la lista de APIs de gráficos. Si usas Unity 2021.1 o una versión anterior, esta es la única manera de utilizar Vulkan.

Cuadro de diálogo de configuración del proyecto.
Figura 3: Elige Vulkan de forma manual como la API de gráficos principal en Unity.

Usa el complemento del motor de Unity VkQuality para proporcionar recomendaciones en el momento del inicio de la API de gráficos que tu juego debe usar en dispositivos específicos.

Cómo usar Vulkan en el motor de juegos Unreal

Para habilitar la API de gráficos de Vulkan, ve a Project Settings > Platforms > Android > Build y selecciona Support Vulkan. Cuando seleccionas Support Vulkan y Support OpenGL ES3.2, Unreal usa Vulkan de forma predeterminada. Si el dispositivo no es compatible con Vulkan, Unreal recurrirá a OpenGL ES 3.2.

Cuadro de diálogo de configuración del proyecto.
Figura 4: Habilita Vulkan en Unreal Engine.

Si usas funciones específicas de Vulkan que se sabe que no funcionan bien en ciertos dispositivos, puedes personalizar tu archivo BaseDeviceProfile.ini para excluir esos dispositivos. Consulta Cómo personalizar perfiles de dispositivos y la escalabilidad para Android para obtener más información sobre cómo personalizar BaseDeviceProfile.ini. Como los controladores de dispositivos nuevos pueden corregir dispositivos defectuosos conocidos anteriormente, mantén actualizado tu archivo BaseDeviceProfile.ini para obtener todas las optimizaciones.

¿Qué es el ADPF?

El framework de rendimiento dinámico de Android (ADPF) optimiza los juegos según las funciones dinámicas de administración térmica, de CPU y de GPU en Android. Aunque el enfoque es en los juegos, también puedes usar las funciones para otras apps de alto rendimiento.

ADPF es un conjunto de APIs que permiten que los juegos y las apps de alto rendimiento interactúen de forma más directa con los sistemas térmicos y de alimentación de los dispositivos Android. Con estas APIs, puedes supervisar el comportamiento dinámico en sistemas Android y optimizar el rendimiento del juego en un nivel sostenible que no sobrecaliente los dispositivos.

Estas son las funciones principales de ADPF:

  • API de Thermal: Supervisa el estado térmico de un dispositivo para que la aplicación pueda ajustar de forma proactiva la carga de trabajo antes de que sea insostenible.
  • API de CPU Performance Hint: Proporciona sugerencias de rendimiento que le permiten a Android elegir la configuración de rendimiento adecuada (por ejemplo, el punto de funcionamiento de la CPU o el núcleo) para la carga de trabajo.
  • API de Game Mode y API de Game State: Permiten optimizar el juego priorizando las características de rendimiento o duración de la batería, según la configuración del usuario y los parámetros específicos del juego.
  • Modo de rendimiento fijo: Habilita el modo de rendimiento fijo en un dispositivo durante las comparativas para obtener mediciones que no se vean afectadas por la sincronización dinámica de la CPU.
  • Modo de eficiencia energética: Indica a la sesión que los subprocesos de Performance Hint Session se pueden programar de forma segura para priorizar la eficiencia energética por sobre el rendimiento. Disponible en Android 15 (nivel de API 35).

Cómo usar ADPF en proyectos nativos de Android

El codelab Cómo integrar funciones de adaptabilidad a tu juego nativo te guía para integrar funciones de ADPF en tu juego con pasos que puedes seguir a tu propio ritmo. Al final del codelab, habrás integrado las siguientes funciones:

  • API de Thermal: Escucha la condición térmica del dispositivo y reacciona antes de que entre en estado de limitación térmica.
  • API de Game Mode: Comprende las preferencias de optimización del jugador (maximizar el rendimiento o preservar la batería) y realiza los ajustes necesarios.
  • API de Game State: Permite que el sistema conozca el estado de tu juego (carga, reproducción, IU, etcétera), y el sistema puede ajustar los recursos según corresponda (aumentar la E/S o la CPU, la GPU, etcétera).
  • API de Performance Hint: Permite que el sistema conozca tu modelo de subprocesos y tu carga de trabajo para que pueda asignar recursos según corresponda.

Cómo usar ADPF en el motor de juegos de Unity

El Rendimiento adaptable de Unity es una herramienta para los desarrolladores de juegos que buscan optimizar sus juegos en dispositivos móviles, en especial para el diverso ecosistema de Android. El Rendimiento adaptable permite que tu juego se adapte al rendimiento y a las características térmicas del dispositivo en tiempo real, lo que garantiza una experiencia de juego fluida y eficiente.

El proveedor de Adaptive Performance para Android te guía por los pasos para implementar ADPF en Unity.

Cuadro de diálogo de configuración del proyecto.
Figura 5: Integra ADPF en el motor de Unity.

Cómo usar ADPF en el motor de juegos de Unreal

Cuadro de diálogo de configuración del proyecto.
Figura 6: Integra ADPF en Unreal Engine.
  1. Descarga el complemento
  2. Copia el complemento en la carpeta de complementos del proyecto
  3. Habilita el complemento de ADPF de Unreal Engine en el editor de Unreal
  4. Cómo volver a iniciar el editor de Unreal
  5. Compila y cocina el juego

El complemento framework de rendimiento dinámico de Android(ADPF) para Unreal Engine proporciona un rendimiento estable y evita la regulación térmica. Descarga el complemento desde GitHub. Este complemento cambia las funciones configurando valores de la consola de Unreal.