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 encontrar 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 la latencia de fotogramas.

Tiempos de CPU

En AGI, puedes ver las latencias de fotogramas de CPU totales y activas en el seguimiento de CPU de un perfil del sistema.

Tiempo de CPU total

Para medir el tiempo de CPU total empleado, selecciona el intervalo de tiempo 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 varios eventos de eglSwapBuffer.
Figura 1. Varios eventos eglSwapBuffer


Captura de pantalla de un evento vkQueuePresentKHR.
Figura 2: Un evento vkQueuePresentKHR.

Esta medición es una estimación del tiempo de CPU total,pero no representa necesariamente 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 la CPU. El tiempo de espera se incluye en el tiempo de CPU total, pero no en el tiempo de CPU activo.

Captura de pantalla que muestra una gran cantidad de elementos inactivos durante los eventos dequeueBuffer y eglSwapBuffer.
Figura 3: Una gran cantidad de estado de inactividad 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 estado inactivo.

Para medir el tiempo de CPU activo, consulta las porciones Running justo encima de los eventos de CPU. Cuenta todas las partes del seguimiento entre los dos eventos de envío de marcos que tienen el estado En ejecución. Asegúrate de incluir subprocesos en funcionamiento.

Una 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 un subproceso en funcionamiento mientras el subproceso principal está inactivo.
Figura 6: Una app con varios subprocesos que tiene un subproceso en funcionamiento mientras el subproceso principal está inactivo

Otra forma de medir el tiempo de CPU activo es ver las porciones de la app en los segmentos de CPU. Estos segmentos se indican cuando la CPU está en ejecución y se corresponden con los segmentos Running.

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

Para ayudar a identificar porciones de app, puedes agregar marcadores ATrace a tu app. De esta manera, se mostrarán los marcadores en el seguimiento de CPU del Generador de perfiles del sistema.

Captura de pantalla de un marcador de ATrace en un seguimiento de CPU.
Figura 8: Un marcador de ATrace en un seguimiento de CPU

Estima la latencia de fotogramas de GPU

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

Porciones de GPU

Si el Generador de perfiles del sistema tiene información de porciones de GPU disponible, puedes obtener información muy precisa de la latencia de fotogramas de la GPU si mides la cantidad total de tiempo que tu app pasa trabajando en tareas asociadas con un solo fotograma.

Dispositivos Malí

En los dispositivos Malí, las porciones de GPU tienen segmentos de fragmentos, no fragmentos y, en ocasiones, no fragmentos complementarios. En el caso de marcos menos complejos, el trabajo de un fragmento y el que no lo son es secuencial, por lo que se puede distinguir el trabajo de un fotograma del 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 renderización enviados proporciona información sobre cuándo comienza y finaliza un fotograma.

Captura de pantalla de varios fotogramas que se ejecutan en secuencia.
Figura 9: Ejecución de múltiples tramas en secuencia.
Captura de pantalla en la que AGI se acerca al trabajo de un fotograma individual.
Figura 10: Acercarse al trabajo de un fotograma individual

En el caso de las apps que tienen un flujo de trabajo de GPU más paralelizado, puedes obtener la latencia de fotogramas de la GPU buscando todos los fotogramas que tengan el mismo submissionID en el panel Selection para cada porción.

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 el segmento de eventos de Vulkan, 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 GPU que correspondan al envío.

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


Captura de pantalla de varios eventos de Vulkan para un fotograma seleccionado.
Figura 12: Varios eventos de Vulkan para un fotograma seleccionado

Dispositivos Adreno

En los dispositivos Adreno, los segmentos de GPU aparecen en el segmento de la cola de GPU 0 y siempre se representan de forma secuencial, de modo que puedes ver todas las porciones que representan los pases de renderización de un fotograma y usarlas para medir los tiempos de procesamiento de la GPU.

Captura de pantalla de varios fotogramas que se ejecutan en secuencia.
Figura 13. Ejecución de múltiples tramas en secuencia.
Captura de pantalla en la que AGI se acerca a un fotograma con varios pases de renderización.
Figura 14: Acercamiento en un marco con varios pases de renderización

Es similar a la situación de Mali descrita anteriormente: si la app usa Vulkan, el segmento de eventos de Vulkan 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 porciones de Vulkan Events que están asociadas con el fotograma.

Captura de pantalla de una app basada en Vulkan con eventos de Vulkan para un fotograma seleccionado
Figura 15: Una app basada en Vulkan con eventos de Vulkan para un fotograma seleccionado

Hay algunas situaciones en las 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 estas situaciones, 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 renderización y determinar los límites de fotogramas a partir de esa información.

Captura de pantalla de una app altamente 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 altamente vinculada a la GPU con un patrón de pase de renderización que ayuda a identificar los límites de los marcos.

Contadores de GPU

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

Dispositivos Malí

En los dispositivos Mali, puedes usar el segmento Uso de GPU para estimar la latencia de fotogramas de una app que no requiere mucha GPU. Cuando las apps usan menos GPU, tienen períodos regulares de actividad de GPU alta y baja, en lugar de una actividad constante y alta. Para estimar la latencia de fotogramas de la GPU con el segmento de uso de GPU, mide la duración de los períodos de actividad alta en el segmento.

Captura de pantalla del uso de GPU y de la cola de GPU en un dispositivo Mali.
Figura 17: El uso de GPU y la cola de GPU hacen un seguimiento en un dispositivo Mali.

Si la app requiere más GPU, puedes usar los segmentos de fragmentos y no fragmentos para estimar la latencia de fotogramas de la GPU. Cuando buscas patrones en los niveles de actividad de los segmentos fragmentos y no fragmentos, puedes obtener una estimación aproximada de dónde se encuentran los límites de un fotograma y usarlo para medir la latencia de fotogramas de la GPU.

Captura de pantalla de pistas fragmentos y no fragmentos.
Figura 18: Pistas Fragment y no fragmentos

Dispositivos Adreno

En los dispositivos Adreno, si la app no requiere mucha GPU, puedes estimar los tiempos de fotogramas de GPU de la misma manera que lo haces con los dispositivos Malí de la sección anterior.

Captura de pantalla del uso de GPU y de la cola de GPU en un dispositivo Adreno.
Figura 19: El uso de GPU y la cola de GPU en un dispositivo Adreno

Si la app requiere más GPU, puedes usar los segmentos Instrucciones de Vertex por segundo y Instrucciones por segundo para fragmentos a fin de estimar la latencia de fotogramas de la GPU. Al buscar patrones en los niveles de actividad de estos segmentos, puedes obtener una estimación aproximada de dónde se encuentran los límites de un fotograma y usar esa información para medir la latencia de fotogramas de la GPU.

Captura de pantalla de las instrucciones de Vertex o la segunda pista.
Figura 20: Instrucciones de Vertex / Segunda pista.

Estas otras ramas pueden proporcionar información similar:

  • Vértices sombreados / segundo
  • Fragmentos con sombreado / segundo
  • Porcentaje de vértices de sombreado de tiempo
  • Porcentaje de fragmentos de tiempo