Sesiones lentas (solo para juegos)

Las sesiones lentas son una nueva métrica de Android vitals en Google Play Console. Una sesión lenta es una sesión en la que más del 25% de los fotogramas son lentos. Un fotograma es lento si no se presenta menos de 50 ms después del fotograma anterior (equivalente a 20 FPS). Android vitals también informa una segunda métrica de sesiones lentas con un objetivo de 34 ms (equivalente a 30 FPS). Si usas sesiones lentas, podrás comprender el rendimiento de la velocidad de fotogramas de tu juego, que afecta la fluidez y homogeneidad del título para los usuarios.

A su debido tiempo, Play comenzará a alejar a los usuarios de los juegos que no puedan alcanzar los 20 FPS en sus teléfonos. Ten en cuenta que Android vitals solo comienza a supervisar la velocidad de fotogramas después de que el juego se ejecutó por un minuto.

Para obtener más detalles sobre la métrica, visita nuestro Centro de ayuda.

Gráficos similares a gráficos circulares que muestran la cantidad de fotogramas lentos y no lentos.
Figura 1: Una sesión lenta en Android vitals.
.

Cómo medir los FPS y detectar fotogramas lentos

El comando dumpsys surfaceflinger timestats de Android proporciona un histograma de tiempo promedio de FPS y 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 anterior que se dibuja. 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 el juego se haya jugado durante el tiempo suficiente, vuelve a ejecutar el comando con la marca dump para volcar información:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

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

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

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

    Por ejemplo, el porcentaje de fotogramas lentos de 20 FPS = (suma de valores de 54 ms a 1,000 ms) / totalFrames × 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
    

    El FPS promedio de cada capa también se muestra en el volcado:

    ...
    averageFPS = 30.179
    ...
    
  3. Después de recopilar toda la información, debes inhabilitar los timestats con la marca disable:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Causas y soluciones de los fotogramas lentos

Existen muchos motivos por los que un fotograma puede mostrarse o renderizarse más tiempo en la pantalla que el objetivo del desarrollador. Es posible que el juego esté limitado por 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ñó para 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 a 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 2: Habilita Frame Pacing en Unity Engine.

Como alternativa, habilita de forma programática la opción Optimized Frame Pacing en tu código lógico para permitir que Unity distribuya los fotogramas de manera uniforme y disminuya la variación en la velocidad de fotogramas, lo que crea una jugabilidad más fluida.

Cómo usar Swappy en el motor de juego Unreal

Unreal 4.25 y las versiones posteriores integran la Biblioteca de Frame Pacing de Android, que forma parte de Android Game Development Kit. En el artículo sobre Frame Pacing para dispositivos móviles, se explica cómo habilitar la biblioteca de Frame Pacing de Android 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

En el codelab Cómo empezar a usar Vulkan en Android, se 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 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 3: 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 usar Vulkan.

Cuadro de diálogo de configuración del proyecto.
Figura 4: 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 del tiempo de inicio de la API de gráficos para que tu juego las use 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 5: Habilita Vulkan en Unreal Engine.

Si usas funciones específicas de Vulkan que se sabe que se comportan mal en ciertos dispositivos, puedes personalizar tu archivo BaseDeviceProfile.ini para excluir esos dispositivos. Consulta Personalización de perfiles de dispositivos y escalabilidad para Android para aprender a personalizar BaseDeviceProfile.ini. Como los nuevos controladores de dispositivos pueden corregir dispositivos defectuosos conocidos anteriormente, mantén actualizado el 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 correcta (por ejemplo, el punto de funcionamiento o el núcleo de la CPU) para la carga de trabajo.
  • API de Game Mode y API de Game State: Prioriza las características de rendimiento o duración de batería en función de la configuración del usuario y de parámetros específicos del juego para habilitar la optimización 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: Le indica a la sesión que los subprocesos de la sesión de sugerencias de rendimiento se pueden programar de forma segura para preferir la eficiencia energética en lugar del rendimiento. Disponible en Android 15 (nivel de API 35).

Cómo usar ADPF en proyectos nativos de Android

En el codelab Cómo integrar funciones de adaptabilidad a tu juego nativo, se 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 de los jugadores (maximizar el rendimiento o preservar la batería) y haz los ajustes necesarios.
  • API de Game State: Informa al sistema el estado de tu juego (carga, reproducción, IU, etcétera) para que pueda ajustar los recursos según corresponda (aumentar la E/S, 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 juego de Unity

El rendimiento adaptable de Unity es una herramienta para desarrolladores de juegos que buscan optimizar sus juegos en dispositivos móviles, en particular 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 Android de rendimiento adaptable te guía por los pasos para implementar ADPF en Unity.

Cuadro de diálogo de configuración del proyecto.
Figura 6: Integra ADPF en Unity Engine.

Cómo usar ADPF en el motor de juego Unreal

Cuadro de diálogo de configuración del proyecto.
Figura 7: 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 Unreal Engine de ADPF en el editor de Unreal
  4. Vuelve a iniciar el editor de Unreal.
  5. Compila y compila el juego

El complemento Android Dynamic Performance Framework(ADPF) para Unreal Engine proporciona un rendimiento estable y evita el control térmico. Descarga el complemento desde GitHub. Este complemento cambia las funciones configurando valores de Unreal console.