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). 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.
Cómo medir los FPS y detectar fotogramas lentos
El comando dumpsys surfaceflinger timestats de Android proporciona el promedio de FPS y el histograma de tiempo present to present para todas las capas que se renderizan. El tiempo present to present 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:
Ejecuta el comando con las marcas
enableyclearpara comenzar a capturar información:adb shell dumpsys SurfaceFlinger --timestats -clear -enableCuando el juego se reproduzca el tiempo suficiente, vuelve a ejecutar el comando con la marca
dumppara volcar la información:adb shell dumpsys SurfaceFlinger --timestats -dumpLa información volcada proporciona el total de fotogramas y el histograma presentToPresent para todas las capas renderizadas por SurfaceFlinger. Debes encontrar la sección de tu juego filtrando según
layerName:layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833La 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 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=0El promedio de FPS de cada capa también se muestra en el volcado:
... averageFPS = 30.179 ...Después de recopilar toda la información, debes inhabilitar timestats con la marca
disable:adb shell dumpsys SurfaceFlinger --timestats -disable
Causas y soluciones de fotogramas lentos
Hay muchas razones por las 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 el dispositivo se está sobrecalentando y activa un estado térmico limitado. O bien, hay una falta de coincidencia 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 abordar 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 permite que los juegos de OpenGL y Vulkan logren una renderización eficaz y un ritmo de fotogramas correcto en Android.
El ritmo de fotogramas es la sincronización de la lógica y el bucle de procesamiento 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 a tu juego:
- Cómo integrar Android Frame Pacing en tu procesador OpenGL
- Cómo integrar Android Frame Pacing en tu procesador Vulkan
Cómo usar Swappy en el motor de juegos 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 Optimized Frame Pacing en Project Settings > Player > Settings para Android > Resolution and Presentation:
Como alternativa, habilita de forma programática la opción Optimized Frame Pacing en tu código de lógica para permitir que Unity distribuya los fotogramas de manera uniforme para obtener menos varianza en la velocidad de fotogramas, lo que crea 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 Frame Pacing de Android, que forma parte del 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
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.
Como alternativa, puedes habilitar Vulkan de forma manual si inhabilitas la API de Auto Graphics, y colocas Vulkan en la prioridad más alta de la lista APIs de gráficos. Si usas Unity 2021.1 o una versión anterior, esta es la única manera de utilizar Vulkan.
Usa el complemento del motor de Unity VkQuality para proporcionar recomendaciones de la API de gráficos en el momento del lanzamiento para que tu juego las use en dispositivos específicos.
Cómo usar Vulkan en el motor de juegos 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 recurrirá a OpenGL ES 3.2.
Si usas funciones específicas de Vulkan que se sabe que funcionan 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 para aprender a
personalizar BaseDeviceProfile.ini. Como los nuevos controladores de dispositivos pueden corregir dispositivos que antes se conocían como defectuosos, mantén actualizado el archivo BaseDeviceProfile.ini para obtener todas las optimizaciones.
¿Qué es 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 operación o el núcleo de la 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 duración de 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 ven 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 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 las 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 el dispositivo 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 ajusta según corresponda.
- 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 el sistema pueda asignar recursos según corresponda.
Cómo usar ADPF en el motor de juegos de Unity
Adaptive Performance 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. Adaptive Performance 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 a través de los pasos para implementar ADPF en Unity.
Cómo usar ADPF en el motor de juegos de Unreal
- Descarga el complemento.
- Copia el complemento en la carpeta de complementos del proyecto.
- Habilita el complemento de ADPF Unreal Engine en el editor de Unreal.
- Vuelve a iniciar el editor de Unreal.
- Compila y cocina el juego.
El complemento de framework de rendimiento dinámico de Android(ADPF) para Unreal Engine proporciona un rendimiento estable y evita la limitación térmica. Descarga el complemento desde GitHub. Este complemento cambia las funciones configurando los valores de la consola de Unreal.