Optimiza el rendimiento de tu juego para dispositivos móviles: Consejos de expertos sobre gráficos y activos

THOMAS KROGH-JACOBSEN / UNITY TECHNOLOGIESSenior Technical Content Marketing Manager
Aug 3, 2021|12 min
Optimiza el rendimiento de tu juego para dispositivos móviles: Consejos de expertos sobre gráficos y activos
Para tu comodidad, tradujimos esta página mediante traducción automática. No podemos garantizar la precisión ni la confiabilidad del contenido traducido. Si tienes alguna duda sobre la precisión del contenido traducido, consulta la versión oficial en inglés de la página web.

Nuestro equipo de Éxito Integrado apoya a los clientes de Unity con sus complejos problemas técnicos. Nos sentamos con este equipo de ingenieros de software senior y les pedimos que compartieran parte de su experiencia en la optimización de juegos móviles.

Nuestro equipo de Producción de Studio Unity conoce el código fuente a la perfección y trabaja con una multitud de clientes de Unity para ayudarles a aprovechar al máximo el motor. En su trabajo, profundizan en los proyectos de los creadores para ayudar a identificar puntos donde se podría optimizar el rendimiento para una mayor velocidad, estabilidad y eficiencia. A medida que nuestros ingenieros comenzaron a compartir su perspectiva sobre la optimización de juegos móviles, nos dimos cuenta rápidamente de que había demasiada información valiosa para el único post de blog que habíamos planeado. En su lugar, decidimos convertir su montaña de conocimientos en un e-book completo (que puedes descargar aquí), así como en una serie de publicaciones de blog que destacan algunos de estos más de 75 consejos prácticos.

En la entrega final de esta serie de optimización, nos enfocamos en cómo mejorar el rendimiento de tus activos, la configuración del proyecto y los gráficos. En caso de que te los hayas perdido, consulta nuestras publicaciones anteriores sobre perfilado, memoria y arquitectura de código, así como física, UI y audio, para tener una imagen más completa de cómo optimizar tu juego – o, descarga el e-book gratuito para un resumen de todos estos temas.

Configuración del proyecto

Hay algunas configuraciones del proyecto que pueden afectar tu rendimiento móvil.

Reduce o desactiva la Frecuencia del Acelerómetro

Unity agrupa el acelerómetro de tu móvil varias veces por segundo. Desactiva esto si no se está utilizando en tu aplicación, o reduce su frecuencia para un mejor rendimiento.

Editor
Asegúrate de que la Frecuencia del Acelerómetro esté desactivada si no la estás utilizando en tu juego móvil.

Desactiva configuraciones de Player o Calidad innecesarias

En la configuración de Player, desactiva Auto Graphics API para plataformas no soportadas para evitar generar variantes de shader excesivas. Desactiva Arquitecturas de Destino para CPUs más antiguas si tu aplicación no las soporta.

En la configuración de Calidad, desactiva los niveles de calidad innecesarios.

Desactivar la física innecesaria

Si tu juego no utiliza física, desmarca Auto Simulación y Auto Sincronizar Transformaciones. Estos solo ralentizarán tu aplicación sin ningún beneficio discernible.

Elige la tasa de fotogramas adecuada

Los proyectos móviles deben equilibrar las tasas de fotogramas con la duración de la batería y la limitación térmica. En lugar de llevar al límite tu dispositivo a 60 fps, considera ejecutar a 30 fps como un compromiso. Unity por defecto utiliza 30 fps para móviles.

También puedes ajustar la tasa de fotogramas dinámicamente durante la ejecución con Application.targetFrameRate. Por ejemplo, podrías bajar de 30 fps para escenas lentas o relativamente estáticas y reservar configuraciones de fps más altas para el juego.

Evita jerarquías grandes

Divide tus jerarquías. Si tus GameObjects no necesitan estar anidados en una jerarquía, simplifica la paternidad. Las jerarquías más pequeñas se benefician del multihilo para actualizar las Transformaciones en tu escena. Las jerarquías complejas incurren en cálculos de Transformación innecesarios y más costos para la recolección de basura.

Consulta Optimizando la Jerarquía y esta charla de Unite para las mejores prácticas con Transformaciones.

Transforma una vez, no dos veces

Además, al mover Transformaciones, utiliza Transform.SetPositionAndRotation para actualizar tanto la posición como la rotación a la vez. Esto evita la sobrecarga de modificar una transformación dos veces.

Si necesitas Instanciar un GameObject en tiempo de ejecución, una simple optimización es parentar y reposicionar durante la instanciación:

GameObject.Instantiate(prefab, parent);

GameObject.Instantiate(prefab, parent, position, rotation);

Para más detalles sobre Object.Instantiate, consulte la Scripting API.

Suponga que Vsync está habilitado

Las plataformas móviles no renderizarán medio fotogramas. Incluso si desactiva Vsync en el Editor (Configuración del Proyecto > Calidad), Vsync está habilitado a nivel de hardware. Si la GPU no puede actualizar lo suficientemente rápido, el fotograma actual se mantendrá, reduciendo efectivamente su fps.

Activos

El pipeline de activos puede impactar drásticamente el rendimiento de su aplicación. Un artista técnico experimentado puede ayudar a su equipo a definir y hacer cumplir formatos de activos, especificaciones y configuraciones de importación para procesos fluidos.

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. Configuraciones incorrectas pueden resultar en tamaños de compilación más grandes, tiempos de compilación más largos y un mal uso de la memoria. Considere usar la función Presets para ayudar a personalizar configuraciones base que mejorarán un proyecto específico.

Vea esta guía sobre las mejores prácticas para activos artísticos o consulte este curso sobre Optimización de Arte 3D para Aplicaciones Móviles a través de Unity Learn para más detalles.

Importar texturas correctamente

La mayor parte de su memoria probablemente se destinará a texturas, por lo que las configuraciones de importación aquí son críticas. En general, intente seguir estas pautas:

  • Reduzca el Tamaño Máximo: Utilice la configuración mínima que produzca resultados visualmente aceptables. Esto es no destructivo y puede reducir rápidamente su memoria de texturas.
  • Usa potencias de dos (POT): Unity requiere dimensiones de textura POT para formatos de compresión de texturas móviles (PVRCT o ETC).
  • Agrupa tus texturas: Colocar múltiples texturas en una sola textura puede reducir las llamadas de dibujo y acelerar el renderizado. Usa el Atlas de Sprites de Unity o el TexturePacker de terceros para agrupar tus texturas.
  • Desactiva la opción de Lectura/Escritura habilitada: Cuando está habilitada, esta opción crea una copia en la memoria accesible tanto por la CPU como por la GPU, duplicando la huella de memoria de la textura. En la mayoría de los casos, mantén esto deshabilitado. Si estás generando texturas en tiempo de ejecución, aplica esto a través de Texture2D.Apply, pasando makeNoLongerReadable establecido en true.
  • Desactiva Mip Maps innecesarios: Los Mip Maps no son necesarios para texturas que permanecen a un tamaño constante en pantalla, como sprites 2D y gráficos de UI (deja habilitados los Mip Maps para modelos 3D que varían su distancia de la cámara).
Captura de pantalla del editor
Configuraciones de importación de texturas adecuadas ayudarán a optimizar el tamaño de tu compilación.

Comprimir texturas

Considera estos dos ejemplos usando el mismo modelo y textura. Las configuraciones a la izquierda consumen casi ocho veces la memoria que las de la derecha, sin mucho beneficio en calidad visual.

Captura de pantalla
Las texturas sin comprimir requieren más memoria.

Usa Compresión de Textura Escalable Adaptativa (ATSC) tanto para iOS como para Android. La gran mayoría de los juegos en desarrollo están dirigidos a dispositivos de especificaciones mínimas que soportan compresión ATSC.

Las únicas excepciones son:

  • juegos de iOS dirigidos a dispositivos A7 o inferiores (por ejemplo, iPhone 5, 5S, etc.) – usar PVRTC
  • juegos de Android dirigidos a dispositivos anteriores a 2016 – usar ETC2 (Compresión de Textura de Ericsson)

Si los formatos comprimidos como PVRTC y ETC no son de calidad suficientemente alta, y si ASTC no es totalmente compatible con tu plataforma objetivo, intenta usar texturas de 16 bits en lugar de texturas de 32 bits.

Consulta el manual para obtener más información sobre el formato de compresión de textura recomendado por plataforma.

Ajustar la configuración de importación de mallas

Al igual que las texturas, las mallas pueden consumir memoria excesiva si no se importan cuidadosamente. Para minimizar el consumo de memoria de las mallas:

  • Comprimir la malla: La compresión agresiva puede reducir el espacio en disco (sin embargo, la memoria en tiempo de ejecución no se ve afectada). Ten en cuenta que la cuantización de mallas puede resultar en inexactitudes, así que experimenta con los niveles de compresión para ver qué funciona para tus modelos.
  • Desactivar Lectura/Escritura: Activar esta opción duplica la malla en memoria, lo que mantiene una copia de la malla en la memoria del sistema y otra en la memoria de la GPU. En la mayoría de los casos, deberías desactivarla (en Unity 2019.2 y versiones anteriores, esta opción está marcada por defecto).
  • Desactivar rigs y BlendShapes: Si tu malla no necesita animación esquelética o de BlendShape, desactiva estas opciones siempre que sea posible.
  • Desactivar normales y tangentes: Si estás absolutamente seguro de que el material de la malla no necesitará normales o tangentes, desmarca estas opciones para obtener ahorros adicionales.
Captura de pantalla del editor
Revisa la configuración de importación de tu malla.

Revisa tus conteos de polígonos

Modelos de mayor resolución significan un mayor uso de memoria y potencialmente tiempos de GPU más largos. ¿Necesita su geometría de fondo medio millón de polígonos? Considere reducir los modelos en su paquete DCC de elección. Elimine polígonos no visibles desde el punto de vista de la cámara y use texturas y mapas normales para detalles finos en lugar de mallas de alta densidad.

Automatiza tus configuraciones de importación usando el AssetPostprocessor

El AssetPostprocessor te permite ejecutar scripts al importar activos. Esto te solicita personalizar configuraciones antes y/o después de importar modelos, texturas, audio, etc.

Usa el Sistema Addressable Asset

El Sistema Addressable Asset proporciona una forma simplificada de gestionar tu contenido. Este sistema unificado carga AssetBundles por "dirección" o alias, de forma asíncrona desde una ruta local o una red de entrega de contenido (CDN) remota.

Captura de pantalla del editor

Si divides tus activos no relacionados con el código (Modelos, Texturas, Prefabs, Audio e incluso escenas completas) en un AssetBundle, puedes separarlos como contenido descargable (DLC).

Luego, usa Addressables para crear una construcción inicial más pequeña para tu aplicación móvil. Cloud Content Delivery te permite alojar y entregar el contenido de tu juego a los jugadores a medida que avanzan en el juego.

Captura de pantalla
Carga activos por "dirección" usando el Sistema Addressable Asset.

Haz clic aquí para ver cómo el Sistema Addressable Asset puede facilitar la gestión de activos.

Gráficos y optimización de GPU

Con cada fotograma, Unity determina los objetos que deben ser renderizados y luego crea llamadas de dibujo. Una llamada de dibujo es una llamada a la API gráfica para dibujar objetos (por ejemplo, un triángulo), mientras que un lote es un grupo de llamadas de dibujo que se ejecutan juntas.

A medida que tus proyectos se vuelven más complejos, necesitarás un pipeline que optimice la carga de trabajo en tu GPU. ElPipeline de Renderizado Universal (URP) actualmente utiliza un renderizador de paso único hacia adelante para llevar gráficos de alta calidad a tu plataforma móvil (el renderizado diferido estará disponible en futuras versiones). La misma iluminación y materiales basados en la física de consolas y PC también pueden escalar a tu teléfono o tableta.

Las siguientes pautas pueden ayudarte a acelerar tus gráficos.

Agrupa tus llamadas de dibujo

Agrupar objetos para ser dibujados juntos minimiza los cambios de estado necesarios para dibujar cada objeto en un lote. Esto conduce a un mejor rendimiento al reducir el costo de CPU de renderizar objetos. Unity puede combinar múltiples objetos en menos lotes utilizando varias técnicas:

  • Agrupación dinámica: Para mallas pequeñas, Unity puede agrupar y transformar vértices en la CPU, luego dibujarlos todos de una vez. Nota: Solo usa esto si tienes suficientes mallas de baja poligonización (menos de 900 atributos de vértice y no más de 300 vértices). El agrupador dinámico no agrupará mallas más grandes que esto, por lo que habilitarlo desperdiciará tiempo de CPU buscando mallas pequeñas para agrupar en cada cuadro.
  • Agrupación estática: Para geometría no móvil, Unity puede reducir las llamadas de dibujo para mallas que comparten el mismo material. Si bien es más eficiente que la agrupación dinámica, utiliza más memoria.
  • Instanciación de GPU: Si tienes un gran número de objetos idénticos, esta técnica los agrupa de manera más eficiente mediante el uso de hardware gráfico.
  • Agrupación SRP: Habilita el Agrupador SRP en tu Activo de Pipeline de Renderizado Universal bajo Avanzado. Esto puede acelerar significativamente tus tiempos de renderizado de CPU, dependiendo de la escena.
Captura de pantalla del editor
Organiza tus GameObjects para aprovechar estas técnicas de agrupación.

Usa el Depurador de Marcos

El Depurador de Marcos muestra cómo se construye cada marco a partir de llamadas de dibujo individuales. Esta es una herramienta invaluable para solucionar problemas de las propiedades de tu shader que puede ayudarte a analizar cómo se renderiza el juego.

Editor
El Depurador de Marcos descompone cada marco en sus pasos separados.

¿Nuevo en el Depurador de Marcos? Consulta este tutorial introductorio aquí.

Evita demasiadas luces dinámicas

Es crucial evitar agregar demasiadas luces dinámicas a tu aplicación móvil. Considera alternativas como efectos de shader personalizados y sondas de luz para mallas dinámicas, así como iluminación horneada para mallas estáticas.

Consulta esta tabla de comparación de características para los límites específicos de las luces en tiempo real de URP y del pipeline integrado.

Desactiva las sombras

La proyección de sombras se puede desactivar por cada MeshRenderer y luz. Desactiva las sombras siempre que sea posible para reducir las llamadas de dibujo.

También puedes crear sombras falsas usando una textura difusa aplicada a una malla simple o un cuadrado debajo de tus personajes. De lo contrario, puedes crear sombras de blob con shaders personalizados.

Captura de pantalla del editor
Desactiva la proyección de sombras para reducir las llamadas de dibujo.

Hornea tu iluminación en mapas de luz

Agrega iluminación dramática a tu geometría estática usando Iluminación Global (GI). Marca objetos con Contribuir GI para que puedas almacenar iluminación de alta calidad en forma de mapas de luz.

Las sombras y la iluminación horneadas pueden renderizarse sin afectar el rendimiento en tiempo de ejecución. El Lightmapper progresivo de CPU y GPU puede acelerar la cocción de la Iluminación Global.

Captura de pantalla del editor
Ajusta la Configuración de Lightmapping (Ventanas > Renderizado > Configuración de Iluminación) y el tamaño del Lightmap para limitar el uso de memoria.

Sigue la guía manual y este artículo sobre la optimización de la iluminación para obtener ayuda para comenzar con Lightmapping en Unity.

Usar capas de luz

Para escenas complejas con múltiples luces, separa tus objetos usando capas, luego limita la influencia de cada luz a una máscara de culling específica.

Captura de pantalla del editor
Las capas pueden limitar la influencia de tu luz a una máscara de culling específica.

Usar Probes de Luz para objetos en movimiento

Los Probes de Luz almacenan información de iluminación cocida sobre el espacio vacío en tu Escena, mientras proporcionan iluminación de alta calidad (tanto directa como indirecta). Utilizan Armonicos Esféricos, que se calculan muy rápidamente en comparación con luces dinámicas.

Captura de pantalla del editor
Los Probes de Luz iluminan objetos dinámicos en el fondo.

Usar Nivel de Detalle (LOD)

A medida que los objetos se alejan, Nivel de Detalle puede ajustar o cambiar para usar mallas más simples con materiales y shaders más simples, para ayudar al rendimiento de la GPU.

Captura de pantalla del editor
Ejemplo de una malla usando un grupo de LOD.
Captura de pantalla
Mallas fuente, modeladas a diferentes resoluciones.

Usar Culling de Oclusión para eliminar objetos ocultos

Los objetos ocultos detrás de otros objetos pueden seguir renderizándose y costar recursos. Usa Culling de Oclusión para descartarlos.

Mientras que el culling de frustum fuera de la vista de la cámara es automático, el culling de oclusión es un proceso cocido. Simplemente marca tus objetos como Oclusores Estáticos o Ocluidos, luego cocina a través del Ventana > Renderizado > Culling de Oclusióndiálogo. Aunque no es necesario para cada escena, el culling puede mejorar el rendimiento en muchos casos.

Consulta el tutorial de Trabajando con Occlusion Culling para más información.

Evitar la resolución nativa móvil

Con los teléfonos y tabletas volviéndose cada vez más avanzados, los dispositivos más nuevos tienden a tener resoluciones muy altas.

Usa Screen.SetResolution(width, height, false) para reducir la resolución de salida y recuperar algo de rendimiento. Perfila múltiples resoluciones para encontrar el mejor equilibrio entre calidad y velocidad.

Limitar el uso de cámaras

Cada cámara incurre en algún costo, ya sea que esté realizando un trabajo significativo o no. Usa solo los componentes de Cámara necesarios para el renderizado. En plataformas móviles de gama baja, cada cámara puede usar hasta 1 ms de tiempo de CPU.

Mantén los shaders simples

El Universal Render Pipeline incluye varios shaders ligeros Lit y Unlit que ya están optimizados para plataformas móviles. Intenta mantener tus variaciones de shader lo más bajas posible, ya que pueden tener un efecto dramático en el uso de memoria en tiempo de ejecución. Si los shaders predeterminados de URP no se adaptan a tus necesidades, puedes personalizar el aspecto de tus materiales usando Shader Graph. Descubre cómo construir tus shaders visualmente usando Shader Graph aquí.

Captura de pantalla
Crea shaders personalizados con Shader Graph.

Minimizar el sobre-dibujo y la mezcla alfa

Evita dibujar imágenes transparentes o semi-transparentes innecesarias. Las plataformas móviles se ven muy afectadas por el sobre-dibujo y la mezcla alfa resultantes. No superpongas imágenes o efectos apenas visibles. Puedes verificar el sobre-dibujo usando el depurador gráfico RenderDoc.

Limitar el posproceso de efectos

Los efectos de posprocesamiento en pantalla completa Post-procesamiento, como brillos, pueden ralentizar drásticamente el rendimiento. Úsalos con precaución en la dirección artística de tu título.

Captura de pantalla del editor
Mantén los efectos de posprocesamiento simples en aplicaciones móviles.

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 deseas acceder al material del objeto en lote, usa Renderer.sharedMaterial en su lugar.

Optimizar SkinnedMeshRenderers

Renderizar mallas esqueléticas es costoso. Asegúrate de que cada objeto que use un SkinnedMeshRenderer lo necesite. Si un GameObject solo necesita animación algunas veces, usa la función BakeMesh para congelar la malla esquelética en una pose estática, luego cambia a un MeshRenderer más simple en tiempo de ejecución.

Minimizar Probes de Reflexión

Un Probe de Reflexión puede crear reflexiones realistas, pero puede ser muy costoso en términos de lotes. Usa cubemaps de baja resolución, máscaras de culling y compresión de texturas para mejorar el rendimiento en tiempo de ejecución.

Descarga la guía completa para la optimización del rendimiento móvil

Esta fue la última publicación del blog en la serie de optimización del rendimiento móvil. Sin embargo, si deseas acceder a la lista completa de consejos y trucos del equipo, también hemos publicado un e-book de 52 páginas disponible aquí.

Ebook

DESCARGAR E-BOOK

Si estás interesado en aprender más sobre los servicios de Soporte Integrado y quieres dar a tu equipo acceso directo a ingenieros, asesoría experta y orientación sobre las mejores prácticas para tus proyectos, entonces consulta los planes de éxito de Unity aquí.

¿No encontraste lo que buscabas?

Queremos ayudarte a que tus aplicaciones de Unity sean lo más eficientes posible. Si hay algún tema de optimización sobre el que te gustaría saber más, háznoslo saber en los comentarios.