¿Qué estás buscando?
Hero background image
Animate with Unity
Optimización del rendimiento para gráficos de gama alta en PC y consola

Este es el segundo de una serie de artículos que desgrana consejos de optimización para tus proyectos Unity. Utilízalos como guía para correr a mayor velocidad de fotogramas con menos recursos. Una vez que hayas probado estas buenas prácticas, no dejes de consultar las demás páginas de la serie:

Las herramientas gráficas de Unity te permiten crear gráficos optimizados en cualquier estilo y en una amplia gama de plataformas, desde móviles hasta consolas de gama alta y sobremesa. Este proceso suele depender de tu dirección artística y de tu pipeline de render, así que antes de empezar, te recomendamos que revises los pipelines de render disponibles.

UNA ILUSTRACIÓN DE CÓMO FUNCIONA EL FORWARD RENDERING
UNA ILUSTRACIÓN DE CÓMO FUNCIONA EL FORWARD RENDERING
Renderizado hacia delante

A la hora de elegir un canal de renderizado, ten en cuenta estas consideraciones. Además de elegir una canalización, tendrás que seleccionar una ruta de renderizado.

La ruta de renderizado representa una serie específica de operaciones relacionadas con la iluminación y el sombreado. La decisión sobre la ruta de renderizado depende de las necesidades y del hardware de destino de su aplicación.

Trayectoria de renderizado hacia delante

El renderizado hacia delante se utiliza tanto en el Canal de renderizado universal (URP) como en el Canal de renderizado integrado. En el renderizado Forward, la tarjeta gráfica proyecta la geometría y la divide en vértices. Estos vértices se descomponen a su vez en fragmentos, o píxeles, que se renderizan en la pantalla, creando la imagen final.

La canalización pasa cada objeto, de uno en uno, a la API gráfica. El renderizado hacia delante tiene un coste por cada luz, por lo que cuantas más luces haya en tu escena, más tardará el renderizado.

El Forward Renderer del Built-in Pipeline dibuja cada luz en una pasada separada por objeto. Si múltiples luces golpean el mismo GameObject, esto puede crear un sobredibujo significativo donde las áreas superpuestas necesitan dibujar el mismo pixel más de una vez. Para reducir la sobrecarga, minimiza el número de luces en tiempo real.

En lugar de renderizar una pasada por luz, el URP selecciona las luces por objeto. Esto permite que la iluminación se calcule en una sola pasada, lo que resulta en menos llamadas de dibujo en comparación con el Renderizador Forward del Built-In Render Pipeline.

UNA ILUSTRACIÓN DE CÓMO FUNCIONA LA RUTA DE RENDERIZADO DE SOMBREADO DIFERIDO
UNA ILUSTRACIÓN DE CÓMO FUNCIONA LA RUTA DE RENDERIZADO DE SOMBREADO DIFERIDO
Renderizado diferido

El Built-in Render Pipeline, el URP y el High Definition Render Pipeline (HDRP) también utilizan la ruta de renderizado Deferred Shading. En el sombreado diferido, la iluminación no se calcula por objeto.

En cambio, el sombreado diferido pospone el renderizado pesado, como la iluminación, a una fase posterior y utiliza dos pasadas. En la primera pasada, también llamada G-buffer Unity renderiza los GameObjects. Este paso recupera varios tipos de propiedades geométricas y las almacena en un conjunto de texturas.

Las texturas del búfer G pueden incluir:

- Colores difuso y especular

- Suavidad de la superficie

- Oclusión

- Normales del Espacio Mundial

- Emisión + ambiente + reflejos + mapas de luz

En la segunda pasada, o pasada de iluminación, Unity renderiza la iluminación de la escena basándose en el G-buffer. Imagina iterar sobre cada píxel y calcular la información de iluminación basándote en el buffer en lugar de en los objetos individuales. La adición de más luces no emisoras de sombras en el sombreado diferido no tiene el mismo impacto en el rendimiento que con el renderizado directo.

Aunque elegir una ruta de renderizado no es exactamente una optimización en sí, puede afectar a la forma de optimizar el proyecto. Las demás técnicas y flujos de trabajo de esta sección varían en función del canal de renderizado y la ruta que elijas.

UNA INTERFAZ VISUAL BASADA EN NODOS PARA CONSTRUIR SOMBREADORES EN SHADER GRAPH
UNA INTERFAZ VISUAL BASADA EN NODOS PARA CONSTRUIR SOMBREADORES EN SHADER GRAPH
Gráficos de sombreado

Tanto HDRP como URP admiten Shader Graph, una interfaz visual basada en nodos para la creación de sombreadores. Permite a los usuarios sin experiencia en programación de sombreadores crear efectos de sombreado complejos.

Más de 150 nodos están actualmente disponibles en Shader Graph. Además, puede crear sus propios nodos personalizados con la API.

Cada sombreador de un gráfico de sombreado comienza con un nodo maestro, que determina la salida del gráfico. Construye la lógica del sombreador añadiendo y conectando nodos y operadores dentro de la interfaz visual.

A continuación, el gráfico de sombreado pasa al backend del canal de renderizado. El resultado final es un shader ShaderLab funcionalmente similar a uno escrito en HLSL o Cg.

La optimización de un gráfico de sombreado sigue muchas de las mismas reglas que se aplican a los sombreadores HLSL o Cg tradicionales; una de las más importantes es que cuanto más procese el gráfico de sombreado, más afectará al rendimiento de la aplicación.

Si se utiliza la CPU, la optimización de los sombreadores no mejorará la velocidad de fotogramas, pero sí la duración de la batería en plataformas móviles.

Si utiliza la GPU, siga estas directrices para mejorar el rendimiento con Shader Graph:

Elimina los nodos no utilizados: No cambies ningún valor predeterminado ni conectes nodos a menos que esos cambios sean necesarios. Shader Graph compila automáticamente las funciones no utilizadas. Cuando sea posible, incorpore valores a las texturas. Por ejemplo, en lugar de utilizar un nodo para dar brillo a una textura, aplica el brillo extra en el propio activo de la textura.

Siempre que sea posible, utilice un formato de datos más pequeño: Considere la posibilidad de utilizar Vector2 en lugar de Vector3, o de reducir la precisión (por ejemplo, la mitad en lugar de float), si su proyecto lo permite.

Reducir las operaciones matemáticas: Las operaciones de sombreado se ejecutan muchas veces por segundo, así que intenta optimizar los operadores matemáticos siempre que sea posible. Intente mezclar resultados en lugar de crear una rama lógica. Utilice constantes y combine valores escalares antes de aplicar vectores. Por último, convierta las propiedades que no deban aparecer en el Inspector en nodos en línea. Todas estas mejoras incrementales pueden ayudar a su presupuesto para marcos.

Rama una vista previa: A medida que el gráfico aumenta de tamaño, la compilación puede volverse más lenta. Simplifique su flujo de trabajo con una rama separada y más pequeña que contenga sólo las operaciones que desea previsualizar en ese momento. A continuación, itere más rápidamente sobre esta rama más pequeña hasta obtener los resultados deseados. Si la rama no está conectada al Nodo Maestro, puede dejar con seguridad la rama de vista previa en su gráfico. Unity elimina los nodos que no afectan a la salida final durante la compilación.

Optimizar manualmente: Incluso los programadores gráficos más experimentados pueden utilizar un gráfico de sombreado para crear un sombreador basado en scripts. Seleccione el recurso Gráfico de sombreado y, a continuación, seleccione Copiar sombreado en el menú contextual. Crea un nuevo shader HLSL/Cg y luego pega el Shader Graph copiado. Se trata de una operación unidireccional, pero permite exprimir el rendimiento adicional con optimizaciones manuales.

LA LISTA DE SOMBREADORES SIEMPRE INCLUIDOS EN LA CONFIGURACIÓN DE GRÁFICOS
LA LISTA DE SOMBREADORES SIEMPRE INCLUIDOS EN LA CONFIGURACIÓN DE GRÁFICOS
Eliminar los ajustes de sombreado incorporados

Elimine todos los shaders no utilizados de la lista denominada Shaders siempre incluidos, que se encuentra en la configuración de Gráficos(Edición > Configuración del proyecto > Gráficos). Añade aquí los shaders que sean necesarios para el tiempo de vida de la aplicación.

Variantes del sombreador de bandas

Utilice las directivas pragma de compilación de sombreadores para adaptar la compilación de un sombreador a cada plataforma de destino. A continuación, utilice una palabra clave de sombreado (o nodo de palabra clave Shader Graph ) para crear variantes de sombreado con ciertas características activadas o desactivadas.

Las variantes de sombreado pueden ser útiles para funciones específicas de la plataforma, pero también aumentan el tiempo de compilación y el tamaño del archivo. Puede evitar que las variantes de sombreado se incluyan en la compilación si sabe que no son necesarias.

En primer lugar, analice el archivo Editor.log para ver el tiempo y el tamaño de los sombreadores. A continuación, localice las líneas que comienzan por Shader compilado y Shader comprimido.

Este registro de ejemplo muestra las siguientes estadísticas:

Shader compilado 'TEST Standard (Specular setup)' en 31.23s
d3d9 (total programas internos: 482, único: 474)
d3d11 (total programas internos: 482, único: 466)
metal (total programas internos: 482, único: 480)
glcore (total de programas internos: 482, único: 454)
Shader comprimido 'TEST Standard (Specular setup)' en d3d9 de 1.04MB a 0.14MB
Shader comprimido 'TEST Standard (Specular setup)' en d3d11 de 1.39MB a 0.12MB
Shader comprimido "TEST Standard (Specular setup)" en metal de 2,56 MB a 0,20 MB.
Shader comprimido 'TEST Standard (Specular setup)' en glcore de 2.04MB a 0.15MB

Estas estadísticas te dicen algunas cosas sobre el sombreador:

- Se expande en 482 variantes debido al #pragma multi_compile y shader_feature.

- Unity comprime el shader incluido en los datos del juego a aproximadamente la suma de los tamaños comprimidos: 0,14+0,12+0,20+0,15 = 0,61 MB.

- En tiempo de ejecución, Unity mantiene los datos comprimidos en memoria (0.61 MB), mientras que los datos para su API gráfica actualmente utilizada permanecen sin comprimir. Por ejemplo, si su API actual es Metal, eso supondría 2,56 MB.

Después de una construcción, el Auditor del proyecto (experimental) puede analizar el Editor.log para mostrar una lista de todos los sombreadores, palabras clave de sombreadores y variantes de sombreadores compilados en el proyecto. También puede analizar el Jugador.log después de ejecutar el juego. Esto muestra qué variantes compiló y utilizó realmente la aplicación en tiempo de ejecución.

Utiliza esta información para crear un sistema de eliminación de sombreadores mediante scripts y reducir el número de variantes. Esto puede mejorar los tiempos de compilación, los tamaños de compilación y el uso de memoria en tiempo de ejecución.

Lee el artículo Stripping scriptable shader variants para ver este proceso en detalle.

EL ANTIALIASING COMO EFECTO DE POSTPROCESADO EN UNA CÁMARA HDRP
EL ANTIALIASING COMO EFECTO DE POSTPROCESADO EN UNA CÁMARA HDRP
Bordes suaves con antialiasing

El antialiasing contribuye a una calidad de imagen más nítida al reducir los bordes dentados y minimizar el aliasing especular.

Si está utilizando el renderizado Forward con el Built-in Render Pipeline, Antialiasing multimuestra (MSAA) está disponible en la opción Calidad calidad. MSAA produce un antialiasing de alta calidad, pero puede resultar caro. El ajuste llamado Recuento de muestras MSAA del menú desplegable define cuántas muestras utiliza el renderizador para evaluar el efecto(Ninguna, 2X, 4X, 8X). Si está utilizando el renderizado hacia delante con URP o HDRP, puede activar MSAA en el archivo Activo URP o Activo HDRP respectivamente.

Como alternativa, puede añadir antialiasing como efecto de postprocesado. Aparece en el componente Cámara (en Antialiasing) con un par de opciones:

- El Antialiasing Rápido Aproximado (FXAA) suaviza los bordes a nivel de píxel. Es el tipo de antialiasing que consume menos recursos. Difumina ligeramente la imagen final.

- El antialiasing morfológico subpíxel (SMAA) mezcla píxeles basándose en los bordes de una imagen. Ofrece resultados mucho más nítidos que FXAA y es adecuado para estilos artísticos planos, de dibujos animados o limpios.

En HDRP, también puede utilizar FXAA y SMAA en el Post-procesamiento Anti-aliasing en la Cámara con una opción adicional:

- El antialiasing temporal (TAA) suaviza los bordes utilizando fotogramas del búfer histórico. Funciona mejor que FXAA, pero requiere vectores de movimiento para funcionar. TAA también puede mejorar la oclusión ambiental y la volumetría. Por lo general, es de mayor calidad que FXAA, pero requiere recursos adicionales y puede producir artefactos fantasma ocasionales.

AJUSTA LA CONFIGURACIÓN DE LIGHTMAPPING (WINDOWS > RENDERING > LIGHTING SETTINGS) Y EL TAMAÑO DE LIGHTMAP PARA LIMITAR EL USO DE MEMORIA.
AJUSTA LA CONFIGURACIÓN DE LIGHTMAPPING (WINDOWS > RENDERING > LIGHTING SETTINGS) Y EL TAMAÑO DE LIGHTMAP PARA LIMITAR EL USO DE MEMORIA.
Preparar mapas de luz

La opción más rápida para crear iluminación es aquella que no necesita calcularse por fotograma. Utiliza Lightmapping para preparar la iluminación estática una sola vez, en lugar de calcularla en tiempo real.

Añada una iluminación espectacular a su geometría estática mediante iluminación global (IG). Marque la opción Contribuir IG para que los objetos almacenen iluminación de alta calidad en forma de mapas de luz.

El proceso de generación de un entorno lightmapped lleva más tiempo que la simple colocación de una luz en la escena, pero proporciona ventajas clave como:

- Funcionamiento dos o tres veces más rápido para luces de dos por píxel

- Mejoras visuales gracias a la iluminación global, que permite calcular una iluminación directa e indirecta de aspecto realista, mientras que el mapa de luz suaviza y elimina la distorsión del mapa resultante.

- Las sombras y la iluminación se renderizan sin el impacto en el rendimiento que suele producirse con la iluminación y las sombras en tiempo real.

Las escenas más complejas pueden requerir largos tiempos de horneado. Si su hardware es compatible con GPU Lightmapper progresivo (en previsualización), esta opción puede acelerar drásticamente la generación de mapas de luz utilizando la GPU en lugar de la CPU.

Sigue esta guía para empezar con Lightmapping en Unity.

CADA SONDA DE REFLEXIÓN CAPTURA UNA IMAGEN DE SU ENTORNO EN UNA TEXTURA CUBEMAP.
CADA SONDA DE REFLEXIÓN CAPTURA UNA IMAGEN DE SU ENTORNO EN UNA TEXTURA CUBEMAP.
Minimizar las sondas de reflexión

Aunque las sondas de reflexión pueden crear reflejos realistas, pueden ser costosas en términos de lotes. Por ello, pruebe estos consejos de optimización para minimizar el impacto en el rendimiento:

- Utiliza cubemaps de baja resolución, máscaras de culling y compresión de texturas para mejorar el rendimiento en tiempo de ejecución.

- Utilice Tipo: Baked para evitar actualizaciones por fotograma.

- Si el uso de Type: En tiempo real es necesario en URP, intenta evitar Every Frame siempre que sea posible. Ajuste el Modo de actualización y Corte en el tiempo para reducir la frecuencia de actualización. También puede controlar el refresco con la opción Via Scripting y renderizar la sonda desde un script personalizado.

- Si el uso de Type: En tiempo real es necesario en HDRP, seleccione el modo Bajo Demanda. También puede modificar la configuración del marco en Configuración del proyecto > Configuración predeterminada HDRP.

- Reduzca la calidad y las funciones en Reflexión en tiempo real para mejorar el rendimiento.

DESACTIVAR LA PROYECCIÓN DE SOMBRAS PARA REDUCIR LAS LLAMADAS A DIBUJO.
DESACTIVAR LA PROYECCIÓN DE SOMBRAS PARA REDUCIR LAS LLAMADAS A DIBUJO.
Desactivar sombras

La proyección de sombras se puede desactivar por Renderizador de malla y luz. Desactiva las sombras siempre que sea posible para reducir las llamadas a dibujo. También puedes crear sombras falsas utilizando una textura difuminada aplicada a una malla simple o a un cuadrado debajo de tus personajes. Si no, puedes crear sombras blob con shaders personalizados.

En particular, evite activar las sombras para las luces puntuales. Cada luz puntual con sombras requiere seis pasadas de mapa de sombras por luz - compáralo con una sola pasada de mapa de sombras para una luz puntual. Considere la posibilidad de sustituir las luces puntuales por focos cuando sea absolutamente necesario crear sombras dinámicas. Si puedes evitar las sombras dinámicas, utiliza un cubemap como Light.cookie con tus luces puntuales.

Sustituir un efecto de sombreado

En algunos casos, puedes aplicar trucos sencillos en lugar de añadir varias luces adicionales. Por ejemplo, en lugar de crear una luz que brille directamente en la Cámara para dar un efecto de iluminación de Borde, utilice un shader para simular la Iluminación de Borde (ver ejemplos de Shaders de Superficie para una implementación de esto en HLSL).

PUEDEN LIMITAR LA INFLUENCIA DE LA LUZ A UNA MÁSCARA DE SELECCIÓN ESPECÍFICA.
PUEDEN LIMITAR LA INFLUENCIA DE LA LUZ A UNA MÁSCARA DE SELECCIÓN ESPECÍFICA.
Utilizar capas ligeras

Para escenas complejas con muchas luces, separa tus objetos usando capas, luego confina la influencia de cada luz a una Culling Mask específica.

LAS SONDAS LUMINOSAS ILUMINAN LOS OBJETOS DINÁMICOS DEL FONDO.
LAS SONDAS LUMINOSAS ILUMINAN LOS OBJETOS DINÁMICOS DEL FONDO.
Usa sondas de luz (light probes)

Las sondas de luz almacenan información de iluminación horneada sobre el espacio vacío de la escena, al tiempo que proporcionan una iluminación de alta calidad (tanto directa como indirecta). Utilizan armónicos esféricos, que se calculan rápidamente en comparación con las luces dinámicas. Esto es especialmente útil para objetos en movimiento, que normalmente no pueden recibir Baked Lightmapping.

Las sondas de luz también pueden aplicarse a mallas estáticas. En el componente Mesh Renderer, localice el menú desplegable Receive Global Illumination y cambie de Lightmaps a Light Probes.

Continúa utilizando Lightmapping para la geometría de tus niveles prominentes, pero cambia a Light Probes para iluminar detalles más pequeños. La iluminación de la sonda de luz no requiere UVs adecuados, lo que le ahorra el paso adicional de desenvolver sus mallas. Las sondas también reducen el espacio en disco, ya que no generan texturas Lightmap.

Vea el post Iluminación Estática con Sondas de Luz, así como Haciendo visuales creíbles en Unity para más información.

Obtenga el libro electrónico gratuito

Una de nuestras guías más completas reúne más de 80 consejos prácticos sobre cómo optimizar tus juegos para PC y consola. Creados por nuestros expertos ingenieros de Success y Accelerate Solutions, estos consejos en profundidad te ayudarán a sacar el máximo partido de Unity y a aumentar el rendimiento de tu juego.

¿Te gustó este contenido?