The Android Developer Challenge is back! Submit your idea before December 2.

Cómo inspeccionar la velocidad de procesamiento y la superposición de la GPU

Android incluye algunas opciones para desarrolladores en el dispositivo que te ayudan a visualizar los casos en que tu app podría experimentar dificultades para representar su IU; por ejemplo, un trabajo de procesamiento que es mayor de lo que se necesita o la ejecución de operaciones extensas de subprocesos y GPU. En esta página, se describe la manera de depurar la superposición de la GPU y generar perfiles para su procesamiento.

Si deseas obtener más información sobre las opciones para desarrolladores en el dispositivo, incluida la forma de habilitarlas, consulta Cómo configurar opciones para desarrolladores en el dispositivo.

Velocidad de procesamiento de Profile GPU

La herramienta Profile GPU Rendering muestra, en forma de histograma de desplazamiento, una representación visual del tiempo necesario para procesar los marcos de una ventana de IU en relación con una comparativa de 16 ms por marco.

En las GPU menos potentes, la tasa de relleno disponible (la velocidad a la que la GPU puede rellenar el búfer de marcos) puede ser bastante baja. A medida que aumenta la cantidad de píxeles requeridos para dibujar un marco, la GPU puede tardar más en procesar comandos nuevos y solicitar tiempos de espera al resto del sistema hasta ordenarse. La herramienta de generación de perfiles te ayuda a detectar los casos en que el rendimiento de la GPU se ve afectado cuando intenta dibujar píxeles o sobrecargado debido a una superposición voluminosa.

Cómo habilitar el generador de perfiles

Antes de comenzar, asegúrate de usar un dispositivo que ejecute Android 4.1 (nivel de API 16) o una versión posterior, y de habilitar las opciones para desarrolladores. A fin de iniciar la generación de perfiles para el procesamiento de la GPU del dispositivo mientras se usa tu app, haz lo siguiente:

  1. En tu dispositivo, dirígete a Configuración y presiona Opciones para desarrolladores.
  2. En la sección Supervisión, selecciona Represent. GPU del perfil.
  3. En el diálogo de Profile GPU Rendering, elige En pantalla como barras para superponer los gráficos en la pantalla de tu dispositivo.
  4. Abre la app para la que desees generar perfiles.

Cómo inspeccionar el resultado

En la imagen ampliada del gráfico de Profile GPU Rendering que se muestra en la figura 1, puedes ver la sección de color, como se ve en Android 6.0 (nivel de API 23).

Figura 1: Gráfico ampliado de Profile GPU Rendering

A continuación, se muestran algunos aspectos que debes tener en cuenta sobre el resultado:

  • Para cada aplicación visible, la herramienta muestra un gráfico.
  • Cada barra vertical del eje horizontal representa un marco y la altura de cada una representa la cantidad de tiempo (en milisegundos) que tardó en procesarse.
  • La línea verde horizontal representa 16 milisegundos. Para alcanzar los 60 marcos por segundo, la barra vertical de cada marco debe permanecer debajo de esa línea. Cada vez que la sobrepasa una barra, aumentan las posibilidades de que haya pausas en las animaciones.
  • La herramienta destaca los marcos que exceden el umbral de 16 milisegundos haciendo más ancha y menos transparente la barra correspondiente.
  • Cada barra tiene componentes de colores que corresponden a una etapa de la canalización de procesamiento. La cantidad de componentes varía según el nivel de API del dispositivo.

En la siguiente tabla, se proporcionan descripciones de cada segmento de una barra vertical en el resultado del generador de perfiles cuando se usa un dispositivo con Android 6.0 o una versión posterior.

Componente de barraEtapa de procesamientoDescripción
Intercambio de búferes Representa el tiempo que la CPU espera para que la GPU termine su trabajo. Si se alarga la barra, significa que el procesamiento de la app en la GPU es demasiado intensivo.
Emisión de comandos Representa el tiempo que el procesador 2D de Android tarda en enviar comandos a OpenGL para dibujar y volver a dibujar las listas de visualización. El largo de esta barra es directamente proporcional a la suma del tiempo que cada lista de visualización tarda en ejecutarse (una mayor cantidad de listas de visualización equivale a una barra roja más larga).
Sincronización y carga Representa el tiempo que tarda en subirse la información del mapa de bits a la GPU. Un segmento grande indica que la app está tardando bastante en cargar grandes cantidades de gráficos.
Dibujo Representa el tiempo utilizado para crear y actualizar las listas de visualización de la vista. Si esta parte de la barra es larga, es posible que se dibujen muchas vistas personalizadas o que el procesamiento en métodos onDraw sea muy intensivo.
Medición/diseño Representa la cantidad de tiempo empleado en las devoluciones de llamada onLayout y onMeasure en la jerarquía de vistas. Un segmento largo indica que la jerarquía de vistas está tardando bastante en procesarse.
Animación Representa el tiempo que tomó evaluar todos los animadores que ejecutaban el fotograma en cuestión. Si este segmento es largo, tu app podría estar usando un animador personalizado que no tenga un buen rendimiento o podrían ejecutarse tareas no intencionales como resultado de la actualización de propiedades.
Manejo de entrada Representa el tiempo que la app tardó en ejecutar código dentro de la devolución de llamada de un evento de entrada. Si este segmento es largo, indica que la app tarda mucho tiempo en procesar la entrada del usuario. Considera descargar este procesamiento a un subproceso diferente.
Retraso de sincronización vertical/tiempo misceláneo Representa el tiempo que la app tarda en ejecutar operaciones entre dos fotogramas consecutivos. Podría ser un indicador de que existe demasiado procesamiento en el subproceso de IU, que podría descargarse en un subproceso diferente.

Tabla 1: Barras de componentes en Android 6.0 y versiones posteriores

Entre las versiones 4.0 (nivel de API 14) y 5.0 (nivel de API 21) de Android, los segmentos son azules, púrpuras, rojos y naranjas. En las versiones de Android anteriores a la 4.0, los componentes son azules, rojos y naranjas. En la siguiente tabla, se muestran las barras de componentes de Android 4.0 y 5.0.

Componente de barraEtapa de procesamientoDescripción
Procesamiento Representa el tiempo que la CPU espera para que la GPU termine su trabajo. Si se alarga la barra, significa que el procesamiento de la app en la GPU es demasiado intensivo.
Ejecución Representa el tiempo que el procesador 2D de Android tarda en enviar comandos a OpenGL para dibujar y volver a dibujar las listas de visualización. El largo de esta barra es directamente proporcional a la suma del tiempo que cada lista de visualización tarda en ejecutarse (una mayor cantidad de listas de visualización equivale a una barra roja más larga).
Transferencia Representa el tiempo que tarda en subirse la información del mapa de bits a la GPU. Un segmento grande indica que la app está tardando bastante en cargar grandes cantidades de gráficos. Este segmento no puede verse en dispositivos que ejecutan Android 4.0 o versiones anteriores.
Actualización Representa el tiempo utilizado para crear y actualizar las listas de visualización de la vista. Si esta parte de la barra es larga, es posible que se dibujen muchas vistas personalizadas o que el procesamiento en métodos onDraw sea muy intensivo.

Tabla 2: Barras de componentes en Android 4.0 y 5.0

Para obtener más información sobre cómo interpretar los datos provistos por la herramienta de generación de perfiles, lee Cómo realizar análisis con Profile GPU Rendering.

Nota: Si bien esta herramienta se denomina Profile GPU Rendering, todos los procesos supervisados se producen en la CPU. El procesamiento se realiza enviando comandos a la GPU, que esta procesa en la pantalla de forma asíncrona. En algunas situaciones, es posible que la GPU tenga demasiado trabajo y que la CPU deba esperar para poder enviar comandos nuevos. Cuando esto ocurra, verás picos en las barras naranja y roja, y se bloqueará el envío de comandos hasta que haya disponible más espacio en la cola de comandos de la GPU.

Cómo visualizar la superposición de la GPU

Otra función de las opciones para desarrolladores te ayuda a identificar superposiciones mediante la codificación por color de la IU. La superposición se produce cuando tu app dibuja el mismo píxel más de una vez dentro del mismo marco. Por lo tanto, en esta visualización, se muestran los puntos en que tu app podría realizar más trabajo de procesamiento de lo que se necesita, lo cual puede ser un problema de rendimiento debido al esfuerzo adicional de la GPU para representar píxeles que no podrá ver el usuario. Por lo tanto, debes corregir los eventos de superposición siempre que sea posible.

Si todavía no lo hiciste, habilita las opciones para desarrolladores. Luego, para visualizar la superposición en tu dispositivo, haz lo siguiente:

  1. En tu dispositivo, dirígete a Configuración y presiona Opciones para desarrolladores.
  2. Desplázate hacia abajo hasta la sección Procesamiento acelerado mediante hardware y selecciona Depurar superpos. de GPU.
  3. En el diálogo Depurar superpos. de GPU, selecciona Mostrar áreas superpuestas.

Android da color a los elementos de la IU para identificar el nivel de superposición de la siguiente manera:

  • Color verdadero: Sin superposición
  • Azul: Superpuesto 1 vez
  • Verde: Superpuesto 2 veces
  • Rosa: Superpuesto 3 veces
  • Rojo: Superpuesto 4 o más veces

Figura 2: App tal como se ve normalmente (izquierda) y tal como aparece con la superposición de GPU habilitada (derecha)

Ten en cuenta que estos colores son semitransparentes, por lo que el color exacto que veas en la pantalla dependerá del contenido de la IU.

Ahora que puedes reconocer los puntos en que se produce la superposición en tu diseño, lee información sobre cómo reducir la superposición.

Recuerda que es inevitable que exista cierta superposición. A medida que ajustes la interfaz de usuario de tu app, intenta lograr una visualización que muestre en su mayoría colores reales o solo una superposición de 1X (azul).

Figura 3: Ejemplos de una app con varias superposiciones (izquierda) y otra con muchas menos (derecha)