Ya está disponible la segunda Vista previa para desarrolladores de Android 11; pruébala y comparte tus comentarios.

Reduce la superposición

Una app puede generar el mismo píxel más de una vez dentro de un único marco; este evento se denomina superposición. En general, la superposición es innecesaria y es mejor eliminarla. Se manifiesta como un problema de rendimiento, ya que se pierde tiempo de la GPU para procesar píxeles que no contribuyen a lo que el usuario ve en la pantalla.

En este documento, se explica la superposición: qué es, cómo diagnosticarla y las acciones que puedes realizar para eliminarla o mitigarla.

Acerca de la superposición

La superposición tiene lugar cuando el sistema genera un píxel en la pantalla varias veces en un solo marco de procesamiento. Por ejemplo, si tenemos varias tarjetas de IU apiladas, cada tarjeta oculta una parte de la que está debajo.

Sin embargo, el sistema aún necesita generar incluso las partes ocultas de las cartas de la pila. Esto se debe a que las tarjetas apiladas se procesan según el algoritmo de Painter, es decir, de atrás hacia adelante. Esta secuencia de procesamiento permite que el sistema aplique una combinación de Alfa adecuada para los objetos translúcidos, como sombras.

Nota: La superposición ya no es un problema tan importante como lo era cuando la analizamos en las sesiones de rendimiento de Google I/O y en los videos de los patrones de rendimiento. Esto se debe a que el rendimiento de la GPU de los dispositivos de gama baja ha seguido aumentando, mientras que sus pantallas se estabilizaron en resoluciones relativamente bajas. A menos que la app se optimice para un dispositivo GPU conocido de bajo rendimiento, se recomienda concentrarse en la optimización del trabajo de subprocesos de la IU con el fin de garantizar un rendimiento uniforme de la app. Además, las optimizaciones del SO evitan la superposición dentro de la app en muchos casos (por ejemplo, un fondo de fragmento que se superpone sobre el fondo de la ventana).

Cómo encontrar problemas de superposición

La plataforma ofrece las siguientes herramientas para ayudarte a determinar si la superposición afecta el rendimiento de tu app.

Herramienta de depuración de superposiciones de la GPU

La herramienta de depuración de superposiciones de la GPU usa la codificación de colores con el fin de mostrar la cantidad de veces que tu app genera cada píxel en la pantalla. Cuanto más alto sea este número, más probable será que la superposición afecte el rendimiento de tu app.

Para obtener más información, consulta Cómo visualizar las superposiciones de la GPU.

Herramienta de procesamiento de perfiles de la GPU

La herramienta de procesamiento de perfiles de la GPU muestra, en forma de histograma de desplazamiento, el tiempo que tarda cada etapa de la canalización de procesamiento en mostrar un solo cuadro. La parte del proceso de cada barra, que se indica en naranja, muestra cuándo el sistema está intercambiando búferes, y esta métrica proporciona pistas importantes sobre la superposición.

En las GPU con menor rendimiento, es posible que la tasa de relleno disponible (la velocidad a la que la GPU puede rellenar el búfer de marcos) sea 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 barra de procesos muestra que este aumento se produce cuando la GPU se satura en el intento de generar píxeles lo más rápido posible. Hay otros problemas, además de la cantidad elevada de píxeles, que pueden causar el aumento de esta métrica. Por ejemplo, si la herramienta de depuración de superposiciones de la GPU muestra una gran cantidad de superposiciones y picos de procesos, es probable que se deba a un problema de superposición.

Para obtener más información, consulta Cómo crear un perfil de velocidad de procesamiento de la GPU.

Nota: La herramienta de procesamiento de perfiles de la GPU no funciona con apps que usan el NDK. Esto se debe a que el sistema envía mensajes del marco de trabajo al segundo plano cada vez que OpenGL toma un contexto de pantalla completa. En esos casos, probablemente te resulte útil usar una herramienta de generación de perfiles que provea el fabricante de la GPU.

Cómo corregir la superposición

Existen varias estrategias que puedes seguir para reducir o eliminar las superposiciones:

  • Elimina los fondos innecesarios en los diseños.
  • Acopla la jerarquía de vistas.
  • Reduce la transparencia.

En esta sección, se proporciona información sobre cada uno de estos enfoques.

Quita los fondos innecesarios en los diseños

De forma predeterminada, un diseño no tiene fondo, lo que significa que no procesa nada por sí mismo. Sin embargo, cuando los diseños tienen fondos, pueden contribuir a la superposición.

La eliminación de fondos innecesarios es una manera rápida de mejorar el rendimiento del procesamiento. Es posible que los fondos innecesarios no sean visibles porque están completamente cubiertos por todo lo demás que la app genera sobre esa vista. Por ejemplo, el sistema puede cubrir completamente el fondo principal cuando genera vistas secundarias sobre él.

Para detectar porqué hay superposiciones, recorre la jerarquía en la herramienta Inspector de diseños. Mientras lo haces, busca los fondos que puedes eliminar porque ya no son visibles para el usuario. Los casos en que muchos contenedores comparten un color de fondo común ofrecen otra oportunidad para eliminar fondos innecesarios: puedes establecer el fondo de la ventana en el color de fondo principal de tu app y dejar todos los contenedores por encima sin valores de fondo definidos.

Acopla la jerarquía de vista

Los diseños modernos facilitan el apilamiento y las vistas en capas para producir diseños atractivos. Sin embargo, esto puede disminuir el rendimiento generando superposiciones, en especial, en situaciones en las que cada objeto de vista apilado es opaco y requiere que se generen píxeles visibles y no visibles en la pantalla.

Si encuentras este tipo de problema, es posible que puedas mejorar el rendimiento si optimizas la jerarquía de vistas con el fin de reducir la cantidad de objetos de la IU superpuestos. Para obtener más información sobre cómo lograr esto, consulta Cómo optimizar jerarquías de vistas.

Reduce la transparencia

El procesamiento de píxeles transparentes en la pantalla, conocido como procesamiento Alfa, es un factor clave en las superposiciones. A diferencia de la superposición estándar, donde el sistema oculta completamente los píxeles existentes generando píxeles opacos por encima de ellos, los objetos transparentes requieren que los píxeles existentes se generen primero, para que pueda producirse la ecuación de combinación correcta. Los efectos visuales, como las animaciones transparentes, los fundidos difuminados y las sombras, implican algún tipo de transparencia y, por lo tanto, pueden contribuir considerablemente a las superposiciones. Para mejorar las superposiciones en estas situaciones, reduce la cantidad de objetos transparentes que procesas. Por ejemplo, puedes obtener texto gris si generas texto negro en una TextView con un valor de Alfa translúcido. Sin embargo, puedes obtener el mismo efecto con un rendimiento superior si tan solo generas el texto en gris.

Para obtener más información acerca de los costos de rendimiento que la transparencia impone a lo largo de toda la canalización, consulta el video Costos ocultos de la transparencia.