Lo que obtendrás de esta página: Parte II de nuestra colección de consejos útilespara optimizar tus recursos artísticos para tu juego móvil. La parte I esaquí.
Puede encontrar muchos otros consejos de optimización móvil eneste completo libro electrónicoy en este curso de Unity Learn sobreoptimización del arte 3D para aplicaciones móviles.
La misma iluminación y materiales físicos de consolas y PC también se pueden escalar a su teléfono o tableta con Universal Render Pipeline (URP).
Agrupa tus llamadas de sorteo
Con cada cuadro, Unity determina los objetos que se deben representar y luego crea llamadas de dibujo. Una llamada de dibujo es una llamada a la API de gráficos para dibujar objetos (por ejemplo, un triángulo), mientras que un lote es un grupo de llamadas de dibujo que se ejecutarán juntas. El procesamiento por lotes de objetos que se van a dibujar juntos minimiza los cambios de estado necesarios para dibujar cada objeto en un lote. Esto conduce a un rendimiento mejorado al reducir el costo de CPU para renderizar objetos.
- Lotes dinámicos: Para mallas pequeñas, Unity puede agrupar y transformar vértices en la CPU y luego dibujarlos todos de una vez. *NOTA*: Úselo solo si tiene suficientes mallas de baja poli (menos de 900 atributos de vértice y no más de 300 vértices). Dynamic Batcher no procesará mallas más grandes que esto, por lo que habilitarlo desperdiciará tiempo de CPU buscando mallas pequeñas para procesar en lotes en cada cuadro.
- Lotes estáticos: Para geometrías que no se mueven, Unity puede reducir las llamadas de dibujo para mallas que comparten el mismo material. Si bien es más eficiente que el procesamiento por lotes dinámico, utiliza más memoria.
- Instancia de GPU: Si tiene una gran cantidad de objetos idénticos, esta técnica los agrupa de manera más eficiente mediante el uso de hardware de gráficos.
Procesamiento por lotes SRP: Habilite SRP Batcher en su activo URP en Avanzado. Esto puede acelerar significativamente los tiempos de renderizado de su CPU, dependiendo de la escena.
Es fundamental evitar agregar demasiadas luces dinámicas a su aplicación móvil. Considere alternativas como efectos de sombreado personalizados y sondas de luz para mallas dinámicas, así como iluminación integrada para mallas estáticas.
Consulte esta tabla de comparación de funciones para conocer los límites específicos de las luces en tiempo real URP y del canal de renderizado integrado.
La proyección de sombras se puede desactivar según MeshRenderer y luz. Desactive las sombras siempre que sea posible para reducir las llamadas de sorteo.
También puedes crear sombras falsas usando una textura borrosa aplicada a una malla simple o un cuadrilátero debajo de tus personajes. De lo contrario, puede crear sombras de manchas con sombreadores personalizados.
Agregue una iluminación espectacular a su geometría estática utilizando Iluminación Global (GI). Marque objetos con Contribute GI para poder almacenar iluminación de alta calidad en forma de mapas de luz.
Las sombras y la iluminación horneadas se pueden renderizar sin afectar el rendimiento en tiempo de ejecución. El Lightmapper progresivo de CPU y GPU puede acelerar la cocción de Global Illumination.
Siga el manual y este artículo sobre optimización de la luz para comenzar con el mapeo de luz en Unity.
Para escenas complejas con múltiples luces, separe los objetos usando capas y luego limite la influencia de cada luz a una máscara de selección específica.
Light Probes almacena información de iluminación horneada sobre el espacio vacío de su escena, al tiempo que proporciona 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.
Una sonda de reflexión puede crear reflejos realistas, pero puede resultar muy costosa en términos de lotes. Utilice mapas de cubos de baja resolución, máscaras de selección y compresión de texturas para mejorar el rendimiento en tiempo de ejecución.
Renderizar un objeto con transparencia siempre utiliza más recursos de GPU que renderizar un objeto opaco, especialmente cuando los objetos transparentes se renderizan uno encima del otro varias veces, un proceso conocido como sobredibujo. Es una buena práctica utilizar un material opaco siempre que sea posible, especialmente para plataformas móviles. Puede comprobar el sobregiro utilizando el depurador de gráficos RenderDoc .
Utilice el sombreador más simple posible (como un sombreador apagado) y evite el uso de funciones innecesarias. Utilice los sombreadores prediseñados de Unity diseñados específicamente para sistemas como partículas. URP incluye varios sombreadores ligeros iluminados y apagados que ya están optimizados para plataformas móviles. Para minimizar el sobregiro, reduce la cantidad y/o el tamaño de las partículas en tu juego.
Para objetivos de rendimiento, considere utilizar materiales opacos sin iluminación con la mitad de precisión, cuando sea posible, y tenga en cuenta las operaciones complejas en los nodos. Encuentre más consejos en esta sesión sobre Shader Graph.
Al crear un sombreador, puedes decidir cómo reaccionará el material a la luz. La mayoría de los sombreadores se clasifican como iluminados o apagados. Un sombreador apagado es el modelo de sombreado más rápido y computacionalmente más económico. Úselo si su objetivo es un dispositivo de gama baja.
Los puntos clave a considerar incluyen:
- La iluminación no afecta a un modelo de sombreado sin iluminación. Esto significa que muchos cálculos, como los de especularidad, no son necesarios. El resultado es un renderizado más barato o más rápido.
- Usar una dirección de arte estilizada que se parezca a una caricatura funciona bien con sombras sin iluminación. Vale la pena considerar este estilo cuando desarrollas juegos para plataformas móviles.
Los sombreadores de vértices funcionan en cada vértice, mientras que los sombreadores de píxeles (o fragmentos) se ejecutan en cada píxel. Por lo general, se representan más píxeles que vértices en la pantalla. Esto significa que el sombreador de píxeles se ejecuta con más frecuencia que el sombreador de vértices. Debido a esto, recomendamos mover el cálculo del sombreador de píxeles al sombreador de vértices siempre que sea posible. Como de costumbre, después de trabajar en las optimizaciones, debe realizar más perfiles para determinar la mejor solución para su situación particular.
Las operaciones básicas, como la suma y la multiplicación, son más rápidas de procesar. Es mejor mantener el número de operaciones matemáticas más lentas lo más pequeño posible. La cantidad de matemáticas complicadas que se utilizan debe mantenerse baja en dispositivos más antiguos, como los que usan GLES 2.0.
Al activar SRP Batcher , observe la ventana Estadísticas y el gráfico de vértices de la sección de renderizado en la vista Profiler. Aparte de un aumento en FPS, la cantidad de triángulos y vértices que se procesan disminuye drásticamente. Debido a que nuestros objetos usan un sombreador que es compatible con URP, la canalización de renderizado agrupa automáticamente todos los datos de geometría relevantes para reducir la cantidad de datos procesados.
De forma predeterminada, Unity importa modelos animados con Generic Rig, aunque los desarrolladores a menudo cambian a Humanoid Rig cuando animan un personaje. Un Humanoid Rig consume entre un 30% y un 50% más de tiempo de CPU que el equipo genérico equivalente porque calcula la cinemática inversa y la animación reorientando cada cuadro.
Renderizar mallas sin piel es costoso. Asegúrese de que cada objeto que utilice SkinnedMeshRenderer lo requiera. Si un GameObject solo necesita animación parte del tiempo, use la función BakeMesh para congelar la malla revestida en una pose estática y luego cambie a un MeshRenderer más simple en tiempo de ejecución.
Diseñado principalmente para personajes humanoides, el sistema Mecanim de Unity es bastante sofisticado pero a menudo se usa para animar valores individuales (por ejemplo, el canal alfa de un elemento de la interfaz de usuario). Evite el uso excesivo de animadores. Particularmente junto con elementos de la interfaz de usuario, considere crear funciones de interpolación o usar una biblioteca de terceros para animaciones simples (por ejemplo, DOTween o LeanTween).
Trabajar en un presupuesto de tiempo específico por fotograma
Cada fotograma tendrá un presupuesto de tiempo basado en los fotogramas por segundo (fps) objetivo. Idealmente, una aplicación que se ejecuta a 30 fps permitirá aproximadamente 33,33 ms por cuadro (1000 ms/30 fps). Asimismo, un objetivo de 60 fps deja 16,66 ms por cuadro.
Los dispositivos pueden exceder este presupuesto durante períodos cortos de tiempo (por ejemplo, para escenas o secuencias de carga), pero no por un período prolongado.
Predefinidos
No confíe en la configuración predeterminada. Utilice la pestaña de anulación específica de la plataforma para optimizar activos como texturas y geometría de malla. Una configuración incorrecta puede generar tamaños de compilación más grandes, tiempos de compilación más prolongados y un uso deficiente de la memoria. Considere utilizar la función Presets para ayudar a personalizar la configuración básica que mejorará un proyecto específico.
Limitar el uso de cámaras
Cada cámara genera algunos gastos generales, ya sea que esté realizando un trabajo significativo o no. Utilice únicamente los componentes de la cámara necesarios para el renderizado. En plataformas móviles de gama baja, cada cámara puede utilizar hasta 1 ms de tiempo de CPU.
Evite los efectos de pantalla completa
Los efectos de posprocesamiento de pantalla completa, como los brillos, pueden ralentizar drásticamente el rendimiento. Úsalos con cautela en la dirección artística de tu título.
Tenga cuidado con Renderer.material
Acceder a Renderer.material en scripts duplica el material y devuelve una referencia a la nueva copia. Esto rompe cualquier lote existente que ya incluya el material. Si desea acceder al material del objeto por lotes, utilice Renderer.sharedMaterial en su lugar.