Novedades de productos

Optimizar el rendimiento de Android XR con Unity

Lectura de 6 minutos
Luke Hopkins
Ingeniero de relaciones con desarrolladores de Android

Samsung Galaxy XR ya está aquí con la tecnología de Android XR. Esta entrada de blog forma parte de la semana de Android XR, en la que proporcionamos recursos (entradas de blog, vídeos, código de muestra y más) diseñados para ayudarte a aprender, crear y preparar tus aplicaciones para Android XR.  

Esta semana, Samsung ha lanzado Galaxy XR, creado en colaboración con Google y Qualcomm. Es un momento emocionante para los desarrolladores, y queremos ayudarte a sacar el máximo partido a tu aplicación de RE.

Aunque el bajo rendimiento de los juegos y las aplicaciones en dispositivos que no son de realidad extendida puede frustrar a los usuarios, en el mundo de la realidad extendida, el rendimiento no es solo opcional, sino fundamental para el éxito de tu aplicación. Si no alcanzas el objetivo de la velocidad de fotogramas en la realidad extendida, pueden surgir problemas mucho más graves, como mareos. 

En esta guía, te explicaremos las optimizaciones de rendimiento esenciales que debes conocer para desarrollar aplicaciones Android XR. Descubrirás qué funciones ofrecen las mayores mejoras de rendimiento, cuándo usarlas y cómo funcionan conjuntamente para ayudarte a alcanzar tus objetivos de velocidad de fotogramas.

Esto es lo que queremos conseguir: 

  • Mínimo: 72 fps (parte de nuestras directrices de calidad de reproducción)
  • Opcional: 90 fps con un presupuesto de 11 ms por fotograma

Para obtener más información sobre por qué es importante mantener una frecuencia de fotogramas tan alta, consulta nuestras directrices de rendimiento.   

Funciones de rendimiento específicas de RE

Vamos a empezar hablando de dos funciones de rendimiento específicas de la realidad mixta: el renderizado foveal y el submuestreo de Vulkan. 

Renderizado foveal

El renderizado foveal es una optimización que tiene dos modos. El primero es un modo estático que renderiza el centro de la pantalla con una resolución más alta y reduce progresivamente la resolución cuanto más lejos mires.

El segundo es el modo de seguimiento ocular, que renderiza con todo detalle la zona en la que estás mirando y reduce la calidad de lo que se muestra en tu visión periférica. Imita esencialmente el funcionamiento de la visión humana, en la que solo vemos detalles precisos en el área específica en la que nos estamos centrando.

El renderizado foveal reduce significativamente la carga de trabajo de la GPU sin sacrificar la calidad de imagen percibida por el usuario. Lo bueno del renderizado foveal es que los usuarios no notarán la reducción de la calidad en su visión periférica, pero tu GPU sí notará la mejora del rendimiento.

Imagina que estás creando una experiencia de museo con objetos en 3D complejos. Sin el renderizado foveal, te costaría mantener 90 fps al intentar renderizar todo el campo de visión. Con el renderizado foveal, puedes mantener esos detalles de alta poligonización en la zona en la que mira el usuario, pero el entorno de fondo se renderiza con una calidad inferior. Tus usuarios no notarán la diferencia, pero tendrás margen para añadir más detalles a la escena.

Submuestreo de Vulkan

El submuestreo de Vulkan es el mejor aliado del renderizado foveal. Mientras que el renderizado foveal decide qué renderizar en diferentes niveles de calidad, el submuestreo de Vulkan gestiona cómo renderizar de forma eficiente los diferentes niveles de calidad mediante mapas de densidad de fragmentos.

Si se combina con el renderizado foveal, el submuestreo de Vulkan te ofrece 0,5 ms de rendimiento adicionales. También ayuda a suavizar los bordes irregulares de la visión periférica, lo que hace que la imagen general se vea más nítida.

Por ejemplo, en un juego de simulador de vuelo en el que los usuarios se centran en los instrumentos y los controles, al combinar el renderizado foveal con el submuestreo de Vulkan, los controles detallados se renderizan con nitidez, pero la estructura periférica de la cabina utiliza menos recursos. Esos 0,5 ms adicionales no parecen mucho, pero marcan la diferencia entre tener espacio para un elemento interactivo más o perder fotogramas en los momentos más intensos.

Funciones de GPU para escenas complejas

Además del renderizado foveal y el submuestreo de Vulkan, hay algunas funciones de la GPU que reducen la carga innecesaria mediante la creación de instancias y la eliminación inteligentes. Son especialmente eficaces en escenas complejas con geometría repetida u oclusión significativa.

Cajón residente de GPU

El cajón residente de la GPU usa automáticamente la creación de instancias de la GPU para reducir las llamadas de dibujo y liberar tiempo de procesamiento de la CPU. De esta forma, en lugar de que la CPU le informe a la GPU sobre cada objeto por separado, la GPU agrupa los objetos similares.

Esta función es más eficaz en escenas grandes con mallas repetidas, como árboles en un bosque, muebles en un edificio de oficinas o accesorios dispersos por un entorno.

Imagina una escena de un bosque con 200 árboles que usen la misma malla base. Sin el cajón residente de la GPU, tienes 200 llamadas de dibujo que consumen la GPU, lo que libera la CPU. Si habilitas esta función, la GPU creará instancias de esos árboles de forma inteligente, lo que debería reducir el número de llamadas de dibujo a entre 5 y 10. Esto supone un ahorro enorme de la GPU que puedes invertir en la lógica del juego o en cálculos de física.

Oclusión de GPU

Oclusión de la GPU usa la GPU en lugar de la CPU para identificar y omitir la renderización de objetos ocultos. Detecta automáticamente lo que está oculto detrás de otros objetos, por lo que no desperdicias la GPU en elementos que el usuario no puede ver.

Esta función es especialmente útil en espacios interiores con varias habitaciones, entornos densos o escenas arquitectónicas en las que las paredes, los suelos y los objetos bloquean la vista de forma natural.

Por ejemplo, supongamos que estás creando una experiencia para una casa con varias habitaciones. Si el usuario está en el salón, ¿por qué malgastar ciclos de GPU renderizando la cocina con todo detalle si está completamente oculta tras una pared? GPU Occlusion Culling omite automáticamente el renderizado de los objetos ocultos, lo que te permite disponer de más límites de rendimiento para lo que realmente se ve.

Monitorizar el rendimiento

No basta con usar estas funciones. También debe medir sus optimizaciones para cuantificar su impacto y verificar que los cambios funcionan.

API de métricas de rendimiento

La API Metrics de rendimiento proporciona una monitorización en tiempo real del uso de memoria, el rendimiento de la CPU y el rendimiento de la GPU de tus aplicaciones. Proporciona datos completos de las capas de compositor y de tiempo de ejecución, por lo que puedes ver exactamente lo que ocurre en tu aplicación.

Establece una base antes de hacer los cambios, aplica una optimización, mide el impacto y repite el proceso. Con este enfoque basado en datos, sabes que estás mejorando el rendimiento en lugar de hacer conjeturas.

Antes de habilitar el renderizado foveal, el tiempo entre fotogramas de tu GPU puede ser de 13 ms, lo que supera el presupuesto de 11 ms. Habilita el renderizado foveal, vuelve a medir y, con suerte, verás que se reduce a 9 ms. De esta forma, tendrás 4 ms más para añadir detalles a la escena, mejorar la calidad visual en otros lugares o, simplemente, disfrutar de un rendimiento más fluido en una gama más amplia de contenido.

Si no tienes estas métricas, no podrás optimizar tus campañas. La API Performance Metrics te indica qué es lo que realmente te ayuda en tu caso práctico específico.

Depurador de fotogramas

El depurador de fotogramas es la herramienta integrada de Unity que te permite saber exactamente cómo se renderiza tu escena, fotograma a fotograma. Muestra la secuencia de llamadas de dibujo y te permite desplazarte por ellas para verificar que las optimizaciones funcionan correctamente.

¿Quieres confirmar que el creador de lotes de SRP funciona? Busca entradas "RenderLoopNewBatcher" en el depurador de fotogramas. ¿Compruebas si el cajón residente de la GPU está agrupando correctamente? Busca las entradas "Hybrid Batch Group" (Grupo de procesamiento por lotes híbrido). Estas confirmaciones visuales te ayudan a saber si tus ajustes de optimización están dando resultados.

Recorre las primeras 50 llamadas de dibujo de tu escena. Si ves que los objetos similares se dibujan individualmente en lugar de en lotes, significa que la creación de instancias o el procesamiento por lotes no funcionan correctamente. El depurador de marcos hace que estos problemas sean visibles de inmediato para que puedas solucionarlos.

Optimizaciones adicionales

Además de las optimizaciones que hemos comentado anteriormente, nuestra guía completa de rendimiento también incluye otras optimizaciones adicionales. Aquí tienes un breve resumen:

  • Ajustes de URP: inhabilita HDR y Post-processing para XR móvil. Estas funciones tienen un impacto visual mínimo en comparación con el coste de rendimiento en el hardware móvil, por lo que obtendrás mejoras de rendimiento medibles con diferencias visuales apenas perceptibles.
  • Batcher de SRP: reduce la sobrecarga de la CPU en escenas con muchos materiales que usan la misma variante de sombreador. Si minimizas los cambios de estado de renderización entre las llamadas de dibujo, puedes reducir significativamente el tiempo de CPU dedicado a la renderización.
  • Frecuencia de actualización de la pantalla: se ajusta dinámicamente entre 72 y 90 fps en función de la complejidad de la escena. Reduce la velocidad de fotogramas durante las secuencias complejas para mantener la estabilidad y, a continuación, auméntala durante los momentos más sencillos para disfrutar de una interacción ultrasuave.
  • Texturas opacas o de profundidad: inhabilita estas opciones a menos que sean necesarias para los efectos de sombreado. Provocan operaciones de copia de GPU innecesarias que desperdician rendimiento sin aportar ninguna ventaja a la mayoría de las aplicaciones.
  • Escala de renderizado de URP: este ajuste te permite renderizar a una resolución reducida para mejorar el rendimiento o aumentar la resolución para mejorar la calidad visual.

Para obtener instrucciones detalladas sobre estas y otras optimizaciones, consulta nuestra guía completa de rendimiento de Unity para Android XR.

Conclusión

El rendimiento de tu aplicación de RA no es solo una casilla técnica. Es la diferencia entre una experiencia cómoda y atractiva y una que hace que los usuarios se sientan mal o incómodos. Las optimizaciones que hemos tratado son tu conjunto de herramientas para alcanzar esos objetivos de frecuencia de fotogramas críticos en los dispositivos de realidad extendida más recientes.

Esta es tu hoja de ruta:

  1. Empieza con el renderizado foveal y el submuestreo de Vulkan. Estas funciones específicas de la realidad mixta permiten ahorrar recursos de GPU de forma inmediata y notable.
  2. Añade GPU Resident Drawer y Occlusion Culling si tienes escenas complejas con geometría repetida o espacios interiores.
  3. Monitoriza todo con la API Métricas de rendimiento para asegurarte de que los cambios son realmente útiles
  4. Descubre optimizaciones adicionales de URP para obtener más margen de rendimiento

Es fundamental medir continuamente y hacer iteraciones. No todas las optimizaciones beneficiarán a todos los proyectos por igual, así que usa la API Metrics de rendimiento para hacerte una idea clara de lo que realmente te ayuda en tu caso de uso específico.

Próximos pasos: ampliar tus habilidades

¿Todo listo para entrar en detalles? Consulta los siguientes recursos:

  • Guía de rendimiento de Unity para Android XR: instrucciones de implementación paso a paso para todas las funciones que se describen aquí.
  • Empezar a usar Unity y Android XR: configura tu entorno de desarrollo y empieza a crear.
  • Documentación para desarrolladores de Android XR: guías completas sobre todas las funciones de Android XR
Escrito por:

Seguir leyendo