Optimice el rendimiento de sus juegos móviles: Obtenga consejos de expertos sobre física, interfaz de usuario y configuración de audio.

Nuestro equipo de Éxito Integrado apoya a los clientes de Unity con sus problemas técnicos complejos. Nos sentamos con este equipo de ingenieros de software senior y les pedimos que compartieran parte de su experiencia en optimización de juegos móviles.
Nuestro equipo de Accelerate Solutions conoce el código fuente al dedillo y trabaja con una gran cantidad de clientes de Unity para ayudarlos a aprovechar el motor al máximo. En su trabajo, profundizan en los proyectos de los creadores para ayudar a identificar puntos en los que se podría optimizar el rendimiento para lograr una mayor velocidad, estabilidad y eficiencia.
A medida que nuestros ingenieros comenzaron a compartir sus conocimientos sobre la optimización de juegos móviles, rápidamente nos dimos cuenta de que había demasiada información excelente para la única publicación del blog que habíamos planeado. En lugar de eso, decidimos convertir su montaña de conocimientos en un libro electrónico completo (que puede 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 esta serie, nos centraremos 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 creación de perfiles, memoria y arquitectura de código, y estate atento a la próxima, dedicada a activos, configuración de proyectos y gráficos.
¿Lo quieres todo ahora? Descargue el libro electrónicogratuito .
¡Vamos directo al grano!
La física integrada de Unity (Nvidia PhysX) puede ser costosa en dispositivos móviles, pero los siguientes consejos pueden ayudarte a obtener más cuadros por segundo.
En PlayerSettings, marque Prebake Collision Meshes siempre que sea posible.

Asegúrese de editar su configuración de Física (Configuración del proyecto > Física) y simplificar su Matriz de colisión de capas siempre que sea posible.
Deshabilite las transformaciones de sincronización automática y habilite la reutilización de devoluciones de llamadas de colisión.


Los colisionadores de malla pueden ser costosos. Sustituya los colisionadores de malla más complejos por colisionadores de malla primitivos o simplificados para aproximarse a la forma original.

Utilice métodos de clase como MovePosition o AddForce para mover sus objetos Rigidbody . Traducir directamente sus componentes de transformación puede dar lugar a nuevos cálculos del mundo físico, que son costosos en escenas complejas. Mover cuerpos físicos en FixedUpdate en lugar de Update.
El paso de tiempo fijo predeterminado en la configuración del proyecto es 0,02 (50 Hz). Cambie esto para que coincida con su velocidad de cuadros objetivo (por ejemplo, 0,03 para 30 fps).
Sin embargo, si la velocidad de cuadros disminuye durante el tiempo de ejecución, esto significa que Unity llamaría a FixedUpdate varias veces por cuadro y potencialmente crearía un problema de rendimiento de la CPU con contenido con mucha física.
El paso de tiempo máximo permitido limita la cantidad de tiempo que los cálculos físicos y los eventos FixedUpdate pueden usar en caso de que la velocidad de cuadros disminuya. Reducir este valor significa que durante una falla en el rendimiento, la física y la animación podrían ralentizarse, al tiempo que se reduce su impacto en la velocidad de cuadros.

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

Para obtener más información, consulte Visualización de depuración de física en la documentación de Unity .
La Unity UI (UGUI) a menudo puede ser 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 resultar costoso, así que tenga en cuenta los siguientes factores al trabajar con UGUI.
Si tiene un Canvas grande con miles de elementos, actualizar un solo elemento de la interfaz de usuario obliga a que todo el Canvas se actualice, lo que potencialmente puede generar un pico de CPU.
Aproveche la capacidad de UGUI para admitir múltiples Canvas. Divida los elementos de la interfaz de usuario según la frecuencia con la que necesitan actualizarse. Mantenga los elementos de la interfaz de usuario estáticos en un lienzo separado y los elementos dinámicos que se actualizan al mismo tiempo en sublienzos más pequeños.
Asegúrese de que todos los elementos de la interfaz de usuario dentro de cada lienzo tengan el mismo valor Z, materiales y texturas.
Es posible que tengas elementos de interfaz de usuario que solo aparezcan esporádicamente en el juego (por ejemplo, una barra de salud que aparece cuando un personaje recibe daño). Si su elemento UI invisible está activo, es posible que aún esté usando llamadas de dibujo. Deshabilite explícitamente cualquier componente de interfaz de usuario invisible y vuelva a habilitarlo según sea necesario.
Si solo necesita desactivar la visibilidad del Canvas, deshabilite el componente Canvas en lugar de GameObject. Esto puede ahorrar la reconstrucción de mallas y vértices.
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 de RectTransform de una interfaz de usuario.
Eliminar el GraphicRaycaster predeterminado del lienzo superior en la jerarquía. En su lugar, agregue GraphicRaycaster exclusivamente a los elementos individuales que necesitan interactuar (botones, barras de desplazamiento, etc.).

Además, deshabilite Raycast Target en todos los textos e imágenes de la interfaz de usuario que no lo necesiten. Si la interfaz de usuario es compleja con muchos elementos, todos estos pequeños cambios pueden reducir los cálculos innecesarios.

Los grupos de diseño se actualizan de manera ineficiente, por lo que conviene utilizarlos con moderación. Evítelos por completo si su contenido no es dinámico y utilice anclas para diseños proporcionales. De lo contrario, cree un código personalizado para deshabilitar los componentes del grupo de diseño después de configurar la interfaz de usuario.
Si necesita utilizar grupos de diseño (Horizontal, Vertical, Cuadrícula) para sus elementos dinámicos, evite anidarlos para mejorar el rendimiento.

Las vistas de listas y cuadrículas grandes son costosas. Si necesita crear una vista de lista o cuadrícula grande (por ejemplo, una pantalla de inventario con cientos de elementos), considere reutilizar un grupo más pequeño de elementos de IU en lugar de crear un elemento de IU para cada elemento. Consulte este proyecto de muestra de GitHub para ver esto en acción.
La superposición de muchos elementos de la interfaz de usuario (por ejemplo, cartas apiladas en un juego de batalla de cartas) crea un sobregiro. Personalice su código para fusionar elementos en capas en tiempo de ejecución en menos elementos y lotes.
Dado que ahora los dispositivos móviles utilizan resoluciones y tamaños de pantalla muy diferentes, es necesario crear versiones alternativas de la interfaz de usuario para brindar la mejor experiencia en cada dispositivo.
Utilice el Simulador de dispositivo para obtener una vista previa de la interfaz de usuario en una amplia gama de dispositivos compatibles. También puedes crear dispositivos virtuales en XCode y Android Studio.

Si la pantalla de pausa o inicio cubre todo lo demás en la escena, desactive la cámara que está renderizando la escena 3D . Del mismo modo, deshabilite cualquier elemento de fondo del Canvas que esté oculto detrás del Canvas superior.
Considere reducir Application.targetFrameRate durante una interfaz de usuario de pantalla completa, ya que no debería necesitar actualizar a 60 fps.
Dejar el campo Evento o Cámara de renderizado en blanco obliga a Unity a completar Camera.main, lo que resulta innecesariamente costoso.
Si es posible, considere usar Screen Space – Overlay para su Canvas RenderMode , ya que eso no requiere una cámara.

Aunque el audio normalmente no es un cuello de botella en el rendimiento, aún puedes optimizarlo para ahorrar memoria.

Si utiliza algún formato comprimido (como MP3 o Vorbis), Unity lo descomprimirá y luego lo volverá a comprimir durante el tiempo de compilación. Esto da como resultado dos pasadas con pérdida, lo que degrada la calidad final.
Reduce el tamaño de tus clips y el uso de memoria con la compresión:
- Utilice Vorbis para la mayoría de los sonidos (o MP3 para sonidos que no están destinados a reproducirse en bucle).
- Utilice ADPCM para sonidos cortos y utilizados con frecuencia (por ejemplo, pasos, disparos). Esto reduce los archivos en comparación con el 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. El uso de configuraciones más bajas generalmente tiene un impacto mínimo en la calidad final; use sus propios oídos para juzgar.
La configuración varía según el tamaño del clip.
- Los clips pequeños (< 200 kb) deben Descomprimir al cargar. Esto genera un costo de CPU y memoria al descomprimir un sonido en datos de audio PCM de 16 bits, por lo que solo es deseable para sonidos cortos.
- Los clips medianos (>= 200 kb) deben permanecer comprimidos en la memoria.
- Los archivos grandes (música de fondo) deben configurarse en Transmisión; de lo contrario, todo el activo se cargará en la memoria a la vez.
Al implementar un botón de silencio, no establezca simplemente el volumen en 0. Puede destruir el componente AudioSource para descargarlo de la memoria, siempre que el reproductor no necesite activarlo y desactivarlo muy a menudo.
En la próxima publicación del blog, profundizaremos directamente en los gráficos y los activos. Pero si desea acceder a la lista completa de consejos y trucos del equipo actual, nuestro libro electrónico completo está disponible aquí.

Si está interesado en obtener más información sobre los servicios de soporte integrado y desea brindarle a su equipo acceso directo a ingenieros, asesoramiento de expertos y orientación sobre las mejores prácticas para sus proyectos, consulte los planes de éxito de Unity aquí.
Queremos ayudarte a que tus aplicaciones Unity tengan el mayor rendimiento posible, así que si hay algún tema de optimización sobre el que te gustaría saber más, mantennos informado en los comentarios.