Lo que obtendrás de esta página: Consejos para optimizar los recursos artísticos para desarrolladores de juegos móviles que trabajan en Unity. Este es el primero dedos artículossobre la optimización del arte para juegos móviles.
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.
Tanto los polígonos como los vértices son computacionalmente costosos en plataformas móviles. Coloque polígonos en áreas que realmente contribuyan a la calidad visual de la aplicación, para no desperdiciar su presupuesto de procesamiento.
Debido al pequeño tamaño de pantalla en la mayoría de los dispositivos móviles y a la ubicación de los objetos 3D en su aplicación, es posible que muchos detalles de triángulos pequeños en un objeto 3D no sean visibles. Esto significa que debes centrarte en formas y partes grandes que contribuyan a la silueta del objeto, en lugar de pequeños detalles que podrían no ser visibles. Utilice texturas y mapas normales para obtener detalles finos.
A medida que los objetos se alejan, el nivel de detalle (LOD) puede ajustarlos o cambiarlos para usar mallas más simples con materiales y sombreadores más simples para refinar el rendimiento de la GPU.
Más consejos de preparación de LOD
- Elimine más polígonos en áreas más planas y no use áreas densas de triángulos en objetos con un LOD más bajo.
- LOD también se puede aplicar a la complejidad del sombreador. El sombreador y el material se pueden optimizar para objetos 3D que están más lejos. Por ejemplo, puede reducir la cantidad de texturas que utiliza un objeto a medida que se aleja de la cámara.
- A menudo vale la pena reducir el número de triángulos entre cada nivel LOD en un 50%.
- Compruebe cómo se ve el LOD a diferentes distancias de la cámara.
- La topología limpia es esencial para personajes y objetos que se deforman o están animados.
- No te obsesiones con tener una topología perfecta. El jugador o el usuario final no verá la estructura alámbrica de un modelo 3D una vez que haya aplicado una textura y un material.
Cuando no usar LOD
LOD no es adecuado en todas las situaciones. Por ejemplo, evite usarlo en una aplicación donde tanto la vista de la cámara como los objetos sean estáticos, o donde el objeto ya esté usando un número bajo de polígonos. LOD viene con una sobrecarga de memoria y un tamaño de archivo más grande porque los datos de la malla deben guardarse para poder usarlos en tiempo real.
Puede combinar varias mallas en una para reducir la cantidad de llamadas de dibujo necesarias para el renderizado. Para aplicar esta técnica, cree un GameObject vacío en la Jerarquía y conviértalo en el padre de las mallas que desea combinar, luego adjunte un script que implemente el método Mesh.CombineMeshes() en el GameObject padre.
Utilice la selección de oclusión
Los objetos ocultos detrás de otros objetos aún pueden representar y costar recursos. Utilice Occlusion Culling para descartarlos.
Si bien la selección de frustum fuera de la vista de la cámara es automática, la selección de oclusión es un proceso horneado. Simplemente marque sus objetos como Oclusores estáticos o Oclusores estáticos, luego hornee a través del cuadro de diálogo Ventana > Representación > Selección de oclusión . Si bien no es necesario para todas las escenas, la selección puede mejorar el rendimiento en muchos casos. Consulte el tutorial Trabajar con selección de oclusión para obtener más información.
A continuación se ofrecen algunos buenos consejos que debe tener en cuenta al importar sus modelos.
- Tipo de animación: Al importar una malla FBX que no contiene ningún dato de animación, establezca el tipo de animación en Ninguno en la pestaña Equipo de la Configuración de importación. Cuando colocas tu malla en la jerarquía, esta configuración garantizará que Unity no genere un componente Animator no utilizado.
- Deshabilitar plataformas y BlendShapes: Si su malla no necesita animación esquelética o de forma combinada, desactive estas opciones siempre que sea posible.
- Deshabilitar normales y tangentes: Si está absolutamente seguro de que el material de la malla no necesitará normales ni tangentes, desmarque estas opciones para obtener ahorros adicionales.
- Import Settings Si su modelo no se modifica en tiempo de ejecución, desactive la opción Lectura/Escritura habilitada en la pestaña Modelo de Configuración de importación para evitar que se cree una copia en la memoria.
- Lotes estáticos/dinámicos: Static Batching es una técnica de optimización común que reduce la cantidad de llamadas de sorteo. Es ideal para objetos formados por una gran cantidad de vértices que no se mueven, rotan ni escalan durante el renderizado. Marque Estático en el inspector que contiene el renderizador de malla de su modelo de destino.
Las texturas pueden ser de diferentes tamaños. Reducir el tamaño de las texturas que requieren menos detalles ayudará a reducir el ancho de banda. Por ejemplo, una textura difusa se puede configurar en 1024 x 1024, y el mapa de rugosidad/metálico relacionado se puede configurar en 512 x 512. Haga todo lo posible para reducir selectivamente el tamaño de la textura y siempre verifique si alguna imagen se ha degradado después.
La mayoría del software de texturizado trabaja y exporta texturas utilizando el espacio de color sRGB.
Le recomendamos que utilice texturas difusas en el espacio de color sRGB. Las texturas que no se procesan como color no deben estar en el espacio de color sRGB. Ejemplos de estas texturas incluyen mapas metálicos, de rugosidad y normales, ya que los mapas se utilizan como datos en lugar de colores. El uso de sRGB en estos mapas dará como resultado una imagen incorrecta en el material.
*NOTA*: Asegúrese de que la configuración sRGB (textura de color) en la ventana del inspector no tenga marcas junto a mapas de rugosidad, especulares, normales o elementos similares.
Elementos como la oclusión ambiental y pequeños reflejos especulares se pueden incorporar y luego agregar a la textura difusa. Este enfoque significa que no tiene que depender demasiado de sombreadores computacionalmente costosos ni de funciones de Unity para obtener reflejos especulares y oclusión ambiental.
Siempre que sea posible, utilice texturas en escala de grises que permitan matizar el color en el sombreador. Esto ahorra memoria de textura a costa de crear un sombreador personalizado para realizar el teñido. Sea selectivo con esta técnica, porque no todos los objetos quedan bien con este método. Es más fácil aplicar esto a un objeto que tiene un color uniforme.
El filtrado de texturas a menudo mejora la calidad de la textura en una escena, pero también puede degradar el rendimiento porque lograr una mejor calidad de la textura a menudo requiere más procesamiento. En ocasiones, el filtrado de texturas puede representar hasta la mitad del consumo de energía de la GPU. Elegir filtros de textura más simples y apropiados puede ayudar a reducir las demandas energéticas de una aplicación.
- Filtrado de punto/más cercano: Esta es la forma más simple y menos intensa desde el punto de vista computacional de filtrado de texturas, aunque cuando se ve de cerca, este filtrado puede hacer que las texturas parezcan en bloques.
- Filtrado bilineal: El filtrado bilineal toma muestras y promedia los texels vecinos para colorear los píxeles de una textura. A diferencia del filtrado más cercano, el filtrado bilineal da como resultado píxeles con menos bloques, ya que los píxeles tienen un gradiente suave. Un efecto secundario del filtrado bilineal es que las texturas se verán borrosas cuando se vean de cerca.
Es probable que la mayor parte de tu memoria se destine a texturas, por lo que la configuración de importación aquí es fundamental. En general, intente seguir estas pautas al importar sus activos.
- Reduzca el tamaño máximo: Utilice la configuración mínima que produzca resultados visualmente aceptables. Esto no es destructivo y puede reducir rápidamente la memoria de textura.
- Utilice potencias de dos (POT): Unity requiere dimensiones de textura POT para formatos de compresión de texturas móviles (PVRCT o ETC).
- Atlas de tus texturas: Colocar varias texturas en una sola textura puede reducir las llamadas de dibujo y acelerar el renderizado. Utilice Unity Sprite Atlas o TexturePackerde terceros para crear un atlas de sus texturas.
- Desactive la opción Lectura/Escritura habilitada: Cuando está habilitada, esta opción crea una copia en la memoria direccionable tanto de CPU como de GPU, duplicando la huella de memoria de la textura. En la mayoría de los casos, manténgalo deshabilitado. Si está generando texturas en tiempo de ejecución, aplique esto a través de Textura2D. Aplicar, pasando makeNoLongerReadable establecido en true.
- Deshabilite mapas mip innecesarios: Los mapas Mip no son necesarios para texturas que permanecen en un tamaño constante en la pantalla, como sprites 2D y gráficos UI. Deje los mapas MIP habilitados para modelos 3D con diferentes distancias desde la cámara.
- Utilice filtrado bilineal: Esto ayudará a lograr un equilibrio entre el rendimiento y la calidad visual.
- Utilice filtrado trilineal de forma selectiva: Requiere más ancho de banda de memoria que el filtrado bilineal.
- Utilice filtrado bilineal y anisotrópico 2x: Elija estos en lugar de trilineales y 1x anisotrópicos para mejorar tanto la apariencia como el rendimiento.
- Mantenga el nivel anisotrópico bajo: Utilice únicamente un nivel superior a 2 para recursos críticos del juego.
Utilice la compresión de textura escalable adaptativa (ATSC) tanto para iOS como para Android. La gran mayoría de los juegos en desarrollo tienden a apuntar a dispositivos con especificaciones mínimas que admiten la compresión ATSC. Las únicas excepciones son:
- Juegos de iOS destinados a dispositivos A7 o inferiores (por ejemplo, iPhone 5, 5S, etc.): Utilice PVRTC
- Juegos de Android dirigidos a dispositivos anteriores a 2016: UseEricsson Texture Compression (ETC2)
El empaquetado de canales de textura ayuda a ahorrar memoria de textura porque puedes obtener tres mapas en una textura. Esto significa menos muestras de textura. Este enfoque se utiliza comúnmente para agrupar rugosidad, suavidad y/o metal en una sola textura. También se puede aplicar sobre cualquier mascarilla Texture. Por ejemplo, también puedes almacenar la máscara alfa. Las imágenes con transparencias pueden ocupar una mayor cantidad de memoria ya que requieren un formato de 32 bits, pero al utilizar el canal libre para almacenar la máscara alfa, puede mantener la textura difusa en 16 bits y reducir efectivamente a la mitad el tamaño del archivo.
Utilice el canal verde para almacenar la máscara más importante. El canal verde suele tener más bits ya que nuestros ojos son más sensibles al verde y menos sensibles al azul.
Un mapa UV proyecta texturas 2D sobre la superficie de un modelo 3D. El desenvolvimiento UV es el proceso de creación de un mapa UV.
- Es una buena práctica mantener las islas UV, las unidades individuales de una textura sin envolver, lo más rectas posible para facilitar el embalaje de las islas UV y reducir el desperdicio de espacio. Un UV directo también ayuda a prevenir el efecto escalera en Textures.
- En plataformas móviles, el espacio de textura es limitado. Como tal, el tamaño de la textura suele ser más pequeño que en una consola o PC. Un buen embalaje UV garantiza que obtengas la máxima resolución de tus texturas.
- Considere tener un UV ligeramente distorsionado manteniendo el UV recto para obtener texturas de mejor calidad.
- En ciertos casos, necesitarás exagerar y resaltar los bordes y el sombreado para mejorar la legibilidad de la forma. Dado que las plataformas móviles generalmente utilizan texturas más pequeñas, puede resultar difícil capturar todos los detalles necesarios en ese pequeño espacio.
- Para aplicaciones móviles, utilice menos texturas y combine los detalles adicionales en una sola textura. Esto es importante porque es mejor colocar algunos detalles en la textura difusa para garantizar que esos detalles sean visibles en las pantallas móviles pequeñas.