FPS promedio
Una velocidad de fotogramas fluida y estable es fundamental para ofrecer una experiencia de juego de alta calidad en dispositivos Android. Cuando mides el rendimiento del juego, debes medir el FPS promedio como un punto de referencia para obtener una comprensión básica de la experiencia. Debes optimizar tu juego para que cumpla con la velocidad de fotogramas promedio de 60 FPS y garantizar una excelente experiencia de juego.
FPS de P90 y P99 para la estabilidad
Con un promedio de 60 FPS fluido, un juego aún puede experimentar problemas intermitentes, microtartamudeos y una latencia de entrada impredecible, lo que genera una mala experiencia para el jugador.
Por lo tanto, la estabilidad de los fotogramas es tan importante como hacer un seguimiento de la velocidad de fotogramas promedio. Aquí es donde debes medir las métricas de velocidad de fotogramas de P90 y P99 como el punto de referencia coherente y el indicador de tartamudeo, respectivamente. Estas métricas capturan el "extremo final" del rendimiento para que optimices la fluidez de la experiencia del jugador.
Métricas
- FPS promedio (punto de referencia): Esta métrica fundamental proporciona un punto de referencia general del rendimiento de tu juego. Si bien es un parámetro de referencia estándar, el cálculo promedio significa que no se pueden detectar las caídas intermitentes de fotogramas ni los microtartamudeos, lo que hace que no sea suficiente para representar la experiencia del jugador por sí sola.
- FPS de P90 (punto de referencia coherente en el percentil 10%): Esto indica que el 90% de tus fotogramas superaron este punto de referencia coherente y que solo el 10% de los fotogramas más lentos tardaron más en renderizarse. Si la velocidad de fotogramas de P90 es alta y cercana al promedio, el juego se ejecuta de manera coherente para la gran mayoría de la sesión.
- FPS de P99 (indicador de tartamudeo en el percentil 1%): Esto indica que el 99% de tus fotogramas superaron este indicador de tartamudeo, lo que aísla específicamente el 1% de los fotogramas más lentos. Esta métrica es esencial para detectar microtartamudeos, retrasos en la carga de recursos y picos repentinos de renderización con muchos recursos que causan problemas visibles.
Ejemplos
Si comparas el FPS promedio con las métricas de P90 y P99, puedes diagnosticar con precisión el comportamiento subyacente de un juego.
Situación 1: Una curva óptima (juego optimizado)
- Promedio: 60 FPS (16.6 ms)
- P90: 58 FPS (17.2 ms)
- P99: 52 FPS (19.2 ms)
- Análisis: Las métricas están muy agrupadas. El juego se siente increíblemente fluido y coherente. No hay microtartamudeos, y el 1% de los fotogramas más lentos apenas se notan a simple vista.
Situación 2: Cuello de botella de carga (CPU/GPU)
- Promedio: 45 FPS (22.2 ms)
- P90: 40 FPS (25.0 ms)
- P99: 38 FPS (26.3 ms)
- Análisis: La velocidad de fotogramas promedio es más baja, pero de manera coherente. P99 no disminuye drásticamente en comparación con el promedio. Esto indica que el sistema está esencialmente sobrecargado por la configuración gráfica o las restricciones de resolución. El juego no se sentirá como si estuviera tartamudeando, sino más bien lento. Por lo general, si se reduce la configuración de gráficos, estas métricas se ajustarán de manera uniforme.
Situación 3: 60 FPS inestables (compilación de sombreadores / tartamudeos de transmisión de recursos )
- Promedio: 60 FPS (16.6 ms)
- P90: 45 FPS (22.2 ms)
- P99: 15 FPS (66.6 ms)
- Análisis: Esta es la peor situación. Si bien la velocidad de fotogramas promedio parece excelente, P99 revela un problema fundamental. P99 en 66.6 ms significa que el juego se congela por completo para varios fotogramas a la vez. Esto apunta a valores atípicos graves, que suelen deberse a cuellos de botella de la CPU, retrasos en la transmisión de recursos (por ejemplo, RAM o almacenamiento lentos) o problemas causados por la compilación de sombreadores.
Medición
Para medir de manera eficaz el FPS promedio, P90 y P99, puedes usar el comando Android
dumpsys surfaceflinger timestats. Esta herramienta proporciona el FPS promedio y un histograma de tiempo presentToPresent para todas las capas que se renderizan. El tiempo presentToPresent de un fotograma es el intervalo entre el fotograma actual y el fotograma anterior que se dibuja.
Estas son las instrucciones paso a paso para recopilar y calcular estas métricas para tu juego:
Comienza a capturar: Ejecuta el siguiente comando con las marcas enable y clear para comenzar a capturar información:
adb shell dumpsys SurfaceFlinger --timestats -clear -enableVolcar información: Cuando se haya jugado el juego durante el tiempo suficiente, vuelve a ejecutar el comando con la marca dump para generar la información:
adb shell dumpsys SurfaceFlinger --timestats -dumpFiltra por capa: La información volcada proporciona datos para todas las capas renderizadas por SurfaceFlinger. Debes encontrar la sección correspondiente a tu juego filtrando según el
layerName(por ejemplo, layerName = SurfaceView[com.example.yourgame...]).layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833Identifica el FPS promedio: El FPS promedio de cada capa se calcula automáticamente y se muestra directamente en el resultado del volcado (por ejemplo, averageFPS = 30.179).
... averageFPS = 30.179 ...Calcula el FPS de P90 y P99: Para encontrar las métricas de P90 y P99, debes analizar el histograma de tiempo totalFrames y
presentToPresentque se proporciona en el volcado.totalFrames = 1000 ... 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=850 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=100 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=35 54ms=0 58ms=0 62ms=0 66ms=10 70ms=0 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=5 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=0A. Ejemplo conceptual (tabla de distribución acumulada) Supongamos que tu sesión de juego registró un recuento de totalFrames de 1,000. Para encontrar P90 y P99, calcula los umbrales de milisegundos en los que el recuento de fotogramas acumulado alcanza los 900 fotogramas (90%) y los 990 fotogramas (99%), respectivamente, contando desde el bucket de milisegundos más bajo.
Latencia de fotogramas (ms) Recuento de fotogramas (histograma) Recuento de fotogramas acumulado Estado / cálculo de percentiles 16ms 850 850 85.0% 33ms 100 950 95.0%
(¡Se alcanzó el objetivo de P90 de 900! → 1000/33 = 30.3 FPS)50ms 35 985 98.5% 66ms 10 995 99.5%
(Se alcanzó el objetivo de P99 de 990. → 1000/66 = 15.1 FPS)102ms 5 1,000 100% B. Lógica de implementación (pseudocódigo) Si automatizas este análisis con una secuencia de comandos de Python o un analizador de registros, la lógica para extraer los valores de P90 y P99 del histograma se puede implementar de la siguiente manera:
# Define target thresholds based on total frame count p90_target = totalFrames * 0.90 p99_target = totalFrames * 0.99 cumulative_frames = 0 p90_fps = None p99_fps = None # Iterate through the parsed SurfaceFlinger histogram data (sorted by millisecond) for ms_bucket, frame_count in present_to_present_histogram: cumulative_frames += frame_count # Capture P90 when cumulative frames cross the 90% threshold if p90_fps is None and cumulative_frames >= p90_target: p90_fps = 1000 / ms_bucket # Capture P99 when cumulative frames cross the 99% threshold if p99_fps is None and cumulative_frames >= p99_target: p99_fps = 1000 / ms_bucket break # Optimization: stop iterating once both targets are foundDeja de capturar: Después de recopilar toda la información necesaria, debes inhabilitar timestats con la marca disable:
adb shell dumpsys SurfaceFlinger --timestats -disable
Sesiones lentas
Las sesiones lentas identifican problemas de rendimiento generalizados en el mundo real. Una sesión es "lenta" si más del 25% de los fotogramas caen por debajo de un umbral (por ejemplo, 20 FPS). Si bien es útil para detectar problemas fundamentales de compilación, esta métrica por sí sola no puede garantizar una experiencia sostenible y de alta calidad. Un juego puede evitar el umbral de sesión lenta, pero aun así sufrir microtartamudeos que comprometan una experiencia fluida de 60 FPS.
Si bien ambos se derivan de los tiempos de fotogramas, "Sesión lenta" y "Velocidad de fotogramas" cumplen funciones diferentes. Las métricas de FPS promedio, P90 y P99 miden la calidad y la sostenibilidad del rendimiento, y detectan caídas instantáneas y un ritmo incoherente que la métrica de sesión lenta podría pasar por alto.
Conclusión
La optimización del rendimiento exitosa requiere una estrategia integral. Los desarrolladores deben usar las sesiones lentas como un radar principal para detectar una degradación grave del rendimiento y, luego, examinar el FPS promedio, P90 y P99 para diagnosticar las causas subyacentes y verificar la fluidez real del juego. Si integras estas métricas, puedes asegurarte de que tu aplicación ofrezca una experiencia del usuario excepcional y sostenible de manera coherente.
Recursos adicionales
Para obtener más información sobre las técnicas de generación de perfiles avanzadas, la implementación de la API de Frame Pacing y las estrategias de optimización específicas del motor, consulta la documentación oficial para desarrolladores de Android:
- Android vitals: Sesiones lentas: Comprende cómo Google Play mide y registra períodos prolongados de renderización lenta, lo que afecta directamente la experiencia del usuario. Una "sesión lenta" se define como una sesión de usuario en la que más del 25% de los fotogramas son lentos (por ejemplo, tardan más de 50 ms, lo que equivale a 20 FPS).
- Android Developers: Optimiza el rendimiento del juego: Explora el centro central para la optimización de juegos de Android. Esta guía completa abarca las prácticas recomendadas y las herramientas de generación de perfiles (como Android Performance Analyzer [APA] y Perfetto) para ayudarte a maximizar el rendimiento general de tu juego.