Velocidad de fotogramas

FPS promedio

Una velocidad de fotogramas fluida y estable es fundamental para ofrecer una experiencia de juego de alta calidad en dispositivos Android. Cuando midas el rendimiento del juego, debes medir el FPS promedio como un valor de referencia para obtener una comprensión básica de la experiencia. Debes optimizar tu juego para que alcance 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 fluidos, un juego puede seguir experimentando interrupciones intermitentes, microtartamudeos y un retraso de entrada impredecible, lo que genera una mala experiencia del 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 indicador 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 (referencia): Esta métrica fundamental proporciona una referencia general del rendimiento de tu juego. Si bien es una referencia estándar, el cálculo del promedio significa que no se pueden detectar las caídas de fotogramas intermitentes ni los microtartamudeos, lo que hace que sea insuficiente para representar la experiencia del jugador por sí sola.
  • FPS en el percentil 90 (referencia coherente en el percentil 10): Esto indica que el 90% de los fotogramas superaron esta referencia coherente y que solo el 10% de los fotogramas más lentos tardaron más en renderizarse. Si tu P90 de la velocidad de fotogramas es alto y cercano al promedio, el juego se ejecuta de forma constante y correcta durante la gran mayoría de la sesión.
  • FPS de P99 (indicador de tartamudeo en el percentil 1): Indica que el 99% de los fotogramas superaron este indicador de tartamudeo, lo que aísla específicamente el 1% de los fotogramas más lentos. Esta métrica es fundamental para detectar microinterrupciones, retrasos en la carga de recursos y picos repentinos de renderización con muchos recursos que causan interrupciones 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 se agrupan de forma compacta. El juego se siente increíblemente fluido y coherente. No hay microtartamudeos, y hasta el 1% de los peores fotogramas apenas se perciben a simple vista.

Situación 2: Cuello de botella de carga (vinculado a la CPU o la 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 constante. El P99 no disminuye drásticamente en comparación con el promedio. Esto indica que el sistema está sobrecargado por la configuración gráfica o las restricciones de resolución. El juego no se sentirá como si se trabara, sino como si fuera lento. Por lo general, reducir la configuración de gráficos aumentará estas métricas de forma uniforme.

Situación 3: 60 FPS inestables (compilación de sombreadores / interrupciones 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 posible. Si bien la velocidad de fotogramas promedio parece excelente, el P99 revela un problema crítico. El P99 de 66.6 ms significa que el juego se congela por completo durante varios fotogramas a la vez. Esto indica 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 tirones causados por la compilación de sombreadores.

Medición

Para medir de manera eficaz el promedio de FPS, P90 y P99, puedes usar el comando dumpsys surfaceflinger timestats de Android. Esta herramienta proporciona el FPS promedio y un histograma de tiempos 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 dibujó.

Estas son las instrucciones paso a paso para recopilar y calcular estas métricas para tu juego:

  1. Iniciar captura: Ejecuta el siguiente comando con las marcas de habilitación y borrado para comenzar a capturar información:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Volcado de información: Cuando se haya jugado el tiempo suficiente, vuelve a ejecutar el comando con la marca de volcado para generar la información:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    
  3. Filtrar por capa: La información volcada proporciona datos para todas las capas renderizadas por SurfaceFlinger. Para encontrar la sección correspondiente a tu juego, filtra según layerName (por ejemplo, layerName = SurfaceView[com.example.yourgame…]).

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    
  4. Identifica 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
    ...
    
  5. Cómo calcular los FPS de P90 y P99: Para encontrar las métricas de P90 y P99, debes analizar el histograma de sincronización de totalFrames y presentToPresent que 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=0
    

    A. Ejemplo conceptual (tabla de distribución acumulativa) Supongamos que tu sesión de juego registró un recuento de totalFrames de 1,000. Para encontrar los percentiles 90 y 99, calcula los umbrales de milisegundos en los que el recuento acumulativo de fotogramas alcanza los 900 fotogramas (90%) y los 990 fotogramas (99%), respectivamente, contando desde el intervalo de milisegundos más bajo.

    Tiempo de procesamiento de fotogramas (ms) Recuento de fotogramas (histograma) Recuento acumulado de fotogramas Estado o cálculo del percentil
    16 ms 850 850 85%
    33 ms 100 950 95.0%
    (Se alcanzó el objetivo del percentil 90 de 900! → 1,000/33 = 30.3 FPS)
    50 ms 35 985 98.5%
    66 ms 10 995 99.5%
    (Se alcanzó el objetivo del P99 de 990! → 1,000/66 = 15.1 FPS)
    102 ms 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 found
    
  6. Dejar de capturar: Después de recopilar toda la información necesaria, debes inhabilitar las estadísticas de tiempo con la marca de inhabilitación:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Sesiones lentas

Las sesiones lentas identifican problemas de rendimiento generalizados en el mundo real. Una sesión se considera "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 críticos 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 microinterrupciones 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 las caídas instantáneas y el ritmo inconsistente 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 radar principal para detectar la degradación grave del rendimiento y, luego, examinar el promedio de FPS, el P90 y el P99 para diagnosticar las causas subyacentes y verificar la fluidez real del juego. Si integras estas métricas, puedes garantizar que tu aplicación ofrezca una experiencia del usuario excepcional y sostenible de forma constante.

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 los períodos prolongados de renderización lenta, que afectan directamente la experiencia del usuario. Una "sesión lenta" se define como una sesión del 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: Optimize Game Performance: Explora el centro de recursos para la optimización de juegos de Android. Esta guía integral abarca las prácticas recomendadas y las herramientas de generación de perfiles (como AGI y Perfetto) para ayudarte a maximizar el rendimiento general de tu juego.