Sesiones lentas (solo juegos)

Sesiones lentas es una nueva métrica de Android vitals en Google Play Console. Una sesión lenta es aquella 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). Con Sesiones lentas, puedes comprender el rendimiento de la velocidad de fotogramas de tu juego, lo que afecta la fluidez y homogeneidad del juego 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ó durante un minuto.

Visita el Centro de ayuda para obtener más detalles sobre la métrica.

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 FPS promedio y presente para presentar histograma de tiempo para todas las capas que se renderizan. El tiempo presente hasta el presente de un fotograma es el intervalo entre el fotograma actual y el anterior que se está dibujando. A continuación, te indicamos los pasos a seguir para usar el comando para 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 juegue 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 volcado proporciona el total de fotogramas y el histograma presenteToPresent para todas las capas que procesa SurfaceFlinger. Para encontrar la sección del 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 podría calcular en función de la información de cada capa.

    Por ejemplo, un 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
    

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

    ...
    averageFPS = 30.179
    ...
    
  3. Después de recopilar toda la información, debes inhabilitar las estadísticas de tiempo mediante 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 presentarse o renderizarse más tiempo en la pantalla que el objetivo del desarrollador. El juego podría dependiente de la CPU/GPU. O bien, el dispositivo se está sobrecalentando y activa un estado térmico limitado. También hay una discrepancia en 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 solucionar estos problemas y mejorar el rendimiento de tu juego.

¿Qué es Swappy?

La biblioteca de Android Frame Pacing, también conocida como Swappy, es 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 de un 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 a un nuevo 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

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 juego de Unity

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

Diálogo de configuración del proyecto
Figura 2: Habilita Frame Pacing en Unity Engine.

También puedes habilitar de manera programática la opción de Optimized Frame Pacing en tu código lógico para permitir que Unity distribuya los fotogramas de manera uniforme con una menor variación en la velocidad de fotogramas, lo que creará una experiencia de juego más fluida.

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

Unreal 4.25 y las versiones posteriores integran la biblioteca de Android Frame Pacing, que forma parte de 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 a partir del 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 sin vinculación y el seguimiento de rayos

Cómo usar Vulkan en proyectos nativos de Android

En el codelab Cómo comenzar a usar Vulkan en Android, se explica cómo configurar tu canalización de renderización de Vulkan y, luego, renderizar un triángulo con textura y rotación en la pantalla. Usa el codelab para aprender a renderizar los gráficos de tu juego.

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

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

Diálogo de configuración del proyecto
Figura 3: Habilitar la API de Auto Graphics de Unity

Como alternativa, puedes habilitar Vulkan de forma manual. Para ello, inhabilita la API de Auto Graphics y otorga a Vulkan la prioridad más alta en la lista de APIs de Graphics. Si usas Unity 2021.1 o una versión anterior, esta es la única manera de usar Vulkan.

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 de tiempo de inicio de la API de gráficos para que el juego las use en dispositivos específicos.

Cómo usar Vulkan en el motor de juego de Unreal

Para habilitar la API de gráficos de Vulkan, navega 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 recurre a OpenGL ES 3.2.

Diálogo de configuración del proyecto
Figura 5: Habilitar 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 Cómo personalizar perfiles de dispositivos y escalabilidad para Android si quieres obtener información para personalizar BaseDeviceProfile.ini. Como los controladores nuevos pueden corregir los dispositivos con errores conocidos anteriormente, mantén actualizado el archivo BaseDeviceProfile.ini para obtener todas las optimizaciones.

¿Qué es ADPF?

El framework de rendimiento dinámico (ADPF) de Android optimiza los juegos según las funciones dinámicas de administración térmica, de CPU y de GPU de Android. La atención se centra en los juegos, pero 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 sustentable que no sobrecaliente los dispositivos.

Estas son las funciones principales de ADPF:

  • API térmica: Supervisa el estado térmico de un dispositivo para que la aplicación pueda ajustar de manera proactiva la carga de trabajo antes de que se vuelva insostenible.
  • API de CPU Performance Hint: Proporciona sugerencias de rendimiento que le permitan a Android elegir la configuración de rendimiento correcta (por ejemplo, punto operativo o núcleo de CPU) para la carga de trabajo.
  • API de Game Mode y API de Game State: Habilita la optimización del juego priorizando las características de rendimiento o de duración de batería según la configuración del usuario y las configuraciones específicas 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 alteradas por el reloj dinámico de la CPU.
  • Modo de eficiencia energética: Indica a la sesión que los subprocesos de la sesión de sugerencias de rendimiento 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 en 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 térmica: Escucha las condiciones térmicas 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 (maximiza el rendimiento o conserva la batería) y realiza ajustes según corresponda.
  • API de Game State: Informa al sistema el estado de tu juego (carga, juego, IU, etc.) y el sistema puede ajustar los recursos según corresponda (potencial E/S, CPU, GPU, etcétera).
  • API de Performance Hint: Informa al sistema tu modelo de subprocesos y tu carga de trabajo para que el sistema 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 especial para el ecosistema diverso 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.

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

Cómo usar ADPF en un motor de juego de Unreal

Diálogo de configuración del proyecto
Figura 7: Integra el ADPF en Unreal Engine.
  1. Descarga el complemento.
  2. Copia el complemento en la carpeta de complementos del proyecto
  3. Habilitar el complemento ADPF de Unreal Engine en el editor de Unreal
  4. Reiniciar el editor de Unreal
  5. Crea y cocina el juego

El complemento del 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.