Optimiza el rendimiento de tu juego para dispositivos móviles: Obtén consejos de expertos sobre física, UI y configuraciones de audio

THOMAS KROGH-JACOBSEN / UNITY TECHNOLOGIESSenior Technical Content Marketing Manager
Jul 13, 2021|13 minutos
Optimiza el rendimiento de tu juego para dispositivos móviles: Obtén consejos de expertos sobre física, UI y configuraciones de audio
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 Producciones de Unity Studio 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 artículo de blog que habíamos planeado. En su lugar, decidimos convertir su montaña de conocimiento 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 esta segunda entrega de la serie, nos estamos enfocando en cómo mejorar el rendimiento con la interfaz de usuario, la física y la configuración de audio. En caso de que te lo hayas perdido, consulta nuestra publicación anterior sobre perfilado, memoria y arquitectura de código, y mantente atento a la siguiente, dedicada a activos, configuración de proyectos y gráficos.

¿Lo quieres todo ahora? Descarga el e-book gratuito.

¡Vamos directo al grano!

Física

La Física integrada de Unity (Nvidia PhysX) puede ser costosa en móviles, pero los siguientes consejos pueden ayudarte a obtener más fotogramas por segundo.

Optimiza tus configuraciones

En PlayerSettings, verifica Prebake Collision Meshes siempre que sea posible.

Imagen de la caja de configuraciones del jugador con un fondo gris oscuro y el texto "prebake collision meshes*" marcado y cuadrado en rojo
Habilita Prebake Collision Meshes.

Asegúrate de editar tus configuraciones de física (Configuración del Proyecto > Física) y simplificar tu matriz de colisión de capas siempre que sea posible.

Desactiva Auto Sync Transforms y habilita Reuse Collision Callbacks.

Imagen de la caja de configuraciones del proyecto con un fondo gris y las secciones de "Sincronización Automática de Transformaciones" y "Matriz de Colisión de Capas" enmarcadas en rojo.
Modifica la configuración del proyecto de física para aumentar el rendimiento.
Imagen del módulo de física del perfilador con la sección de 5ms mostrando actividad en verde, azul y naranja contra un fondo negro.
Mantén un ojo en el módulo de Física del Perfilador para problemas de rendimiento.
Simplificar colisionadores

Los colisionadores de malla pueden ser costosos. Sustituye colisionadores de malla más complejos por colisionadores de malla primitivos o simplificados para aproximar la forma original.

Usa primitivos o mallas simplificadas para colisionadores.
Usa primitivos o mallas simplificadas para colisionadores.
Mueve un Rigidbody usando métodos de física

Usa métodos de clase como MovePosition o AddForce para mover tus objetos Rigidbody. Traducir sus componentes Transform directamente puede llevar a recalculaciones del mundo físico, que son costosas en escenas complejas. Mueve cuerpos físicos en FixedUpdate en lugar de Update.

Arregla el Timestep Fijo

El Fixed Timestep predeterminado en la Configuración del Proyecto es 0.02 (50 Hz). Cambia esto para que coincida con tu tasa de fotogramas objetivo (por ejemplo, 0.03 para 30 fps).

Sin embargo, si tu tasa de fotogramas cae en tiempo de ejecución, esto significa que Unity llamaría a FixedUpdate múltiples veces por fotograma y potencialmente crearía un problema de rendimiento de CPU con contenido pesado en física.

El Maximum Allowed Timestep limita cuánto tiempo pueden usar los cálculos de física y los eventos de FixedUpdate en caso de que la tasa de fotogramas caiga. Bajar este valor significa que durante un parón de rendimiento, la física y la animación podrían ralentizarse, mientras que también se reduce su impacto en la tasa de fotogramas.

Imagen del módulo de tiempo fijo dentro de la configuración del proyecto con un fondo gris y texto blanco.
Modifica el Timestep Fijo para que coincida con tu tasa de fotogramas objetivo, y baja el Timestep Máximo Permitido para reducir fallos de rendimiento.
Visualiza con el depurador de física

Utiliza la ventana de depuración de física (Ventana > Análisis > Depurador de física) para ayudar a solucionar cualquier problema con los colliders o discrepancias. Esto muestra un indicador codificado por colores de los GameObjects que pueden colisionar entre sí.

Imagen de un barco naranja con una superposición de malla y una sombra azul dentro del cuadro de diálogo del depurador de física.
La herramienta de depuración de física te ayuda a visualizar cómo tus objetos de física pueden interactuar entre sí.

Para más información, consulta Visualización de depuración de física en la documentación de Unity.

Interfaz de usuario

Unity UI (UGUI) puede ser a menudo una fuente de problemas de rendimiento. El componente Canvas genera y actualiza mallas para los elementos de la interfaz de usuario y emite llamadas de dibujo a la GPU. Su funcionamiento puede ser costoso, así que ten en cuenta los siguientes factores al trabajar con UGUI.

Divide tus Canvases

Si tienes un Canvas grande con miles de elementos, actualizar un solo elemento de la interfaz de usuario obliga a todo el Canvas a actualizarse, lo que puede generar un pico en la CPU.

Aprovecha la capacidad de UGUI para soportar múltiples Canvases. Divide los elementos de la interfaz de usuario según la frecuencia con la que necesitan ser actualizados. Mantén los elementos de la interfaz de usuario estáticos en un Canvas separado, y los elementos dinámicos que se actualizan al mismo tiempo en sub-canvases más pequeños.

Asegúrate de que todos los elementos de la interfaz de usuario dentro de cada Canvas tengan el mismo valor Z, materiales y texturas.

Oculta los elementos de la interfaz de usuario invisibles

Es posible que tengas elementos de la interfaz de usuario que solo aparecen esporádicamente en el juego (por ejemplo, una barra de salud que aparece cuando un personaje recibe daño). Si tu elemento de la interfaz de usuario invisible está activo, podría seguir utilizando llamadas de dibujo. Desactiva explícitamente cualquier componente de la interfaz de usuario invisible y vuelve a habilitarlos según sea necesario.

Si solo necesitas desactivar la visibilidad del Canvas, desactiva el componente Canvas en lugar del GameObject. Esto puede ahorrar la reconstrucción de mallas y vértices.

Limita los GraphicRaycasters y desactiva el Raycast Target.

Los eventos de entrada como toques o clics en pantalla requieren el componente GraphicRaycaster. Esto simplemente recorre cada punto de entrada en la pantalla y verifica si está dentro del RectTransform de una UI.

Elimina el GraphicRaycaster predeterminado del Canvas superior en la jerarquía. En su lugar, agrega el GraphicRaycaster exclusivamente a los elementos individuales que necesitan interactuar (botones, scrollrects, etc.).

Imagen del cuadro de diálogo del raycaster gráfico gris con texto blanco.
Desactiva Ignorar Gráficos Invertidos, que está activo por defecto.

Además, desactiva Raycast Target en todo el texto e imágenes de la UI que no lo necesiten. Si la UI es compleja con muchos elementos, todos estos pequeños cambios pueden reducir el cálculo innecesario.

Cuadro de diálogo de imagen con un fondo gris y el texto "Raycast Target" delineado en un cuadrado rojo.
Desactiva Raycast Target si es posible.
Evita Grupos de Diseño.

Los Grupos de Diseño se actualizan de manera ineficiente, así que úsalos con moderación. Evítalos por completo si tu contenido no es dinámico, y usa anclajes para diseños proporcionales en su lugar. De lo contrario, crea código personalizado para desactivar los componentes Layout Group después de que configuren la UI.

Si necesitas usar Grupos de Diseño (Horizontal, Vertical, Cuadrícula) para tus elementos dinámicos, evita anidarlos para mejorar el rendimiento.

Cuadro de diálogo del grupo de diseño de cuadrícula con fondo gris y texto blanco.
Los Grupos de Diseño pueden reducir el rendimiento, especialmente cuando están anidados.
Evita vistas grandes de Lista y Cuadrícula

Las vistas grandes de Lista y Cuadrícula son costosas. Si necesitas crear una gran vista de Lista o Cuadrícula (por ejemplo, una pantalla de inventario con cientos de elementos), considera reutilizar un grupo más pequeño de elementos de UI en lugar de crear un elemento de UI para cada elemento. Consulta este proyecto de GitHub para ver esto en acción.

Evita numerosos elementos superpuestos

Superponer muchos elementos de UI (por ejemplo, cartas apiladas en un juego de cartas) crea sobrecarga. Personaliza tu código para fusionar elementos superpuestos en tiempo de ejecución en menos elementos y lotes.

Usa múltiples resoluciones y relaciones de aspecto

Con los dispositivos móviles utilizando ahora resoluciones y tamaños de pantalla muy diferentes, crea versiones alternas de la UI para proporcionar la mejor experiencia en cada dispositivo.

Usa el Simulador de Dispositivos para previsualizar la UI en una amplia gama de dispositivos compatibles. También puedes crear dispositivos virtuales en XCode y Android Studio.

Imagen del simulador de dispositivos que tiene un fondo de cuadro de diálogo gris y una simulación de un juego de barcos de carreras en un smartphone.
Previsualiza una variedad de formatos de pantalla usando el Simulador de Dispositivos.
Al usar una UI de pantalla completa, oculta todo lo demás

Si tu pantalla de pausa o inicio cubre todo lo demás en la escena, desactiva la cámara que está renderizando la escena 3D. Del mismo modo, desactiva cualquier elemento de Canvas de fondo oculto detrás del Canvas superior.

Considera reducir el Application.targetFrameRate durante una UI de pantalla completa, ya que no deberías necesitar actualizar a 60 fps.

Asigna la Cámara a Canvases de Espacio Mundial y Espacio de Cámara

Dejar el campo Event o Render Camera en blanco obliga a Unity a llenar Camera.main, lo cual es innecesariamente costoso.

Considera usar Screen Space – Overlay para tu Canvas RenderMode si es posible, ya que eso no requiere una cámara.

Imagen del cuadro de diálogo de los lienzos del espacio de la cámara con un fondo atenuado y texto blanco.
Al usar el Modo de Renderizado en Espacio Mundial, asegúrate de completar la Cámara de Eventos.
Audio

Aunque el audio no suele ser un cuello de botella en el rendimiento, aún puedes optimizar para ahorrar memoria.

Cuadro de diálogo del Inspector con fondo gris y texto blanco con un modulador de voz naranja en la parte inferior.
Optimiza la Configuración de Importación de tus Clips de Audio.
Usa archivos WAV originales sin comprimir como tus activos de origen cuando sea posible.

Si usas algún formato comprimido (como MP3 o Vorbis), Unity lo descomprimirá y luego lo recomprimirá durante el tiempo de construcción. Esto resulta en dos pasadas con pérdida, degradando la calidad final.

Comprime el clip y reduce la tasa de bits de compresión.

Reduce el tamaño de tus clips y el uso de memoria con compresión:

  • Usa Vorbis para la mayoría de los sonidos (o MP3 para sonidos que no están destinados a repetirse).
  • Usa ADPCM para sonidos cortos y utilizados con frecuencia (por ejemplo, pasos, disparos). Esto reduce el tamaño de los archivos en comparación con PCM sin comprimir, pero es rápido de decodificar durante la reproducción.

Los efectos de sonido en dispositivos móviles deben ser de 22,050 Hz como máximo. Usar configuraciones más bajas generalmente tiene un impacto mínimo en la calidad final; usa tus propios oídos para juzgar.

Elige el tipo de carga adecuado.

La configuración varía según el tamaño del clip.

  • Clips pequeños (< 200 kb) deben descomprimirse al cargar. Esto incurre en un costo de CPU y memoria al descomprimir un sonido en datos de audio PCM sin procesar de 16 bits, por lo que solo es deseable para sonidos cortos.
  • Los clips medianos (>= 200 kb) deben permanecer Comprimidos en memoria.
  • Los archivos grandes (música de fondo) deben configurarse a Streaming, de lo contrario, todo el recurso se cargará en memoria de una vez.
Descargar AudioSources silenciados de la memoria

Al implementar un botón de silencio, no simplemente establezcas el volumen en 0. Puedes Destruir el componente AudioSource para descargarlo de la memoria, siempre que el jugador no necesite alternar esto con frecuencia.

Descarga los consejos completos de rendimiento para móviles

En la próxima publicación del blog, nos adentraremos en gráficos y activos. Pero si deseas acceso a la lista completa de consejos y trucos del equipo hoy, nuestro e-book completo está disponible aquí.

Imagen de la portada del ebook con fondo rojo y un gráfico de un juego de aventura con un dragón y las palabras "Optimiza el rendimiento de tu juego para dispositivos móviles" en texto blanco en negrita.

DESCARGAR E-BOOK

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

Mantente atento a más consejos de rendimiento

Queremos ayudarte a hacer que tus aplicaciones de Unity sean lo más eficientes posible, así que si hay algún tema de optimización sobre el que te gustaría saber más, por favor mantennos informados en los comentarios.