Calcula los tiempos de procesamiento de fotogramas de CPU y GPU

Estimar los tiempos de procesamiento de fotogramas (tiempos de fotogramas) de la CPU y la GPU es fundamental para comprender el rendimiento de tu app y ubicar los cuellos de botella. Cuando generas perfiles de una app con AGI, el generador de perfiles del sistema 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 CPU totales y activos en la pista de CPU de un perfil del sistema.

Tiempo de CPU total

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

Captura de pantalla de los eventos eglSwapBuffer.
Figura 1: Es el tiempo transcurrido entre dos eventos eglSwapBuffer.


Una captura de pantalla de un evento vkQueuePresentKHR.
Figura 2: Es el tiempo transcurrido entre dos eventos vkQueuePresentKHR.

Esta medición es una estimación del tiempo total de la CPU,pero no representa necesariamente el tiempo activo de la CPU. 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 ocurrir cuando un evento dequeueBuffer, eglSwapBuffer (para OpenGL) o vkQueuePresent (para Vulkan) ocupa una gran parte del tiempo de la CPU. El tiempo de espera se incluye en el tiempo de CPU total, pero no en el tiempo de CPU activo.

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

Tiempo de CPU activo

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

Para medir el tiempo activo de la CPU, consulta las secciones Running justo por encima de los eventos de la CPU. Cuenta todas las partes del seguimiento entre los dos eventos de envío de tramas que están en el estado Running. Asegúrate de incluir subprocesos que funcionen.

Captura de pantalla de dos períodos de tiempo de CPU que se pueden usar para medir el tiempo de CPU activo.
Figura 5: Son 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 ejecución mientras el subproceso principal está inactivo.
Figura 6: Una app con varios subprocesos que tiene otros subprocesos en ejecución mientras el subproceso principal está inactivo.

Otra forma de medir el tiempo de CPU activo es ver los segmentos de la app en los segmentos de CPU. Estas porciones indican cuándo se está ejecutando la CPU y corresponden a las porciones Running.

Una captura de pantalla que muestra el estado de ejecución de un subproceso fijado que coincide con la pista de la CPU.
Figura 7: El estado de ejecución del subproceso fijado coincide con la pista de la CPU.

Para ayudar a identificar los fragmentos de la app, puedes agregar marcadores ATrace a tu app. Esto mostrará los marcadores en la pista de la CPU del Generador de perfiles del sistema.

Captura de pantalla de las secciones de ATrace que se muestran en un segmento de CPU.
Figura 8: Porciones de ATrace que se muestran en una pista de CPU.

Estima los tiempos de fotogramas de la GPU

Para estimar los tiempos de fotogramas de la GPU, puedes usar rebanadas o contadores de GPU en el generador de perfiles del sistema. La estimación es más precisa cuando se usan rebanadas de GPU.

Porciones de GPU

Si el generador de perfiles del sistema tiene información de la porción de GPU disponible, puedes obtener información muy precisa sobre el tiempo 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 la GPU tienen segmentos fragmentados, no fragmentados y, en ocasiones, complementarios no fragmentados. En el caso de los fotogramas menos complejos, el trabajo de fragmento y no fragmento es secuencial, por lo que se puede distinguir el trabajo de un fotograma de otro buscando brechas entre el trabajo activo de la GPU.

Como alternativa, si conoces el trabajo que se envía a la GPU, identificar el patrón de los pases de renderización 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 se ejecutan en secuencia.
Captura de pantalla en la que se hace zoom en el trabajo de un fotograma individual con la AGI.
Figura 10: Acercamiento de un trabajo de un fotograma individual.

En el caso de 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 tienen el mismo submissionID en el panel Selection de cada fragmento.

En el caso de las apps basadas en Vulkan, se pueden usar varios envíos para componer un fotograma. Realiza un seguimiento de los IDs de envío con la pista Vulkan Events, que contiene una porción para cada envío. Si seleccionas una porción de envío, se destacarán todas las porciones 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: Varios eventos de Vulkan seleccionados para una trama.

Dispositivos Adreno

En los dispositivos Adreno, las porciones de GPU aparecen en la pista GPU Queue 0 y siempre se representan de forma secuencial, por lo que puedes ver todas las porciones que representan los pases de renderización de una trama y usarlas para medir los tiempos de fotogramas de la GPU.

Captura de pantalla de varios fotogramas que se ejecutan en secuencia.
Figura 13. Varios fotogramas se ejecutan en secuencia.
Captura de pantalla en la que se acerca la AGI en un fotograma con varios pases de renderización.
Figura 14: Se acercó un fotograma con varios pases de renderización.

Al igual que en el caso de Mali descrito anteriormente, si la app usa Vulkan, el segmento Vulkan Events proporciona información sobre el trabajo que se envía para ejecutar el fotograma. Para destacar los pases de renderización, haz clic en las secciones de Eventos de Vulkan asociadas con la trama.

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

Hay algunas situaciones en las que es más difícil distinguir los límites de fotogramas de la GPU debido a que la app está muy vinculada a la GPU. En estas situaciones, si conoces el trabajo que se envía a la GPU, puedes identificar el patrón con el que se ejecutan los pases de renderización y determinar los límites de fotogramas a partir de esa información.

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

Contadores de GPU

Si la información de la porción de GPU no está disponible en un registro, puedes estimar el tiempo de fotogramas de la GPU con las pistas del contador de GPU.

Dispositivos Mali

En dispositivos Mali, puedes usar el segmento Uso de GPU para estimar el tiempo de fotogramas de la GPU de una app que no es intensiva en 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 actividad alta de forma coherente. Para estimar los tiempos de fotogramas de la GPU con el segmento Utilización de la GPU, mide la duración de los períodos de alta actividad en el segmento.

Captura de pantalla de los segmentos de uso y cola de la GPU en un dispositivo Mali.
Figura 17: Las pistas de uso y cola de GPU en un dispositivo Mali.

Si la app es más intensiva en GPU, el uso de la GPU puede ser muy alto de forma constante. En este caso, puedes usar las pistas de utilización de la cola de fragmentos y utilización de la cola que no es de fragmentos para supervisar la actividad de la GPU y estimar los tiempos de fotogramas de la GPU. Si buscas patrones en las pistas fragmentadas y no fragmentadas, puedes obtener una estimación aproximada de dónde están los límites de un fotograma y usarla para medir el tiempo de fotogramas de la GPU.

Captura de pantalla de segmentos de fragmento y no de fragmento.
Figura 18: Pistas de fragmentos y no fragmentos

Dispositivos Adreno

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

Captura de pantalla del porcentaje de uso de la GPU y las pistas de la cola de la GPU en un dispositivo Adreno.
Figura 19: Porcentaje de uso de la GPU y seguimiento de la cola de GPU en un dispositivo Adreno.

Si la app es más intensiva en GPU y tiene un porcentaje de uso de GPU alto de forma constante, puedes usar las pistas Instrucciones de vértices por segundo y Instrucciones de fragmentos por segundo para estimar los tiempos de fotogramas de la GPU. Si buscas patrones en los niveles de actividad de estos segmentos, puedes obtener una estimación aproximada de dónde están los límites de un fotograma y usarla para medir el tiempo de fotogramas de la GPU.

Una captura de pantalla de las instrucciones de Vertex / Segundo segmento.
Figura 20: La pista Instrucciones de Vertex por segundo.

Estos otros segmentos pueden proporcionar información similar:

  • Vertices sombreados por segundo
  • Fragmentos sombreados por segundo
  • % Time Shading Vertices
  • % Time Shading Fragments