En esta entrada de blog daremos consejos y trucos de optimización de memoria y para trabajar con texturas. La compilación estuvo a cargo de Steve Hughes, ingeniero de aplicaciones para computación visual de Intel. Quienes deseen conocer más información pueden leer el artículo de Steve y Cristiano (la mayoría de los consejos son válidos tanto para Windows como para Android) y mis Consejos para usar Unity con el SDK de Intel® RealSense™.
Cómo trabajar con texturas
Consejos de diseño
- No es necesario que los mapas normales estén a una escala 1:1 con los difusos.
- Elimine los fotogramas clave redundantes de las animaciones (solo actualice para cambiar de gráfico).
Para modelos de malla
- Elimine de las mallas los canales no utilizados (en Player Settings, habilite Optimized Mesh Data).
- Para mallas con mucho detalle en sistemas con poca RAM, establezca que Quality use maxLOD.
Encontrará más información sobre optimización de gráficos en: Cómo planificar optimizaciones con Unity.
Audio
- Use el búfer de 200 k para reproducción de audio.
- Cargue los clips cortos sin comprimir en este búfer.
- O use AudioClip.GetData para descomprimir y luego libere el clip comprimido.
Optimización de memoria
- Dos métodos para ver qué está consumiendo RAM.
- Profiler.GetRuntimeMemorySize() puede encontrar objetos que consumen mucha RAM (sugerir salida al registro de depuración).
- Busque en CIL (Common Intermediate Language) de Mono los tres tipos de asignación: Newarr, Newobj, Box.
- Preasigne espacio de memoria en el inicio (según el historial de uso de recursos) para expandir el montón (heap) manualmente.
- Cuando sea necesario actuar sobre la marcha, llame a Resources.UnloadAsset (si es necesario hacer la referencia al recurso) o use Resources.UnloadUnusedAssets (si la referencia no es necesaria).
- Como por lo general solo se llama a Auto Garbage Collection de Unity cuando la pila está llena o no hay un bloque libre lo suficientemente grande, considere llamar a (System.GC..Collect) antes o después de cargar un nivel (o ponerlo en un temporizador) o limpie en los tiempos de transición.
- Evite las funciones con grandes cantidades de asignaciones ocultas.
- Use estructuras (se almacenan en pila) en lugar de clases (se almacenan en montón) para evitar que se fragmente la memoria.
- Recuerde que los enumeradores reservan RAM. Y (Foreach) se reprocesa en un bloque de código que asigna un enumerador, también.
- Por la misma razón, evite métodos anónimos y lambdas.
- Transmita los recursos en secuencias para que consuman menos RAM y junte los recursos relacionados en paquetes de recursos en la compilación y luego envíelos en secuencias en tiempo de ejecución (asegúrese de destruirlos antes de la secuencia de paquetes de recursos o la escena siguientes).
- No junte cadenas. No manipule las cadenas por fotograma (en cambio, agregue un interceptador para solo tener que actualizar si cambia de valor).
- Use la clase StringBuilder para hacer cadenas, No use un arreglo en usa función que devuelva una cadena porque continuará volcando y reasignando en cada repetición del bucle.
- Cree clases de grupos de recursos (bullets/missles) para almacenar objetos, en lugar de “new-ing” múltiple, como
MyClass m – poolOfMyClass //do stuff poolOfMyClass.Store(m);
CRÉDITOS: parte del material incluido se tomó de:
- Recursos de memoria en Unity3.com
- Andrew Frey - Reducción del uso de memoria en UNITY, C# AND .NET/MONO
Gamasutra: Gestión de la memoria en C# para desarrolladores en Unity (parte 1 de 3)
Más información:
- https://software.intel.com/en-us/node/542152 (la mayoría de los consejos son válidos tanto para Windows como para Android)
- Consejos para usar Unity con el SDK de Intel® RealSense™.
图标图像:
