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, 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 sea insuficiente 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 tu 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 tu 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, reducir la configuración de gráficos aumentará estas métricas 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 a 66.6 ms significa que el juego se congela por completo durante 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, el P90 y el P99, puedes usar los siguientes dos métodos. El primer método es analizar los registros del sistema con Android
Performance Analyzer (APA), una herramienta de generación de perfiles de rendimiento. El segundo método es usar el comando adb dumpsys SurfaceFlinger --timestats existente.
1. Medición con APA
Con APA, puedes registrar un registro del sistema y analizar con precisión los datos de fotogramas a través de consultas en SQL. Sigue estos pasos para medir tus métricas:
Captura el registro con APA: Ejecuta el juego y usa APA para capturar un registro del sistema durante el segmento que deseas analizar (por ejemplo, un punto durante el juego en el que sospechas que hay caídas de fotogramas). Una vez que el dispositivo esté conectado y se complete la grabación del registro, los datos del registro se cargarán en la interfaz de APA.
Pantalla de captura de registros o pantalla de registros cargados Haz clic en la pestaña SQL en APA: Una vez que se abra la pantalla de análisis de registros, haz clic en la pestaña SQL en el área de navegación superior o lateral de la IU para abrir el entorno del procesador de registros, donde puedes consultar los datos directamente.
Pega la consulta en SQL en la pestaña SQL de APA: Copia la siguiente consulta en SQL y pégala en el campo de entrada de la consulta. Esta consulta identifica el proceso de SurfaceFlinger, calcula los intervalos de fotogramas en función de las marcas de tiempo de actualización de la pantalla real y deriva el FPS promedio, el 10% inferior (P90) y el 1% inferior (P99).
WITH target_process AS ( -- 1. Get SurfaceFlinger process ID where frames were identified in debugging step 3 SELECT upid FROM process WHERE name = '/system/bin/surfaceflinger' ), actual_present_times AS ( -- 2. Calculate the hardware display timestamps when SurfaceFlinger actually updated the screen SELECT (ts + dur) AS present_ts FROM actual_frame_timeline_slice WHERE upid IN (SELECT upid FROM target_process) AND dur > 0 ), present_intervals AS ( -- 3. Calculate intervals between physical screen refreshes SELECT (LEAD(present_ts) OVER (ORDER BY present_ts ASC) - present_ts) / 1000000.0 AS p2p_ms FROM actual_present_times ), valid_intervals AS ( -- 4. Filter for valid frame intervals SELECT p2p_ms FROM present_intervals WHERE p2p_ms IS NOT NULL AND p2p_ms > 0 ), ordered_frames AS ( -- 5. Sort in ascending order to calculate percentiles SELECT p2p_ms, ROW_NUMBER() OVER (ORDER BY p2p_ms ASC) AS row_num, COUNT(1) OVER () AS total_frames FROM valid_intervals ) -- 6. Output final metrics SELECT (SELECT COUNT(1) FROM valid_intervals) AS total_presented_frames, ROUND(1000.0 / NULLIF((SELECT AVG(p2p_ms) FROM valid_intervals), 0), 2) AS average_fps, ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.90 AS INT)), 0), 2) AS low_10_fps, ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.99 AS INT)), 0), 2) AS low_1_fps;Haz clic en "Ejecutar consulta": Haz clic en el botón Ejecutar consulta (o en el ícono de ejecución) cerca del campo de entrada de la consulta. Una vez que se complete la ejecución de la consulta, los fotogramas totales medidos (
total_presented_frames), la velocidad de fotogramas promedio (average_fps), el 10% inferior de FPS (low_10_fps) y el 1% inferior de FPS (low_1_fps) se mostrarán en una tabla en el panel de resultados.
Pantalla que muestra la consulta en SQL ejecutada y las cuatro métricas resultantes que se muestran en una tabla
2. Medición con adb (dumpsys SurfaceFlinger)
Para medir de manera eficaz el FPS promedio, el P90 y el 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 -dumpFiltrar 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.
Tiempo de procesamiento 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 foundDetén la captura: 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, el P90 y el 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 avanzadas de generación de perfiles, 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 los 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).
- Desarrolladores de Android: Optimiza el rendimiento del juego: Explora el centro central para la optimización de juegos de Android. En esta guía completa, se abarcan las prácticas recomendadas y las herramientas de generación de perfiles (como APA y Perfetto) para ayudarte a maximizar el rendimiento general de tu juego.