Calcula los tiempos de procesamiento de fotogramas de CPU y GPU

Estimar los tiempos de procesamiento de fotogramas de la CPU y la GPU (tiempos de fotogramas) es esencial para comprender el rendimiento de tu app y ubicar los cuellos de botella. Cuando creas un perfil de una app con AGI, System Profiler proporciona datos de seguimiento que puedes usar para estimar los tiempos de fotogramas.

Tiempos de CPU

En AGI, puedes ver los tiempos de fotogramas de la CPU totales y activos en el seguimiento de la CPU de un perfil del sistema.

Tiempo de CPU total

Para medir el tiempo total de CPU empleado, selecciona el período que incluye el tiempo entre los eventos sucesivos de envío de fotogramas. Los eventos de envío de fotogramas son eglSwapBuffers (para OpenGL) y vkQueuePresentKHR (para Vulkan).

Captura de pantalla de los eventos de eglSwapBuffer.
Figura 1. Tiempo entre dos eventos eglSwapBuffer.


Captura de pantalla de un evento vkQueuePresentKHR.
Figura 2. Tiempo entre dos eventos vkQueuePresentKHR.

Esta medición es una estimación del tiempo total de CPU,pero no necesariamente representa el tiempo de CPU activo. Por ejemplo, en las apps vinculadas a la GPU, la CPU puede esperar a que la GPU complete su trabajo antes de enviar un fotograma nuevo. Esto suele suceder cuando un evento dequeueBuffer, eglSwapBuffer (para OpenGL) o vkQueuePresent (para Vulkan) ocupa una gran parte del tiempo de CPU. El tiempo de espera se incluye en el tiempo total de CPU, pero no en el tiempo de CPU activo.

Captura de pantalla que muestra una gran cantidad de tiempo de inactividad durante los eventos dequeueBuffer y eglSwapBuffer.
Figura 3. Una gran cantidad de CPU inactiva durante dequeueBuffer y eglSwapBuffer eventos.

Tiempo de CPU activo

El tiempo de CPU activo determina cuándo la CPU ejecuta el código de la app sin estar en estado inactivo.

Para medir el tiempo de CPU activo, consulta los segmentos Running justo encima de los eventos de la CPU. Cuenta todas las partes del seguimiento entre los dos eventos de envío de fotogramas que se encuentran en el estado Running. Asegúrate de incluir los subprocesos de trabajo.

Captura de pantalla de dos períodos de tiempo de CPU que se pueden usar para medir el tiempo de CPU activo.
Figura 5. Dos períodos de tiempo de CPU que se pueden usar para medir el tiempo de CPU activo.


Captura de pantalla de una app con varios subprocesos que tiene otros subprocesos en funcionamiento mientras el subproceso principal está inactivo.
Figura 6. Una app de subprocesos múltiples que tiene otros subprocesos de trabajo mientras el subproceso principal está inactivo.

Otra forma de medir el tiempo de CPU activo es ver los segmentos de la app en los seguimientos de la CPU. Estos segmentos indican cuándo se ejecuta la CPU y corresponden a los segmentos Running.

Captura de pantalla que muestra el estado de ejecución de un subproceso fijado que coincide con el registro de la CPU.
Figura 7. El estado de ejecución del subproceso fijado coincide con el seguimiento de la CPU.

Para identificar los segmentos de la app, puedes agregar ATrace marcadores a tu app. Esto mostrará los marcadores en el seguimiento de la CPU de System Profiler.

Captura de pantalla de segmentos de ATrace que se muestran en un segmento de CPU.
Figura 8. Segmentos de ATrace que se muestran en un seguimiento de la CPU.

Estima los tiempos de fotogramas de la GPU

Para estimar los tiempos de fotogramas de la GPU, puedes usar segmentos o contadores de GPU en System Profiler. La estimación es más precisa cuando se usan segmentos de GPU.

Segmentos de GPU

Si System Profiler tiene información de segmentos de GPU disponible, puedes obtener información muy precisa sobre la latencia de fotogramas de la GPU midiendo la cantidad total de tiempo que tu app dedica a trabajar en tareas asociadas con un solo fotograma.

Dispositivos Mali

En los dispositivos Mali, los segmentos de GPU tienen seguimientos de fragment, non-fragment y en ocasiones supplementary non-fragment. Para los fotogramas menos complejos, el trabajo de fragmentos y no fragmentos es secuencial, por lo que se puede distinguir el trabajo de un fotograma de otro buscando espacios entre el trabajo activo de la GPU.

Como alternativa, si estás familiarizado con el trabajo que se envía a la GPU, identificar el patrón de los pases de renderizado enviados proporciona información sobre cuándo comienza y termina un fotograma.

Captura de pantalla de varios fotogramas que se ejecutan en secuencia.
Figura 9. Varios fotogramas que se ejecutan en secuencia.
Captura de pantalla en la que se amplía la AGI en el trabajo de un fotograma individual.
Figura 10. Se amplió el trabajo de un fotograma individual.

Para las apps que tienen un flujo de trabajo de GPU más paralelizado, puedes obtener los tiempos de fotogramas de la GPU buscando todos los fotogramas que tengan el mismo submissionID en el panel Selection para cada segmento.

En el caso de las apps basadas en Vulkan, se pueden usar varios envíos para componer un fotograma. Haz un seguimiento de los IDs de envío con el seguimiento Vulkan Events, que contiene un segmento para cada envío. Si seleccionas un segmento de envío, se destacarán todos los segmentos de actividad de la GPU que correspondan al envío.

Captura de pantalla de una carga de trabajo de GPU paralelizada, en la que el trabajo en un fotograma puede superponerse con otro.
Figura 11. Una carga de trabajo de GPU paralelizada, en la que el trabajo en un fotograma puede superponerse con otro.


Captura de pantalla de varios eventos de Vulkan seleccionados para un fotograma.
Figura 12: Se seleccionaron varios eventos de Vulkan para un fotograma.

Dispositivos Adreno

En los dispositivos Adreno, los segmentos de GPU aparecen en el seguimiento GPU Queue 0 y siempre se representan de forma secuencial, por lo que puedes observar todos los segmentos que representan los pases de renderizado de un fotograma y usarlos para medir los tiempos de fotogramas de la GPU.

Captura de pantalla de varios fotogramas que se ejecutan en secuencia.
Figura 13. Varios fotogramas que se ejecutan en secuencia.
Captura de pantalla en la que se amplía la AGI en un fotograma con varios pases de renderización.
Figura 14. Se amplió un fotograma con varios pases de renderizado.

De manera similar al caso de Mali descrito anteriormente, si la app usa Vulkan, el seguimiento Vulkan Events proporciona información sobre el trabajo que se envía para ejecutar el fotograma. Para destacar los pases de renderizado, haz clic en los segmentos Vulkan Events asociados con el fotograma.

Captura de pantalla de una app basada en Vulkan en la que se seleccionan los eventos de Vulkan del fotograma.
Figura 15. Una app basada en Vulkan en la que se seleccionan eventos de Vulkan para un fotograma.

Hay algunos casos en los que los límites de fotogramas de la GPU son más difíciles de distinguir debido a que la app está muy vinculada a la GPU. En estos casos, si estás familiarizado con el trabajo que se envía a la GPU, puedes identificar el patrón con el que se ejecutan los pases de renderizado y determinar los límites de fotogramas a partir de esa información.

Captura de pantalla de una app con una gran dependencia de la GPU y un patrón de pase de renderización que ayuda a identificar los límites de los fotogramas.
Figura 16. Una app muy vinculada a la GPU con un patrón de pase de renderizado que ayuda a identificar los límites de fotogramas.

Contadores de GPU

Si la información de los segmentos de GPU no está disponible en un seguimiento, puedes estimar la latencia de fotogramas de la GPU con los seguimientos de GPU counter.

Dispositivos Mali

En los dispositivos Mali, puedes usar el seguimiento GPU utilization para estimar la latencia de fotogramas de la GPU de una app que no es intensiva en la GPU. Cuando las apps son menos intensivas en la GPU, tienen períodos regulares de actividad alta y baja de la GPU, en lugar de una actividad alta constante. Para estimar los tiempos de fotogramas de la GPU con el seguimiento GPU utilization, mide la duración de los períodos de actividad alta en el seguimiento.

Captura de pantalla de los registros de uso de la GPU y de la fila de la GPU en un dispositivo Mali.
Figura 17: Los seguimientos de uso de la GPU y de cola de la GPU en un dispositivo Mali.

Si la app es más intensiva en la GPU, el uso de la GPU puede ser muy alto de manera constante. En este caso, puedes usar los seguimientos de fragment queue utilization y non-fragment queue utilization para supervisar la actividad de la GPU y estimar los tiempos de fotogramas de la GPU. Si buscas patrones en los seguimientos de fragment y non-fragment , puedes obtener una estimación aproximada de dónde están los límites de un fotograma y usarla para medir la latencia de fotogramas de la GPU.

Captura de pantalla de pistas de fragmentos y no fragmentos.
Figura 18. Seguimientos de fragment y non-fragment.

Dispositivos Adreno

En los dispositivos Adreno, si la app no es intensiva en la GPU, puedes estimar los tiempos de fotogramas de la GPU de la misma manera que con los dispositivos Mali en la sección anterior.

Captura de pantalla del porcentaje de uso de la GPU y de los registros de la fila de la GPU en un dispositivo Adreno.
Figura 19: El porcentaje de uso de la GPU y los seguimientos de cola de la GPU en un dispositivo Adreno.

Si la app es más intensiva en la GPU y la aplicación tiene un porcentaje de uso de la GPU alto de manera constante, puedes usar los seguimientos de Vertex Instructions / Second y Fragment Instructions / Second para estimar los tiempos de fotogramas de la GPU. Si buscas patrones en los niveles de actividad de estos seguimientos, puedes obtener una estimación aproximada de dónde están los límites de un fotograma y usarla para medir la latencia de fotogramas de la GPU.

Captura de pantalla de las instrucciones de Vertex / segundo segmento.
Figura 20. El seguimiento de Vertex Instructions / Second.

Estos otros seguimientos pueden proporcionar información similar:

  • Vertices Shaded / Second
  • Fragments Shaded / Second
  • % Time Shading Vertices
  • % Time Shading Fragments