0% encontró este documento útil (0 votos)
78 vistas92 páginas

Optimización de Juegos Móviles en Unity

Este documento promueve el uso del Unity Profiler para optimizar el rendimiento de los juegos para móviles mediante la detección de cuellos de botella y el seguimiento del uso de recursos. Recomienda perfilar temprano y con frecuencia, tanto en el editor como en los dispositivos de destino, para guiar las optimizaciones y comparar los cambios.

Cargado por

Juan Javier
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
78 vistas92 páginas

Optimización de Juegos Móviles en Unity

Este documento promueve el uso del Unity Profiler para optimizar el rendimiento de los juegos para móviles mediante la detección de cuellos de botella y el seguimiento del uso de recursos. Recomienda perfilar temprano y con frecuencia, tanto en el editor como en los dispositivos de destino, para guiar las optimizaciones y comparar los cambios.

Cargado por

Juan Javier
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Suscríbete a DeepL Pro para poder editar este documento.

Entra en [Link]/pro para más información.

UNITY PARA JUEGOS UNITY 2020 LTS EDITION | E-BOOK

Optimice su

Rendimiento
de los juegos
para móviles
Contenido

Introducción . 3

Perfiles . 4

Memoria . 10

Rendimiento adaptativo . 14

Programación y arquitectura del código. 16

Configuración del proyecto . 22

Activos . 24

Optimización de gráficos y GPU. 29

Interfaz de usuario . 37

Audio . 41

Animación. 43

La física. 45

Flujo de trabajo y colaboración . 48

Éxito de la Unidad Integrada . 50

Conclusión. 51
Introducción
La optimización de sus aplicaciones para iOS y Android es un elemento esencial
proceso que sustenta todo el ciclo de desarrollo. Móviles
El hardware sigue evolucionando, y la optimización de un juego
para móviles -junto
con su arte, diseño de juego, audio y estrategia de monetización
- desempeña un papel fundamental en la configuración de la experiencia del jugador.

Tanto iOS como Android tienen bases de usuarios activos de miles de millones.
Si su juego para móviles está muy optimizado, tiene más posibilidades
al pasar la certificación de las tiendas específicas de la plataforma. Para maximizar
su oportunidad de éxito en el lanzamiento y más allá, su objetivo
es
siempre doble: construir la experiencia
más hábil y envolvente y hacerla funcionar en la más amplia gama de
dispositivos portátiles.

Esta guía reúne conocimientos y consejos de los expertos de Unity


equipo de ingenieros de software. Los juegos de Accelerate Solutions de Unity
se ha asociado con desarrolladores de toda la industria para
ayudar a
lanzar los mejores juegos posibles. Sigue los pasos que se indican
aquí para
obtener el mejor rendimiento de tu juego para móviles y reducir
su consumo de energía.

Tenga en cuenta que muchas de las optimizaciones que se comentan aquí pueden
introducir
complejidad adicional, lo que puede suponer un mantenimiento extra y
posibles fallos. Equilibre las ganancias de rendimiento con el
tiempo y el coste de la mano de obra a la hora de aplicar estas mejores
prácticas.

¡Feliz optimización de parte del equipo de Unity!


2021 Unity Technologies 3 de 52 | [Link]
Utilice el Unity Profiler para probar el rendimiento y la asignación de recursos de su aplicación.

Perfilado
El Perfilador de Unity puede ayudarle a detectar las
causas de
cualquier retraso o congelación durante el tiempo de
ejecución o entender lo que está
sucediendo en un marco específico (punto en el tiempo).
Habilite el
La CPU y la memoria se monitorizan por defecto. Puedes
supervisar
otros módulos del Profiler (como el renderizador, el audio,
la
física, etc.) si tienes necesidades específicas para tu
juego
(por ejemplo, un juego con mucha física o basado en la
música).

Construya la aplicación en su dispositivo marcando


Desarrollo Build y Autoconnect Profiler,
o conectarse manualmente para acelerar el tiempo de inicio de la aplicación.

Elija el objetivo a perfilar. El botón Grabar


rastrea varios segundos de la reproducción
de su aplicación (300 fotogramas por defecto). Vaya a
Unity > Preferencias > .
Analysis > Profiler > Frame Count para aumentar esto
hasta 2000 si usted necesita capturas más largas. Esto
significa
que el Editor de Unity tiene que hacer más trabajo de CPU
y
ocupa más memoria, pero puede ser útil dependiendo de
su escenario específico.

2021 Unity Technologies 4 de 52 | [Link]


Utiliza la vista de la línea de tiempo para determinar si estás limitado por la CPU o por la GPU.

Este es un perfilador basado en la instrumentación que perfila los tiempos del código
explícitamente envuelto
en ProfileMarkers (como los métodos Start o Update de Monobehaviour o llamadas
API específicas). También, cuando usted está utilizando la configuración de Deep
Profiling, Unity puede perfilar el
comienzo y el final de cada llamada de función en su código de script para decirle
exactamente qué
parte de su aplicación está causando una desaceleración (pero esto viene con una
sobrecarga adicional).

Al perfilar tu juego, te recomendamos que cubras tanto los picos como el coste de un
fotograma medio en tu juego. Comprender y optimizar las operaciones caras que se
producen en cada fotograma puede ser más útil para las aplicaciones que se ejecutan por
debajo de la velocidad de fotogramas objetivo.
Cuando busques picos, explora primero las operaciones caras (por ejemplo, física, IA,
animación)
y la recolección de basura.

Haga clic en la ventana para analizar un fotograma específico. A continuación,


utilice la línea de tiempo o la vista de jerarquía:

- Jerarquía muestra la jerarquía de ProfileMarkers, agrupados. Esto permite


ordenar las muestras en función del coste del tiempo en milisegundos (Time ms
y
Self ms). También puede contar el número de llamadas a una función y la
memoria heap
gestionada (GC Alloc) en este marco.
- La línea de tiempo muestra un desglose visual de los tiempos del marco específico.
Esto te
permite visualizar cómo se relacionan las actividades entre sí y a través de
diferentes
hilos. Utilízalo para determinar si estás limitado por la CPU o por la GPU.

2021 Unity Technologies 5 de 52 | [Link]


La vista de jerarquía permite ordenar los ProfileMarkers por coste de tiempo.

Lea una descripción completa del Unity Profiler aquí. Aquellos que son nuevos en
la creación de perfiles
también pueden ver esta Introducción a la creación de perfiles de Unity.

Antes de optimizar cualquier cosa en su proyecto, guarde el archivo .data de


Profiler. Implementa
tus cambios y compara los .data guardados antes y después de la modificación.
Confía en este ciclo para mejorar el rendimiento: perfilar, optimizar y comparar.
Después, aclara y repite.

Perfiles tempranos y frecuentes

El Unity Profiler proporciona información sobre el rendimiento de su aplicación, pero


no puede ayudarle si no lo utiliza. Haga un perfil de su proyecto al principio del
desarrollo, no sólo cuando esté cerca del lanzamiento. Investigue los fallos o picos de
rendimiento tan pronto como aparezcan. A medida que desarrolle una "firma de
rendimiento" de su proyecto, podrá detectar nuevos problemas más fácilmente.

No optimice a ciegas

No hagas conjeturas ni suposiciones sobre lo que está frenando el rendimiento de tu juego.


Utilice el Unity Profiler y las herramientas específicas de la plataforma para localizar lo que, específicamente,
es
causando el retraso.

2021 Unity Technologies 6 de 52 | [Link]


Además, no todas las optimizaciones descritas aquí se aplicarán a su
aplicación.
Algo que funciona bien en un proyecto puede no trasladarse al suyo.
Identifica los verdaderos cuellos de botella y concentra tus esfuerzos en
ellos.

Perfil en el dispositivo de destino

Si bien la creación de perfiles en el Editor puede darle una idea muy aproximada de la
rendimiento de los distintos sistemas en tu juego, no hay nada que sustituya a
la
realidad. Siempre que sea posible, perfila una versión de desarrollo en los
dispositivos de destino.
Recuerde que debe perfilar y optimizar para el dispositivo de menor especificación que planea soportar.

El Unity Profiler por sí solo no puede ver todas las partes del motor. Afortunadamente,
tanto iOS como Android incluyen herramientas nativas para ayudarte a probar el
rendimiento:

- En iOS, utiliza Xcode e Instruments.

- En Android, utiliza Android Studio y Android Profiler.

Cierto hardware también puede aprovechar herramientas


de perfilado adicionales (por ejemplo, Arm Mobile Studio, Intel VTune y
Snapdragon Profiler).
Consulte Perfiles de aplicaciones hechas con Unity para obtener más
información.

Utilizar el analizador de perfiles

Esta herramienta le permite agregar múltiples cuadros de datos de Profiler, y luego


localizar los cuadros
de interés. ¿Quieres ver lo que ocurre con el Profiler después de hacer un cambio
en
tu proyecto? La vista de comparación le permite cargar y diferenciar dos conjuntos
de datos, lo
cual es vital para probar los cambios y mostrar las mejoras. El Analizador de
Perfiles está
disponible a través del Gestor de Paquetes de Unity.
2021 Unity Technologies 7 de 52 | [Link]
¿Necesita profundizar en los datos de los fotogramas y los marcadores? El analizador de perfiles complementa al Profiler existente.

Trabajar con un presupuesto de tiempo específico por cuadro

Cada fotograma tendrá un presupuesto de tiempo basado en su objetivo de


fotogramas por segundo (fps).
Lo ideal es que una aplicación que se ejecute a 30 fps permita aproximadamente
33,33 ms por
fotograma (1000 ms / 30 fps). Asimismo, un objetivo de 60 fps deja 16,66 ms por
fotograma.

Sin embargo, en el caso de los móviles, no se puede utilizar este tiempo de forma
constante porque el dispositivo se
sobrecalentará y el sistema operativo acelerará térmicamente la CPU y la GPU.
Recomendamos que
sólo utilices alrededor del 65% del tiempo disponible para permitir el enfriamiento entre
fotogramas. Un presupuesto de fotogramas
típico será de aproximadamente 22 ms por fotograma a 30 fps y 11 ms por
fotograma a 60 fps.

Los dispositivos pueden sobrepasar esto durante períodos cortos de tiempo (por
ejemplo, para las escenas o las secuencias de carga), pero no durante una duración
prolongada.
2021 Unity Technologies 8 de 52 | [Link]
Determine si está vinculado a la GPU o a la CPU

El Perfilador puede decirte si tu CPU está tardando más que tu presupuesto de


fotogramas asignado o si el culpable es tu GPU.

Si ve el marcador [Link], el hilo de renderizado está listo, pero


puede estar esperando un cuello de botella en el hilo principal.

Si encuentras frecuentemente [Link], significa que el hilo principal


estaba listo pero estaba esperando a que la GPU presentara el cuadro.

Tener en cuenta la temperatura del dispositivo

La mayoría de los dispositivos móviles no disponen de refrigeración activa como


sus homólogos de sobremesa. Los niveles de calor físico pueden afectar
directamente al rendimiento.

Si el dispositivo se calienta, Profiler puede informar de un bajo rendimiento,


aunque no sea motivo de preocupación. Combate la sobrecarga de perfiles
realizando perfiles en ráfagas
cortas para mantener el dispositivo fresco y simular las condiciones del mundo
real.

Prueba en un dispositivo con especificaciones mínimas

Existe una amplia gama de dispositivos iOS y Android. Prueba tu proyecto en


las especificaciones
mínimas del dispositivo que quieres que soporte tu aplicación.
2021 Unity Technologies 9 de 52 | [Link]
Memoria
Unity emplea la gestión automática de la memoria para su código
y scripts generados por el usuario. Las piezas pequeñas de datos, como las
variables locales de valor, se asignan
a la pila. Las piezas más grandes de datos y el almacenamiento a largo plazo se
asignan al
montón gestionado.

El recolector de basura (GC) identifica y reasigna periódicamente la memoria de la


pila no utilizada. Aunque esto se ejecuta automáticamente, el proceso de examinar
todos los objetos de la pila puede hacer que el juego se tambalee o funcione
lentamente.

Optimizar el uso de la memoria significa ser consciente de cuándo se asigna y se


desasigna la memoria del montón y minimizar el efecto de la recolección de basura.

Para más información, consulte la sección "Comprender el montón gestionado".


2021 Unity Technologies 10 de 52 | [Link]
Capturar, inspeccionar y comparar instantáneas en el Memory Profiler.

Utilizar el perfil de memoria

Este complemento independiente (disponible como paquete Experimental o de


Vista Previa en el Gestor de Paquetes) puede tomar una instantánea de la memoria
de la pila gestionada, ayudándole a detectar problemas como la fragmentación y
las fugas de memoria.

Haga clic en la vista de mapa del árbol para rastrear una variable hasta el objeto
nativo que retiene la memoria. Aquí puedes identificar problemas comunes de
consumo de memoria, como texturas excesivamente grandes o activos
duplicados.

Vea cómo puede utilizar el Memory Profiler en Unity para mejorar el uso de la
memoria.
También puedes consultar la documentación oficial del Memory Profiler.

Reducir el impacto de la recolección de basura (GC)

Unity utiliza el recolector de basura Boehm-Demers-Weiser, que detiene


la ejecución del código de su programa y sólo reanuda la ejecución normal
cuando ha
terminado su trabajo.
2021 Unity Technologies 11 de 52 | [Link]
Tenga cuidado con ciertas asignaciones innecesarias de la pila, que podrían causar picos de GC:

- Cadenas: En C#, las cadenas son tipos de referencia, no tipos de valor. Reduzca la
creación o manipulación innecesaria
de cadenas. Evite analizar archivos de datos basados en cadenas como
como JSON y XML; almacenar datos en ScriptableObjects o formatos como
MessagePack o Protobuf. Utilice la clase StringBuilder si necesita
construir cadenas en tiempo de ejecución.

- Llamadas a funciones de Unity: Tenga en cuenta que algunas funciones crean


asignaciones en el montón.
Guarde en caché las referencias a las matrices en lugar de asignarlas en medio
de un bucle.
Además, aproveche ciertas funciones que evitan la generación de basura;
por ejemplo, utilice [Link] en lugar de comparar
manualmente una cadena con [Link] (devolver una nueva cadena
crea basura).

- Boxeo: Evite pasar una variable de tipo valor en lugar de una variable de tipo
referencia
. Esto crea un objeto temporal, y la basura potencial que
viene con él (por ejemplo, int i = 123; objeto o = i) convierte implícitamente el
tipo de valor a un objeto de tipo.

- Coroutines: Aunque yield no produce basura, la creación de una nueva


El objeto WaitForSeconds lo hace. Almacena y reutiliza el objeto
WaitForSeconds en lugar de crearlo en la línea de rendimiento.

- LINQ y Expresiones Regulares: Ambas generan basura de boxeo entre


bastidores. Evita LINQ y las expresiones regulares si el
rendimiento es un problema.

Cronometrar la recogida de basuras si es posible

Si estás seguro de que una congelación de la recolección de basura no afectará


a un punto específico de tu juego, puedes activar la recolección de basura con
[Link].

Consulte la sección sobre la gestión automática de la memoria para ver ejemplos


en los que
podría utilizar esto en su beneficio.
2021 Unity Technologies 12 de 52 | [Link]
Utilizar el recolector de basura incremental para dividir la carga de trabajo de GC

En lugar de utilizar una única y larga interrupción de la ejecución de su programa, los incrementos
La recolección de basura utiliza múltiples interrupciones mucho más cortas, distribuyendo la
carga de trabajo a lo largo de muchos fotogramas. Si la recolección de basura está afectando al rendimiento, intente
habilitando esta opción para ver si puede reducir significativamente el problema de los
picos de GC. Utilice el analizador de perfiles para verificar el beneficio de su aplicación.

Utilice el recolector de basura incremental para reducir los picos de GC.

2021 Unity Technologies 13 de 52 | [Link]


Rendimiento adaptativo
Con Unity y el Adaptive Performance de Samsung, puedes controlar el
estado térmico y de energía para asegurarte de que estás preparado para reaccionar
adecuadamente. Cuando los usuarios juegan durante un periodo de tiempo
prolongado, puedes reducir tu nivel de detalle (o LOD) de forma dinámica para
ayudar a que tu juego siga funcionando sin problemas. El Rendimiento Adaptativo
permite a los desarrolladores aumentar el rendimiento de forma
controlada manteniendo la fidelidad de los gráficos.

Aunque puede utilizar las API de rendimiento adaptativo para ajustar su aplicación,
este paquete también ofrece modos automáticos. En estos modos, el Rendimiento
Adaptativo determina los ajustes del juego según varias métricas clave:

- Velocidad de fotogramas deseada en función de los

fotogramas anteriores - Nivel de temperatura del

dispositivo

- Proximidad del dispositivo al evento térmico

- Dispositivo vinculado a la CPU o a la GPU

Estas cuatro métricas dictan el estado del dispositivo, y el Rendimiento Adaptativo


ajusta la configuración para reducir el cuello de botella. Esto se hace proporcionando
un valor entero, conocido como indexador, para describir el estado del dispositivo.

2021 Unity Technologies 14 de 52 | [Link]


Ten en cuenta que el Rendimiento Adaptativo sólo funciona en los dispositivos Samsung.

Para saber más sobre el Rendimiento Adaptativo, puedes ver


las
muestras que hemos proporcionado en el Gestor de Paquetes
seleccionando
Gestor de Paquetes > Rendimiento Adaptativo >
Muestras.
Cada muestra interactúa con un escalador específico, para que
puedas
ver cómo los diferentes escaladores afectan a tu juego.
También te
recomendamos que consultes la Documentación del usuario
final para saber
más sobre las configuraciones de Rendimiento adaptable y
cómo
puedes interactuar directamente con la API.
2021 Unity Technologies 15 de 52 | [Link]
Programación y
arquitectura del
código
El PlayerLoop de Unity contiene funciones para interactuar con el núcleo del
motor del
juego. Esta estructura en forma de árbol incluye un número de sistemas que
manejan la inicialización y las actualizaciones por cuadro. Todos sus scripts
dependerán de este
PlayerLoop para crear el juego.

Al perfilar, verás todo el código de usuario de tu proyecto bajo el PlayerLoop


(con componentes del Editor bajo el EditorLoop).

Tus scripts, ajustes y gráficos personalizados pueden influir significativamente en el tiempo que tarda cada fotograma en cal cularse y representarse en la pantalla.

Puedes optimizar tus guiones con estos consejos y trucos.

Entender el PlayerLoop de Unity

Asegúrese de entender el orden de ejecución del bucle de


cuadros de Unity. Cada script de Unity ejecuta varias
funciones de eventos
en un orden predeterminado. Debe entender la diferencia
entre Awake, Start, Update y otras funciones que crean
el ciclo de vida de un script.

Consulte el diagrama de flujo del ciclo de vida de los scripts


para conocer el orden
específico de ejecución de las funciones de los eventos.

Minimizar el código que se ejecuta en cada fotograma

Considere si el código debe ejecutarse en cada fotograma.


Mover la lógica innecesaria fuera de Update, LateUpdate,
y FixedUpdate. Estas funciones de evento son lugares
convenientes
para poner el código que debe actualizarse cada fotograma,
pero extraer
cualquier lógica que no necesite actualizarse con esa
frecuencia.
Entender el PlayerLoop y el ciclo de vida de un script. Siempre que sea posible, ejecute la lógica sólo cuando las cosas cambien.

2021 Unity Technologies 16 de 52 | [Link]


Si necesita utilizar la actualización, considere la posibilidad de ejecutar el código
cada n fotogramas. Esta es una forma de aplicar el time slicing, una técnica
común para distribuir una carga de trabajo pesada en múltiples fotogramas. En
este ejemplo, ejecutamos la función
ExampleExpensiveFunction una vez cada tres fotogramas:

private int interval = 3;

void Actualizar()
{
si ([Link] % interval == 0)
{
ExampleExpensiveFunction();
}
}

Evitar la lógica pesada en el arranque/despertar

Cuando tu primera escena se carga, estas funciones son llamadas para cada objeto:

- Despierta

- OnEnable
- Inicio

Evite la lógica costosa en estas funciones hasta que su aplicación renderice su


primer
cuadro. De lo contrario, puede encontrar tiempos de carga más largos de lo
necesario.

Consulte el orden de ejecución de las funciones de eventos para obtener


detalles sobre la primera
carga de la escena.

Evite los eventos vacíos de Unity

Incluso los MonoBehaviour vacíos requieren recursos, por lo que debería


eliminar los métodos Update o LateUpdate vacíos.

Utilice las directivas del preprocesador si utiliza estos métodos para las pruebas:

#if UNITY_EDITOR
void Actualizar()
{
}
#endif

Aquí, usted puede utilizar libremente la actualización en el editor para


las pruebas sin la sobrecarga innecesaria que se desliza en su
construcción.
2021 Unity Technologies 17 de 52 | [Link]
Eliminar las declaraciones del registro de depuración

Las sentencias de registro (especialmente en Update, LateUpdate o


FixedUpdate) pueden reducir el rendimiento. Desactive las sentencias Log antes
de realizar una compilación.

Para hacer esto más fácilmente, considere hacer un atributo Condicional


junto con
una directiva de preprocesamiento. Por ejemplo, cree una clase personalizada
como esta:

public static class Registro


{
[[Link]("ENABLE_LOG")]
static public void Log(object message)
{
[Link](mensaje);
}
}

La adición de una directiva de preprocesador personalizada le permite dividir sus scripts.

Genere su mensaje de registro con su clase personalizada. Si desactiva el


ENABLE_LOG en la configuración del reproductor, todas sus declaraciones de
registro desaparecen de un plumazo.

Utilizar valores hash en lugar de parámetros de cadena

Unity no utiliza nombres de cadena para dirigirse a las propiedades del


Animator, Material, y Shader internamente. Para la velocidad, todos los
nombres de las propiedades son hash en IDs de propiedades, y estos IDs son
realmente utilizados para dirigir las propiedades.

Siempre que se utilice un método Set o Get en un Animator, Material o Shader,


utilizar el método de valores enteros en lugar de los métodos de valores de cadena.
Los métodos de cadena simplemente realizan el hash de la cadena y luego
envían el ID hash a los métodos de valores enteros.

Utilice [Link] para los nombres de las propiedades de Animator y


[Link]
para los nombres de las propiedades de Material y Shader.
2021 Unity Technologies 18 de 52 | [Link]
Elegir la estructura de datos adecuada

La elección de la estructura de datos puede tener un efecto acumulativo en la


eficiencia o
la ineficacia al iterar muchos miles de veces por cuadro. ¿Hace
¿Tiene más sentido utilizar una Lista, una Matriz o un Diccionario para su
colección? Siga la guía de
MSDN sobre estructuras de datos en C# como guía general para elegir la
estructura
correcta.

Evite añadir componentes en tiempo de ejecución

Invocar AddComponent en tiempo de ejecución viene con algún costo. Unity debe
comprobar si hay componentes
duplicados u otros requeridos siempre que se añadan componentes en tiempo de
ejecución.

Instanciar un Prefab con los componentes deseados ya configurados suele


ser más eficaz.

Caché de GameObjects y componentes

[Link], [Link], y [Link] (en versiones


anteriores a la 2020.2) pueden ser costosos, así que evite llamarlos en los métodos
Update. En su lugar, llámelos en Start y guarde en caché los resultados.

Por ejemplo, esto demuestra el uso ineficiente de una llamada repetida a GetComponent:

void Actualizar()
{
Renderizador myRenderer = GetComponent<Renderer>();
ExampleFunction(myRenderer);
}

En cambio, puede invocar GetComponent sólo una vez, ya que el resultado de la


función se
almacena en caché. El resultado almacenado en caché puede reutilizarse en
Update sin necesidad de realizar más llamadas a
GetComponent.

private Renderer myRenderer;


void Start()
{
miRenderizador = GetComponent<Renderer>();
}

void Actualizar()
{
ExampleFunction(myRenderer);
}
2021 Unity Technologies 19 de 52 | [Link]
Utilizar piscinas de objetos

Instanciar y Destruir puede generar


picos de basura y recolección de basura (GC) y es generalmente un proceso
lento. En lugar de instanciar y destruir
GameObjects con frecuencia (por ejemplo, disparando balas de una pistola),
utilice pools de objetos
preasignados que puedan ser reutilizados y reciclados.

En este ejemplo, el ObjectPool crea 20 instancias de PlayerLaser para su reutilización.

Crear las instancias reutilizables en un


punto del juego (por ejemplo, durante una pantalla de menú
) en el que el pico de la CPU es menos
perceptible. Haz un seguimiento de este "pool" de objetos
con una colección. Durante el juego,
basta con activar la siguiente
instancia disponible cuando sea necesario, desactivar los objetos
en lugar de destruirlos y devolverlos
a la reserva.

Esto reduce el número de asignaciones


gestionadas
en su proyecto y puede
evitar problemas de recolección de
basura.

Aprenda a crear un sistema simple de


Object
Pooling en Unity aquí.

El conjunto de objetos PlayerLaser está inactivo y listo para disparar.


2021 Unity Technologies 20 de 52 | [Link]
Utilizar ScriptableObjects

Almacenar valores o configuraciones invariables en un ScriptableObject en lugar de un


MonoComportamiento. El ScriptableObject es un activo que vive dentro del proyecto
que sólo hay que configurar una vez. No se puede adjuntar directamente a un GameObject.

Cree campos en el ScriptableObject para almacenar sus valores o


configuraciones, luego haga referencia al ScriptableObject en sus
Monobehaviours.

En este ejemplo, un ScriptableObject llamado Inventario mantiene la configuración de varios GameObjects.

El uso de esos campos del ScriptableObject puede evitar la duplicación innecesaria de


datos cada vez que se instancie un objeto con ese Monobehaviour.

Vea este tutorial de Introducción a ScriptableObjects para ver cómo


ScriptableObjects
puede ayudar a su proyecto. También puede encontrar documentación aquí.

2021 Unity Technologies 21 de 52 | [Link]


Configuración del proyecto
Hay algunos ajustes del proyecto que pueden afectar al rendimiento de tu móvil.

Reducir o desactivar la frecuencia del acelerómetro

Unity agrupa el acelerómetro de tu móvil varias veces por segundo.


Desactívelo si no se utiliza en su aplicación, o reduzca su frecuencia para mejorar
el rendimiento.

Asegúrate de que la frecuencia del acelerómetro está desactivada si no la utilizas en tu juego móvil.

Desactivar los ajustes innecesarios del reproductor o de la calidad

En la configuración del reproductor, desactive la API de gráficos automática para las plataformas no compatibles
para evitar que se generen excesivas variantes de sombreado. Desactiva las
arquitecturas de destino para CPUs antiguas si tu aplicación no las soporta.

En los ajustes de calidad, desactive los niveles de calidad

innecesarios. Desactivar la física innecesaria

Si tu juego no utiliza la física, desmarca las opciones Simulación automática y Sincronización automática
Transformaciones. Éstas sólo ralentizarán su aplicación sin ningún beneficio discernible.

2021 Unity Technologies 22 de 52 | [Link]


Elija la velocidad de fotogramas adecuada

Los proyectos móviles deben equilibrar la velocidad de fotogramas con la duración de la batería y la
temperatura
estrangulamiento. En lugar de forzar los límites de tu dispositivo a 60 fps,
considera
correr a 30 fps como un compromiso. Unity está predeterminado a 30 fps para
móviles.

También puede ajustar la velocidad de fotogramas dinámicamente durante el tiempo de ejecución con
[Link]. Por ejemplo, podría incluso bajar
30 fps para escenas lentas o relativamente estáticas y reserva los ajustes de
fps más altos para el
juego.

Evitar las grandes jerarquías

¡Divida sus jerarquías! Si tus GameObjects no necesitan estar anidados


en una jerarquía, simplifica la crianza. Las jerarquías más pequeñas se
benefician de
multithreading para refrescar los Transforms en tu escena. Las jerarquías complejas
incurren en cálculos innecesarios de Transformación y en un mayor costo de
recolección de basura.

Consulte Optimización de la jerarquía y esta charla de Unite para


conocer las mejores prácticas
con las transformaciones.

Transformar una vez, no dos

Además, cuando se muevan los Transforms, utilice


[Link]
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 emparentar y reposicionar durante la instanciación:

[Link](prefab, parent);
[Link](prefab, parent, position, rotation);

Para más detalles sobre [Link], consulte la API de scripting.

Asumir que Vsync está activado

Las plataformas móviles no renderizan medios cuadros. Incluso si desactivas


Vsync en el Editor (Configuración del proyecto > Calidad), Vsync está
activado a nivel de hardware. Si la GPU no puede refrescarse lo suficientemente
rápido, el fotograma actual se mantendrá,
reduciendo efectivamente sus fps.
2021 Unity Technologies 23 de 52 | [Link]
La demo de Boat Attack
se creó con el proyecto
Tubería de renderizado universal.

Activos
La canalización de activos puede tener un impacto dramático en el rendimiento de
su aplicación. Un artista técnico experimentado puede ayudar a su equipo a
definir y aplicar los formatos de los activos, las especificaciones y los ajustes de
importación.

No confíes en la configuración por defecto. Utilice la pestaña de anulación


específica de la plataforma para optimizar
activos como las texturas y la geometría de la malla. Una configuración incorrecta
puede dar lugar a una mayor
tamaños de construcción, tiempos de construcción más largos y un uso
deficiente de la memoria. Considere la posibilidad de utilizar la función de
preajustes para ayudar a personalizar la configuración de referencia para un
proyecto específico y
garantizar una configuración óptima.

Consulte esta guía de mejores prácticas para los activos de arte para
obtener más detalles o consulte
este curso sobre la optimización de arte 3D para aplicaciones móviles
en
Unity Learn.
2021 Unity Technologies 24 de 52 | [Link]
Importar texturas correctamente

La mayor parte de la memoria se destinará a las texturas, por lo que los ajustes
de importación son fundamentales. En general, sigue estas pautas:

- Reduzca el tamaño máximo: Utilice los ajustes


mínimos que producen resultados visualmente
aceptables.
Esto no es destructivo y puede reducir
rápidamente la memoria de la textura.

- Utilice las potencias de dos (POT): La unidad requiere POT


dimensiones de la textura para la compresión de la textura
móvil
formatos (PVRCT o ETC).

- Atlas sus texturas: Colocar múltiples texturas en


una sola textura puede reducir las llamadas de
dibujo y
acelerar el renderizado. Use el SpriteAtlas de Unity o
el Texture Packer de
terceros para atlasear sus texturas.

- Desactivar la opción de Lectura/Escritura habilitada: .


Cuando está activada, esta opción crea una copia en ambos
La memoria direccionable de la CPU y la GPU,
duplicando el espacio de memoria de la
textura. En la mayoría de los casos, mantenga esta
deshabilitado. Si está generando texturas en tiempo
de ejecución, aplique esto a través de
[Link], pasando
makeNoLongerReadable a true.

- Desactivar los mapas Mip innecesarios: Los mapas


Mip no
son necesarios para las texturas que se mantienen
en un tamaño consistente
en pantalla, como los sprites 2D y los gráficos de la interfaz de
usuario
(deje activados los Mapas Mip para los modelos 3D
que varían su distancia de la cámara).

Una configuración adecuada de la importación de texturas ayudará a optimizar el tamaño de la construcción.


2021 Unity Technologies 25 de 52 | [Link]
Comprimir texturas

Considere estos dos ejemplos utilizando el mismo modelo y textura. Los ajustes de la
izquierda consumen casi ocho veces más memoria que los de la derecha,
sin que la calidad visual se vea muy beneficiada.

Las texturas sin comprimir requieren más memoria.

Utilice la compresión de texturas escalable y adaptable (ATSC) tanto para iOS como
para Android. La gran mayoría de los juegos en desarrollo se dirigen a dispositivos con
especificaciones mínimas que
soportan la compresión ATSC.

Las únicas excepciones son:

- Juegos para iOS destinados a dispositivos A7 o inferiores (por ejemplo, iPhone 5, 5S, etc.): utilice
PVRTC

- Juegos para Android dirigidos a dispositivos anteriores a 2016: utiliza ETC2 (Ericsson
Compresión de texturas)

Si la calidad de los formatos comprimidos, como PVRTC y ETC, no es lo


suficientemente alta, y si ASTC no es totalmente compatible con tu plataforma de
destino, intenta utilizar texturas de 16 bits en lugar de las de 32 bits.

Consulte el manual para obtener más información sobre el formato de compresión


de texturas recomendado por la plataforma.

2021 Unity Technologies 26 de 52 | [Link]


Ajustar la configuración de importación de mallas

Al igual que las texturas, las mallas pueden consumir un exceso de memoria si no se importan
con cuidado. Para minimizar el consumo de memoria de las mallas:

- Comprimir la malla: Agresivo


la compresión puede reducir el espacio en disco
(la memoria en tiempo de ejecución, sin
embargo, no se ve afectada).
Ten en cuenta que la cuantificación de la malla
puede dar lugar a
imprecisiones, así que experimenta con los
niveles de compresión
para ver qué funciona para tus modelos.

- Desactivar la lectura/escritura: Activar esta opción


duplica la malla en la memoria, manteniendo
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
anteriores,
esta opción está marcada por defecto).

- Desactivar rigs y BlendShapes: Si su


malla no necesita esqueleto o
animación blendshape, desactive estas
opciones siempre que sea posible.

- Desactive las normales y las tangentes, si es


posible: .
Si está seguro de que el material de la malla no
necesitará normales o tangentes, desactive
estas
opciones para ahorrar.

Comprueba la configuración de la importación de mallas.

Compruebe el recuento de polígonos

Los modelos de mayor resolución implican un mayor uso de la memoria y


potencialmente mayores tiempos de la GPU
. ¿Su geometría de fondo necesita medio millón de polígonos? Considere
la posibilidad de reducir los modelos en el paquete DCC de su elección. Elimine los
polígonos que no se ven desde
el punto de vista de la cámara. Utilice texturas y mapas normales para obtener detalles
finos en lugar de mallas de
alta densidad.

Automatice los ajustes de importación con el AssetPostprocessor

El AssetPostprocessor le permite ejecutar scripts al importar activos.


Esto le permite personalizar los ajustes antes y/o después de importar los
modelos,
texturas, audio, etc.
2021 Unity Technologies 27 de 52 | [Link]
Utilizar el sistema de activos direccionables

El sistema de activos direccionables ofrece una forma simplificada de gestionar su


contenido, cargando los AssetBundles por "dirección" o alias. Este sistema unificado carga
de forma asíncrona desde un
ruta local o una red de
distribución de contenidos (CDN)
remota.

Si divides tus activos no codificados (Modelos, Texturas, Prefabs, Audio, e


incluso Escenas
enteras) en un AssetBundle, puedes separarlos como contenido descargable
(DLC).

A continuación, utilice Addressables para crear una compilación inicial


más pequeña para su
aplicación móvil. La entrega de contenido en la nube te permite alojar y
entregar el
contenido de tu juego a los jugadores a medida que avanzan en el juego.

Cargue los activos por "dirección" utilizando el sistema de activos direccionables.

Haga clic aquí para ver cómo el Sistema de Activos Direccionables puede
eliminar las dificultades de la gestión de
activos.
2021 Unity Technologies 28 de 52 | [Link]
Proyecto de demostración de Boat Attack creado con el Universal Render Pipeline.

Gráficos y .
Optimización de la GPU
En cada fotograma, Unity determina qué objetos deben ser renderizados 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 ejecutan juntas.

A medida que tus proyectos se vuelvan más complejos, necesitarás un pipeline que
optimice la
carga de trabajo de tu GPU. El Universal Render Pipeline (URP) utiliza
actualmente un renderizador de una
sola pasada 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 los materiales basados en la
física de las consolas y los PC también pueden escalarse
a tu teléfono o tableta.
2021 Unity Technologies 29 de 52 | [Link]
Las siguientes pautas pueden ayudarle a acelerar sus gráficos.

Llamar por lotes a los sorteos

La agrupación de los objetos a dibujar minimiza los cambios de estado necesarios para
dibujar cada objeto en un lote. Esto conduce a un mejor rendimiento al reducir el
coste de la CPU para renderizar los 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, y luego dibujarlos todos de una sola vez. Nota: Sólo
utiliza esta opción si
tienes suficientes mallas de bajo poligonaje (menos de 900 atributos de
vértices y
no más de 300 vértices). El batcher dinámico no procesará mallas más
grandes
que esto, por lo que al activarlo se desperdiciará tiempo de CPU en cada
fotograma buscando
para las mallas pequeñas a lote.

- Dosificación estática: Para la geometría sin movimiento, Unity puede reducir el dibujo
llama a cualquier malla que comparta el mismo material. Es más eficiente que
la dosificación dinámica, pero utiliza más memoria.

- Instanciación en la GPU: Si tienes un gran número de objetos idénticos,


esta
técnica los agrupa por lotes de forma más eficiente utilizando el
hardware gráfico.

- SRP Batching: Activa el SRP Batcher en tu Universal Render Pipeline


Asset en Advanced. Esto puede acelerar los tiempos de renderizado de la
CPU
significativamente, dependiendo de la escena.

Organice sus GameObjects para aprovechar estas técnicas de agrupación.


2021 Unity Technologies 30 de 52 | [Link]
Utilizar el depurador de marcos

El depurador de fotogramas muestra cómo se


construye cada fotograma
a partir de llamadas de dibujo individuales.
Se trata de una herramienta inestimable para
solucionar
las propiedades de tus sombreadores y puede
ayudarte a
analizar cómo se renderiza el juego.

¿Eres nuevo en el depurador de marcos?


Consulta esta
introducción aquí.

Evitar demasiadas luces dinámicas

El URP reduce el número de llamadas


de dibujo en comparación con el renderizador
anterior.
Evite añadir 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 la iluminación
horneada para las mallas estáticas.

Para conocer los límites específicos de las


luces en tiempo real de URP y Built-in
Render Pipeline, consulte este
tabla de comparación de características. El depurador de fotogramas rompe cada fotograma en sus pasos separados.

Desactivar las sombras

La proyección de sombras se puede desactivar por MeshRenderer y luz. Desactivar sombras


siempre que sea posible, para reducir las llamadas a filas.

También puedes crear sombras falsas utilizando una textura borrosa aplicada a
una malla simple
o a un quad debajo de tus personajes. Alternativamente, crea sombras blob con
shaders
personalizados.
Desactivar la proyección de sombras para reducir las llamadas de dibujo.

2021 Unity Technologies 31 de 52 | [Link]


Incorporar la iluminación a los mapas de luz

Añada una iluminación espectacular a su estática


geometría utilizando la Iluminación Global
(IG).
Marca los objetos con Contribute GI
para
que puedas almacenar una iluminación
de alta calidad en
forma de Lightmaps.

Las sombras y la iluminación horneadas pueden entonces


sin que el rendimiento se vea afectado en
tiempo de ejecución. La CPU progresiva y
GPU Lightmapper puede acelerar el
cocción de la Iluminación Global. Activar Contribuir GI.

Ajuste la configuración de Lightmapping (Windows > Rendering > Lighting Settings) y el tamaño de Lightmap para limitar el uso de la memoria.

Siga la guía del manual y este artículo sobre la optimización de la


iluminación para obtener ayuda
para comenzar con el Lightmapping en Unity.
2021 Unity Technologies 32 de 52 | [Link]
Utilizar capas de luz

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

Las capas pueden limitar la influencia de la luz a una máscara de selección específica.

Utilice las sondas luminosas para los objetos en movimiento

Las sondas de luz almacenan información lumínica horneada sobre el espacio vacío de su
Escena y proporcionan una iluminación de alta calidad (tanto directa como indirecta). Utilizan
Armónicos esféricos, que se calculan muy rápidamente en comparación con las luces dinámicas.

Las sondas de luz iluminan los objetos dinámicos del fondo.

2021 Unity Technologies 33 de 52 | [Link]


Utilizar el nivel de detalle (LOD)

A medida que los objetos se alejan,


el
Nivel de detalle puede cambiarlos
para
que utilicen mallas más sencillas con
materiales y sombreadores más
simples para ayudar al rendimiento de
la GPU
.

Vea el curso Working with LODs


en Unity Learn para más detalles.

Ejemplo de una malla que utiliza un grupo LOD.

Mallas de origen, modeladas a distintas resoluciones.

Utilice la eliminación de oclusión para eliminar los objetos ocultos

Los objetos ocultos detrás de otros objetos pueden seguir renderizándose y costar
recursos. Utilice la eliminación de oclusiones para descartarlas.

Mientras que la eliminación de frustraciones fuera de la vista de la cámara es automática, la eliminación de oclusiones
es
un proceso de baking. Simplemente marque sus objetos como oclusores estáticos
u oclusores, y
luego bakee a través del diálogo Ventana > Renderizado > Culling de oclusión.
Aunque no es apropiado para todas las escenas, el culling puede mejorar el
rendimiento
en muchos casos.

Para más información, consulte el tutorial sobre la eliminación de oclusiones.

Evitar la resolución nativa de los móviles

Los teléfonos y las tabletas son cada vez más avanzados, y los nuevos
dispositivos tienen resoluciones muy altas.

Utilice [Link](width, height, false) para reducir la resolución de


salida y recuperar algo de rendimiento. Perfila varias resoluciones para encontrar el
mejor
equilibrio entre calidad y velocidad.

2021 Unity Technologies 34 de 52 | [Link]


Limitar el uso de cámaras

Cada cámara incurre en cierta sobrecarga, tanto si hace un trabajo significativo


como si no.
Utiliza sólo los componentes de la cámara que sean necesarios para el
renderizado. En los móviles de gama baja
cada cámara puede utilizar hasta 1 ms de tiempo de CPU.

Mantener la sencillez de los sombreadores

El proceso de renderización universal


incluye varios Lit ligeros
y sombreadores Unlit que ya están
optimizado para plataformas móviles.
Intenta mantener las variaciones de los
sombreadores lo más
bajas posible, ya que esto puede tener
un efecto dramático en el uso de la
memoria
en tiempo de ejecución. Si los
sombreadores URP por defecto
no se adaptan a sus necesidades, puede
Personaliza el aspecto de tus
materiales
utilizando Shader Graph. Descubra
cómo
construir sus sombreadores
visualmente usando
Shader Graph aquí.

Cree sombreadores personalizados con el gráfico de sombreado.

Minimizar el sobredibujo y la mezcla alfa

Evite dibujar imágenes transparentes o semitransparentes innecesarias.


Las plataformas móviles se ven muy afectadas por el sobredibujo y la mezcla
alfa resultantes
. No superponga imágenes o efectos apenas visibles. Puedes comprobar
el sobredibujo utilizando el depurador de gráficos de RenderDoc.

Limitar los efectos del post-procesamiento

Los efectos de posprocesamiento a


pantalla completa,
como los resplandores, pueden
ralentizar drásticamente el
rendimiento. Utilízalos con
precaución
en la dirección artística de tu título.
Mantenga el post-procesamiento simple en las aplicaciones móviles.

2021 Unity Technologies 35 de 52 | [Link]


Cuidado con [Link]

El acceso a [Link] en los 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 en lote,
utilice [Link] en su lugar.

Optimizar SkinnedMeshRenderers

Renderizar mallas despellejadas es caro. Asegúrese de que cada objeto que


utilice un SkinnedMeshRenderer lo requiera. Si un GameObject sólo necesita
animación algunas veces, utilice la función BakeMesh para congelar la malla
skinned en una pose estática, y cambie a un MeshRenderer más simple en tiempo
de ejecución.

Minimizar las sondas de reflexión

Una sonda de reflexión puede crear reflejos realistas, pero esto puede ser muy
costoso
en términos de lotes. Utiliza cubemaps de baja resolución, máscaras de sacrificio
y texturas
para mejorar el rendimiento en tiempo de ejecución.
2021 Unity Technologies 36 de 52 | [Link]
Interfaz de usuario
La interfaz de usuario de Unity (UGUI) es a menudo una fuente de problemas de rendimiento. El lienzo
genera y actualiza las mallas de los elementos de la interfaz de usuario y realiza
llamadas de dibujo a la GPU. Su funcionamiento puede ser costoso, así que ten en
cuenta los siguientes factores cuando trabajes con UGUI.

Divida sus lienzos

Si tienes un gran lienzo con miles de elementos, la actualización de un solo


elemento de la interfaz
de usuario obliga a todo el lienzo a actualizarse, generando potencialmente un pico
de CPU.

Aproveche la capacidad de UGUI para soportar múltiples lienzos. Divide la UI


en función de la frecuencia con la que deben actualizarse. Mantenga los
elementos estáticos de la interfaz de usuario en un lienzo separado, y mantenga
los elementos dinámicos que se actualizan al mismo tiempo en sub-lienzos 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.

Ocultar los elementos invisibles de la interfaz de usuario

Puede tener elementos de la interfaz de usuario que sólo aparecen esporádicamente en el juego
(por ejemplo, una barra de salud que aparece sólo cuando un personaje
recibe daño).
Si el elemento invisible de la interfaz de usuario está activo, es posible
que siga utilizando llamadas de dibujo.
Desactivar explícitamente cualquier componente invisible de la interfaz de usuario y volver a activarlo cuando sea
necesario.

Si sólo necesita desactivar la visibilidad del lienzo, desactive el componente del


lienzo en lugar del GameObject. Esto puede ahorrar la reconstrucción de las mallas
y los vértices.

Limitar GraphicRaycasters y desactivar Raycast Target

Los eventos de entrada, como los toques o los clics en la pantalla, requieren que el GraphicRaycaster
de la UI. Esto simplemente hace un bucle a través de cada punto de entrada en la
pantalla y comprueba si está dentro de un RectTransform de UI.

Elimina el GraphicRaycaster por defecto del Canvas superior en la jerarquía. En


su lugar, añada el GraphicRaycaster sólo a los elementos individuales que
necesitan interactuar (botones, rectos de desplazamiento, etc.).

Desactiva la opción de ignorar los gráficos invertidos, que está activa por defecto.
2021 Unity Technologies 37 de 52 | [Link]
Además, desactive el objetivo de Raycast 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
cálculo innecesario.

Desactivar el objetivo de Raycast si es posible.

Evite los grupos de diseño

Los grupos de diseño se actualizan de forma ineficiente, así que utilízalos con
moderación. Evítalos por completo
si tu contenido no es dinámico, y utiliza en su lugar anclajes para diseños
proporcionales.
Como alternativa, crea un código personalizado para desactivar los componentes
de los grupos de diseño después
de que configuren la interfaz de usuario.

Si necesita utilizar Grupos de Diseño (Horizontal, Vertical, Rejilla) para su dinámica


evitar el anidamiento de elementos para mejorar el rendimiento.

Los grupos de diseño pueden reducir el rendimiento, especialmente cuando están anidados.

Evite las vistas de lista y de cuadrícula de gran tamaño

Las vistas de Lista y Cuadrícula grandes son caras. Si necesita crear una Lista o una Cuadrícula de gran
tamaño
La vista de cuadrícula (por ejemplo, una pantalla de inventario con cientos de
artículos), considera la posibilidad de reutilizar
un grupo más pequeño de elementos de interfaz de usuario en lugar de crear un
elemento de interfaz de usuario para cada artículo.
Echa un vistazo a este proyecto de ejemplo de GitHub para ver esto en acción.
2021 Unity Technologies 38 de 52 | [Link]
Evitar numerosos elementos superpuestos

La superposición de muchos elementos de la interfaz de usuario (por ejemplo, las


cartas apiladas en un juego de batalla de cartas) crea un
exceso de dibujo. Personaliza tu código para combinar los elementos en capas en
tiempo de ejecución en
menos elementos y lotes.

Utilice varias resoluciones y relaciones de aspecto

Los dispositivos móviles utilizan ahora resoluciones y tamaños de pantalla muy diferentes,
crear versiones alternativas de la interfaz de usuario para ofrecer la mejor experiencia por dispositivo.

Utiliza el simulador de dispositivos para previsualizar la interfaz de usuario en


una amplia gama de dispositivos compatibles
. También puedes crear dispositivos virtuales en XCode y Android Studio.

Previsualice una variedad de formatos de pantalla utilizando el Simulador de Dispositivos.

Si utiliza una interfaz de usuario a pantalla completa, oculte todo lo demás

Si tu pantalla de pausa o de inicio cubre todo lo demás en la escena,


desactivar la cámara que representa la escena 3D. Del mismo modo, desactiva cualquier fondo
Elementos del lienzo ocultos detrás del lienzo superior.

Considere la posibilidad de bajar el [Link] durante una


UI a pantalla completa, ya que no debería necesitar actualizar a 60 fps.
2021 Unity Technologies 39 de 52 | [Link]
Asignar la cámara a los lienzos del espacio del mundo y del espacio de la cámara

Dejar el campo Evento o Cámara de Renderización en blanco obliga a


Unity a rellenar Camera. main, lo cual es innecesariamente costoso.

Considere usar Screen Space - Overlay para su Canvas RenderMode si es


posible, ya que eso no requiere una cámara.

Al utilizar el modo de renderizado World Space, asegúrese de rellenar la cámara de eventos.

2021 Unity Technologies 40 de 52 | [Link]


Audio
Aunque el audio no suele ser un espectáculo
cuello de botella, todavía se puede optimizar para
ahorrar memoria.

Haz que los clips de sonido sean mono cuando sea posible

Si utiliza el audio espacial 3D, el autor


sus clips de sonido como mono (un solo canal)
o activar el ajuste Forzar a Mono.
Un sonido multicanal utilizado
posicionalmente
en tiempo de ejecución se aplanará a un mono
fuente, aumentando así el coste de la
CPU y desperdiciando memoria.

Utilizar archivos WAV originales sin


comprimir.
como activos de origen cuando sea
posible

Si utiliza cualquier formato comprimido (como


MP3 o Vorbis), Unity descomprimirá
y volver a comprimirlo durante el tiempo de construcción.
Esto da lugar a dos pases con pérdidas, lo
que degrada la calidad final.

Comprimir el clip y reducir la tasa de


bits de compresión

Reduce el tamaño de tus clips y el uso de la


memoria con la compresión:

- Utiliza Vorbis para la mayoría de los


sonidos (o MP3
para los sonidos que no están
pensados para el bucle).
Optimiza los ajustes de importación de tus AudioClips.
- Utiliza ADPCM para
sonidos cortos y frecuentes (por
ejemplo, pasos, disparos).
Esto reduce los archivos en comparación con el PCM sin comprimir,
pero es rápido de descodificar durante la reproducción.

Los efectos de sonido en los dispositivos móviles deben ser de 22.050 Hz como máximo.
El uso de ajustes más bajos suele tener un impacto mínimo en la calidad
final, pero utilice sus propios oídos para juzgar.
2021 Unity Technologies 41 de 52 | [Link]
Elija el tipo de carga adecuado

El ajuste varía según el tamaño del clip.

- Los clips pequeños (< 200 kb) deben Descomprimirse al cargar. Esto incurre
en costes de CPU
y memoria al descomprimir un sonido en datos de audio PCM de 16 bits sin
procesar, por
lo que sólo es deseable para sonidos cortos.

- Los clips medianos (>= 200 kb) deben permanecer comprimidos en la memoria.

- Los archivos de gran tamaño (música de fondo) deben estar configurados en Streaming.
De lo contrario, todo el activo se cargará en la memoria de una sola vez.

Descarga de las fuentes de audio silenciadas de la memoria

Cuando implemente un botón de silencio, no se limite a poner el volumen a 0.


Puede destruir el componente AudioSource para descargarlo de la memoria,
siempre que el reproductor no necesite activarlo y desactivarlo muy a menudo.

2021 Unity Technologies 42 de 52 | [Link]


Animación
El sistema Mecanim de Unity es bastante sofisticado. Si es posible, limite su
uso
en móviles utilizando los ajustes que siguen.

Utilizar plataformas genéricas frente a las humanoides

Por defecto, Unity importa modelos animados con el Rig Genérico, pero
los desarrolladores suelen cambiar al Rig Humanoide cuando animan un personaje.

Un Rig Humanoide consume un 30-50% más de tiempo de CPU que el Rig


Genérico equivalente
porque calcula la cinemática inversa y el
retargeting de la animación en cada fotograma, incluso cuando no está en
uso. Si no necesitas estas
características específicas del Rig Humanoide, utiliza el Rig Genérico.
2021 Unity Technologies 43 de 52 | [Link]
Evitar el uso excesivo de animadores

Los animadores están pensados principalmente para personajes


humanoides, pero a menudo
se utilizan para animar valores individuales (por ejemplo, el canal alfa de un
elemento de interfaz de usuario).
Evite el uso excesivo de los Animators, especialmente en conjunción con
los elementos de la UI.
Siempre que sea posible, utilice los componentes de Animación heredados
para móviles.

Considere la posibilidad de crear funciones de interpolación o utilizar una biblioteca de terceros para
animaciones sencillas (por ejemplo, DOTween).

Los animadores son potencialmente caros.


2021 Unity Technologies 44 de 52 | [Link]
Física
La física incorporada de Unity (Nvidia PhysX) puede ser costosa en móviles. Los
siguientes consejos pueden ayudarle a exprimir más cuadros por segundo.

Optimice su configuración

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

Habilitar las mallas de colisión de Prebake.

Asegúrese de editar también sus


ajustes de Física (Ajustes del Proyecto
> Física). Simplifique su Matriz de
Colisión de Capas siempre que sea
posible.

Desactivar la sincronización
automática de las transformaciones
y
activar la reutilización de las llamadas
de colisión.

Modifica los ajustes del proyecto de física para exprimir más el rendimiento.
2021 Unity Technologies 45 de 52 | [Link]
Vigila el módulo de Física del Perfilador para ver si hay problemas de rendimiento.

Simplificar los colisionadores

Los colisionadores de malla pueden ser caros. Sustituirlos por otros más complejos
colisionadores de malla con colisionadores primitivos o de malla más sencillos para
aproximarse a la forma original.

Mover un cuerpo rígido utilizando métodos de física

Utiliza métodos de clase como MovePosition o AddForce


para mover sus objetos Rigidbody. Trasladar su
Transformar los componentes directamente puede llevar a
recalcular el mundo de la física, lo que puede ser costoso en
escenas complejas.
Mueve los cuerpos de física en FixedUpdate en lugar de
Update.

Fijar el tiempo fijo

El paso de tiempo fijo por defecto en la configuración del proyecto es


0,02 (50 Hz). Cámbialo para que coincida con tu velocidad de fotogramas objetivo
(por ejemplo, 0,03 para 30 fps). ralentiza, pero también reduce su impacto en la tasa de
fotogramas.
De lo contrario, si su velocidad de fotogramas cae en
tiempo de ejecución, eso
significa que Unity llamaría a FixedUpdate varias veces
por
fotograma, creando potencialmente un problema de 2021 Unity Technologies

rendimiento de la CPU con


contenido de la física.

El Maximum Allowed Timestep limita el tiempo


que los cálculos de física y los eventos FixedUpdate pueden
utilizar en
caso de que la velocidad de fotogramas caiga. Bajar este
valor significa que
durante una caída de rendimiento, la física y la animación
pueden
Utiliza primitivas o mallas simplificadas para los colisionadores.

46 de 52 | [Link]

Modifica el Timestep Fijo para que coincida con tu velocidad de fotogramas objetivo, y baja el
Timestep Máximo Permitido para reducir los fallos de rendimiento.
Visualizar con el depurador de física

Utilice la ventana de Depuración de Física (Ventana > Análisis > Depurador de


Física)
para ayudar a solucionar cualquier problema de colisiones o
discrepancias. Esto muestra
un indicador codificado por colores de lo que los GameObjects deben ser
capaces de colisionar
entre sí.

El depurador de física te ayuda a visualizar cómo tus objetos de física pueden interactuar entre sí.

Para más información, vea Physics Debug Visualization


en la documentación de Unity.
2021 Unity Technologies 47 de 52 | [Link]
Flujo de
trabajo y
colaboración
Construir una aplicación en Unity es un gran esfuerzo que a menudo involucra a
muchos desarrolladores. Asegúrate de que tu proyecto está configurado de forma
óptima para tu equipo.

Utilizar el control de versiones

Todo el mundo debería utilizar algún tipo de control de versiones. Asegúrese de


que la configuración de su editor tiene el modo de serialización de activos
establecido en forzar texto.

Si está utilizando un sistema de control de versiones externo (como Git) en la


configuración de Control de Versiones, asegúrese de que el Modo está establecido
en Metaficheros Visibles.

Unity también tiene un YAML incorporado (un lenguaje de serialización de datos legible para el ser humano)
específicamente para fusionar Escenas y Prefabs. Para más información,
consulte Smart Merge en la documentación de Unity.

El control de versiones es esencial para trabajar en equipo. Puede ayudarle a hacer un seguimiento de
los errores y las malas revisiones. Sigue buenas prácticas como el uso de ramas
y etiquetas para gestionar los hitos y las versiones.

Echa un vistazo a Plastic SCM, nuestra solución de control de versiones


recomendada para el desarrollo de juegos Unity
.

Romper las escenas grandes

Las grandes escenas individuales de Unity no se prestan a la colaboración.


Divide tus niveles en muchas escenas más pequeñas para que los artistas y
diseñadores puedan colaborar mejor en un mismo nivel y minimizar el riesgo de
conflictos.

En tiempo de ejecución, su proyecto puede cargar escenas de forma aditiva utilizando


[Link] pasando el modo del parámetro
[Link].

2021 Unity Technologies 48 de 52 | [Link]


Eliminar los recursos no utilizados

Tenga cuidado con los activos no utilizados que vienen incluidos en plug-ins de terceros y
bibliotecas. Muchas incluyen activos y scripts de prueba incrustados, que se
convertirán en parte
de tu construcción si no los eliminas. Elimina cualquier recurso innecesario que haya
quedado de
la creación de prototipos.

Acelerar el intercambio con el acelerador de Unity

El Acelerador de Unity es un proxy y un caché para el servicio de Collaborate que


le permite compartir el contenido del Editor de Unity más rápidamente. Si su equipo
está trabajando en el mismo local
no es necesario reconstruir partes del proyecto, lo que reduce significativamente el
tiempo de
descarga. Cuando se utiliza con Unity Teams Advanced, el Acelerador también
comparte los activos de origen.
2021 Unity Technologies 49 de 52 | [Link]
Unidad Integrada
Éxito
Si necesita una atención personalizada, piense en Unity Integrated Success.
Integrated Success es mucho más que un paquete de soporte. Los clientes de
Integrated Success también tienen la opción de añadir acceso de lectura y
modificación al código fuente de Unity. Este acceso está disponible para los
equipos de desarrollo que quieran profundizar en el código fuente para adaptarlo y
reutilizarlo para otras aplicaciones.

Obtenga una revisión del proyecto

Las revisiones del proyecto son una parte esencial del paquete de éxito integrado.
Siempre que es posible, nos desplazamos hasta nuestros clientes y solemos pasar dos
días familiarizándonos con sus proyectos. Utilizamos varias herramientas de
creación de perfiles para detectar cuellos de botella en el rendimiento, teniendo
en cuenta los requisitos existentes y las decisiones de diseño. También
identificamos los puntos en los que se podría optimizar el rendimiento para
aumentar la velocidad, la estabilidad y la eficiencia.

En el caso de los proyectos bien diseñados que tienen tiempos de construcción


bajos (escenas modulares, uso intensivo
de AssetBundles, etc.), realizamos los cambios in situ y volvemos a perfilar para
descubrir nuevos problemas.

En los casos en los que no podemos resolver los problemas directamente, captamos la mayor cantidad de
información posible.
información posible. Luego, realizamos una investigación más profunda en la Unidad
oficinas, consultando a desarrolladores especializados de nuestros departamentos de I+D si es necesario.

Aunque los resultados pueden variar en función de las necesidades de los clientes,
Normalmente, un informe escrito resume nuestras conclusiones y ofrece
recomendaciones. Nuestro objetivo es proporcionar siempre el mayor valor a nuestros
clientes ayudándoles a identificar posibles bloqueos, evaluar el riesgo, validar las
soluciones y asegurarse de que siguen las mejores prácticas en el futuro.

Director de Relaciones con los Desarrolladores (DRM)

Además de una revisión del proyecto, Unity Integrated Success también incluye
un Director de Relaciones con los Desarrolladores (DRM), un asesor estratégico de Unity que rápidamente
se convierten en una extensión de tu equipo para ayudarte a sacar el máximo partido a Unity.
Su DRM le proporciona la experiencia técnica y operativa necesaria para
anticiparse a los problemas y mantener el buen funcionamiento de sus proyectos,
hasta el lanzamiento y más allá.

Para obtener más información sobre un paquete de éxito integrado y


revisiones de proyectos,
póngase en contacto con el departamento de ventas de Unity o rellene este
formulario.
2021 Unity Technologies 50 de 52 | [Link]
Conclusión:
Puedes encontrar más consejos de optimización, mejores prácticas y
noticias en el blog de
Unity, utilizando el hashtag #unitytips, en los foros de la comunidad de Unity
y en Unity Learn.

La optimización del rendimiento es un tema muy amplio. Entienda cómo su hardware móvil
funciona, junto con sus limitaciones. Para encontrar una solución eficaz que
satisface sus requisitos de diseño, tendrá que dominar las clases y
componentes de Unity, los algoritmos y las estructuras de datos, y las
herramientas de creación de perfiles de su plataforma.

Por supuesto, un poco de creatividad también ayuda aquí.

2021 Unity Technologies 51 de 52 | [Link]


[Link]

También podría gustarte