Optimización del rendimiento de Unity
En gran medida, Unity
la optimización del rendimiento del proyecto se puede dividir aproximadamente en las siguientes partes:
- recurso
- hacer
- programa
- Configuración del proyecto
En esta parte, la optimización del rendimiento de los recursos es el método de optimización más básico y efectivo, y también es la parte a la que los desarrolladores de juegos deben prestar atención en el desarrollo diario. Por lo tanto, este artículo presentará brevemente los puntos que deben prestarse. atención a la hora de operar los recursos.
1. Textura (en términos simples, es una imagen)
La optimización de recursos de texturas se centra principalmente en los siguientes puntos:
- tamaño de la textura
- Formato de compresión
- Importar ajustes
Por lo general, cuando el juego se está ejecutando, la mayor parte de la memoria se usa para texturas, por lo que la configuración de importación es muy crítica.Podemos Inspector
ver la información de los recursos de imagen en el panel, similar a la siguiente imagen:
Desde la perspectiva de la optimización del rendimiento, la importación de texturas debe seguir los siguientes principios:
- Disminuir la resolución máxima
- Utilice el formato de compresión potencia de dos:
- Hacer un atlas de textura
- desmarcar
Read/Write Enabled
- Desactivar redundancia
Mip Map
: los mapas son inútiles en texturas de tamaño constante comoMip Map
sprites y gráficos 2DUI
1. Reducir la resolución máxima
Se entiende bien que cuanto mayor sea la resolución de la textura, mayores serán los recursos de memoria ocupados cuando se ejecuta el juego, y la cantidad de memoria ocupada es proporcional al cuadrado de su resolución. En otras palabras, si se duplica la resolución, la cantidad de memoria debe cuadriplicarse. Por lo tanto, desde la perspectiva de la optimización de recursos, debe limitarse hasta cierto punto. En términos simples, la textura de una Button
textura suele ser menor que 128
X. 128
Si se usa el tamaño de la especificación 1024
X 024
, se perderá rendimiento.
Inspector
Como se muestra en la siguiente figura, podemos verlo en la parte inferior de propiedades del panel de recursos de imágenes : Max Size
, y podemos ver que se pueden seleccionar diferentes resoluciones máximas según las diferentes plataformas:
Primera imagen: Max Size
cambie el tamaño a 1024
, el tamaño del recurso de textura es4.9MB
La segunda imagen: Max Size
ajuste a 512
, el tamaño del recurso de la imagen es1.3MB
2. Compresión de texturas
Antes de elegir activamente el formato de compresión, Unity
realizará un procesamiento en la imagen misma. Independientemente de lo que ingrese PNG
, JPG
, PSD
o TGA
, Unity
nos ayudará a ajustarlo manualmente Texture 2D
, esta es una estrategia de programación simple:
Entonces , dado Unity
que ya se ha convertido de forma inteligente, ¿por qué los desarrolladores deberían tener la opción de elegir el formato de compresión Texture 2D
?¿No puede ser suficiente encapsular el método de compresión directamente?
De hecho, Unity
en comparación con otros motores de desarrollo, existe una ventaja obvia, que es la adaptabilidad múltiple. Para lograr esta adaptabilidad múltiple, la pertinencia de una sola plataforma se debilitará relativamente y el rendimiento de las diferentes plataformas será diferente. ., el desarrollador debe elegir el formato de compresión para la plataforma del juego de acuerdo con las características de la plataforma.
Del mismo modo, incluso en la misma plataforma, habrá diferentes requisitos de compresión según las diferentes situaciones. Por ejemplo, hay algunas imágenes clave de la página de inicio. Donde el jugador tiene una percepción fuerte, los requisitos de calidad de las imágenes son más altos y algunos auxiliares. imágenes en las esquinas, los requisitos pueden ser más bajos. Si se usa compresión de alta calidad, se desperdiciará el rendimiento, pero si se usa compresión de baja calidad, la calidad no se mantendrá. Por lo tanto, también es necesario seleccionar diferentes formatos de compresión según las necesidades reales.
Cuando se trata de Unity
la compresión de imágenes, a menudo veo una imagen de este tipo para presentar las características y los escenarios aplicables de diferentes formatos de compresión. También rastreé esta imagen directamente desde Baidu Pictures, puede consultarla (si hay alguna infracción, déjeme sé y lo eliminaré de inmediato)
Antes de comprender la imagen de arriba, haga un cálculo simple: el espacio de almacenamiento que ocupa una imagen de formato multiplicado es 1024
:1024
RGBA32
Como RGBA32
cada valor de color de un píxel está compuesto por dos números hexadecimales, es decir, 8 bits, ese píxel son 8 bits multiplicados por 4 valores de color R
, G
y B
se A
obtienen 4 bytes, es decir 4B
, luego se multiplica el último 1024
píxel 1024
, el el tamaño final 4MB
es de 4 megas. Obviamente, este es un número aterrador. Debes saber que la memoria de ejecución de los teléfonos móviles es de aproximadamente 6G
4G, a excepción de la memoria ocupada por el sistema. El uso real para el juego es solo 4G`, y la memoria de video asignada a la GPU. I es aún menos Y si esta memoria se usa para cargar texturas a granel, obviamente es inaceptable. Al mismo tiempo, la carga de imagen de esta cantidad de datos también le dará a la memoria
Basado en el cuerpo del paquete y los problemas de memoria causados por las texturas nativas anteriores, es necesario adoptar algunas estrategias de compresión de acuerdo con diferentes situaciones. Como básicamente no tengo habilidades artísticas, no sé mucho sobre los efectos de representación artística de varias compresiones. formatos, principalmente desde la función Desde la perspectiva del rendimiento y el rendimiento, analizamos los escenarios aplicables de varios formatos de compresión:
-
Formato de compresión de alta calidad:
RGBA32
como formato de compresión de alta fidelidad, puede garantizar en gran medida la calidad de la imagen -
Formato de compresión de calidad media:
RGBA16
+ EsDithering
una versión castrada cuando la escuchas EnRGBA32
resumen, en comparación conRGBA32
su gran grado de subdivisión de color, puedes ver claramente el sentido de los pasos y el rendimiento visual es relativamenteRGB32
suave . -
Formatos de compresión de baja calidad:
ETC1
+Alpha
/PVRTC4
Estos formatos de compresión suelen ser los formatos de compresión más utilizados para los segmentos móviles y tienen ventajas de rendimiento incomparables sobre otros formatos de compresión.
Aviso:
- Además de la reducción del ancho de banda de carga debido a las diferentes lógicas de compresión, también es necesario comprender que las imágenes
ETC1
,PVRTC4
etc. no necesitan descomprimirse en la memoria, pero pueden admitirse directamenteGPU
, por lo que, en comparación con otros formatos de compresión, generalmente tienen la mejor rendimiento
3. Desmarque Lectura/Escritura habilitada
Esta función permite a los desarrolladores de juegos C#
controlar la lectura y escritura de imágenes a través de llamadas de script. Obviamente, esto está controlado por la CPU. Por lo tanto, para CPU
obtener datos, es necesario hacer una copia de seguridad de los datos en la memoria. dar CPU
acceso. Al mismo tiempo, para la representación y visualización de gráficos, se cargará en la memoria de video para GPU
proporcionar datos.
En pocas palabras, esta opción hará una copia de seguridad de una textura en CPU
la memoria y GPU
la memoria cuando el juego se esté ejecutando. Si no necesita leer y escribir texturas, puede intentar desactivar esta opción para evitar que el juego se ejecute. extra memoria
4. Deshabilitar mapas Mip redundantes
Mip Map
Similar al modelo LOD
, también es una técnica para cambiar la precisión del mapa de representación en función de la distancia de representación. La ventaja es que ahorra rendimiento cuando los objetos están lejos de la distancia de representación. Pero Mip Map
aumentará el uso de la memoria al usarlo.
Mip map
El principio técnico es generar un conjunto de imágenes con diferentes precisiones reduciendo la potencia de 2 según la imagen original. Cuando se ejecuta el juego, este conjunto de imágenes se carga en la memoria y se utilizan imágenes de diferentes precisiones según la distancia del renderizado.
¿Cuánta memoria aumentará el mapa mip?
- Cuando lo usamos
Mip map
, se supone que el tamaño es , y256X256
se generarán8
imágenes de diferentes precisiones . Disminuya el tamaño de cada textura según2
el poder de , y acumule. De esta forma, el volumen del grupo de imágenes final es probablemente mayor que el del mapa único original.33%
Verificado con un ejemplo, suponiendo que el tamaño de la imagen original es 8M
, el tamaño de la primera imagen de baja precisión generada es 2M
(la resolución se reduce a la mitad y el tamaño se convertirá en una cuarta parte del original, lo cual es fácil de entender) 8
Luego sume para obtener el tamaño final del grupo de imágenes y calcúlelo a través de un método recursivo simple :
public void Awake()
{
Debug.Log(GetMipmapSize(8, 8)/8);
}
// index:处理总层级数 imageSize:初始大小 返回增大的内存量
float GetMipmapSize(int index,float imageSize)
{
float lastSize = 0;
if (index == 1)
{
lastSize = imageSize*0.25f;
}
if (index > 1)
{
lastSize = imageSize * 0.25f + GetMipmapSize(index - 1, imageSize * 0.25f);
}
return lastSize;
}
Ejecute el programa y el resultado es: Como
puede ver, el resultado obtenido es cercano a 33%
, por supuesto, si Mip Map
el procesamiento de una textura no es ocho veces, el resultado del cálculo estará sesgado, pero de hecho, de tres veces hacia arriba , el uso de memoria El índice de aumento de , ha sido muy pequeño, y básicamente se mantiene a la 33%
izquierda y a la derecha. El código anterior se modifica ligeramente para hacer una pequeña verificación:
public void Awake()
{
for (int i = 3; i < 15; i++)
{
Debug.Log(string.Format("处理 {0} 次内存占用量为: {1}",i,GetMipmapSize(i, 8) / 8));
}
}
float GetMipmapSize(int index,float imageSize)
{
float lastSize = 0;
if (index == 1)
{
lastSize = imageSize*0.25f;
}
if (index > 1)
{
lastSize = imageSize * 0.25f + GetMipmapSize(index - 1, imageSize * 0.25f);
}
return lastSize;
}
El registro obtenido es:
Se puede encontrar que a partir de la tercera capa, el uso de 33%
la memoria se mantiene básicamente, y cuando el número de capas aumenta gradualmente, el aumento en el uso de la memoria es muy, muy pequeño.
La Unity
textura mínima admitida es 32X32
, es decir, la textura más pequeña también generará tres capas adicionales de texturas de baja precisión: 16X16
, 4X4
, 1X1
, razón por la cual muchos artículos presentan su uso Map mip
y dicen que aumentará 33%
la huella de memoria.
Aunque Mip map
es una tecnología de optimización del rendimiento en sí misma, solo ocupará memoria adicional en texturas como 2D
sprites o elementos que no cambien la precisión de la representación, así que recuerda no verificar cuando uses texturas en sprites o elementos .UI
2D
UI
Mip map
5. Paquete Atlas
El paquete del atlas es principalmente para optimizar la cantidad de llamadas de dibujo en el proceso de representación de gráficos de la interfaz de usuario. El principio básico es reducir las llamadas de dibujo mediante el procesamiento por lotes de elementos de la interfaz de usuario y mejorar el rendimiento de la CPU. Para obtener más información, puede consultar mi anterior artículo:
Artículo de embalaje Atlas:
2. modelo
En comparación con la textura, el rendimiento del modelo depende más de la especificación de arte. Ya no hay lugar para optimizar el programa, pero hay algunas opciones en Unity que afectan el rendimiento de la carga del modelo, renderizado, etc. ver:
1. Deshabilitar lectura/escritura Habilita:
Haga clic en el modelo, puede Inspector
ver estas opciones de configuración en el panel, similares a las texturas, si en el juego no necesita modificar el modelo, puede deshabilitarlo Reader/Write Enables
para evitar la copia de seguridad de datos y ocupar el exceso de memoria, podemos en la documentación oficial de Unity Encuentra la introducción relevante:
La traducción es:
-
Cuando esta opción está habilitada, los datos
Unity
se cargarán en la memoria direccionable, pero también se guardarán en la memoria direccionable. Esto significa que se puede acceder a los datos y se puede acceder desde el script.Mesh
GPU
CPU
Unity
Mesh
-
Cuando esta opción está deshabilitada, los datos se
Unity
cargan en la memoria direccionable y luego se eliminan de la memoria direccionable.Mesh
GPU
CPU
-
Por defecto, esta opción está deshabilitada. En la mayoría de los casos, para ahorrar el uso de la memoria en tiempo de ejecución, deshabilite esta opción
Para el modelo en sí, intente evitar el modelo con caras redundantes. Sobre todo móvil. Porque además de la presión que trae el modelo de alta precisión, también hay muchos desafíos de rendimiento en otros aspectos.
Aviso:
- En algunos casos, deshabilitar las habilitaciones de lectura/escritura hará que Mesh Collider no esté disponible. La información específica se menciona en la documentación oficial de Unity:
2. Trate de no marcar opciones de funciones innecesarias
En Unity
, algunas funciones consumirán una cierta cantidad de recursos para mantener su estado incluso si no las usa. Similar a las Reader/Write Enables
opciones anteriores, por lo que podemos considerar deshabilitar las funciones que no se utilizan tanto como sea posible
3. Establecer algunas opciones sobre calidad y rendimiento
Unity
Se proporcionan algunas opciones para optimizar el modelo. Puede consultar la Unity
documentación oficial para leerlas y comprenderlas. Aquí hay una breve lista:
Como se puede ver en la imagen de arriba, las opciones que afectan el rendimiento del modelo y el rendimiento del juego son las siguientes:
Mesh Compression
: al comprimir los datos de la malla utilizando los límites de la malla y una profundidad de bits más baja por componente, el aumento de la relación de compresión reduce la precisión de la malla. Lo mejor es subirlo lo más alto posible sin que seMesh
vea muy diferente de la versión sin comprimir. Esto es útil para optimizar el tamaño del juego.Optimize Mesh
: determina el orden en que se enumeran los triángulos en la malla para un mejorGPU
rendimiento , todo marcado de forma predeterminadaNormals
: si el modelo de malla no es un mapa normal ni se ve afectado por la iluminación en tiempo real, seleccióneloNone
, lo que también puede mejorar el rendimiento.
De hecho, Unity
algunas opciones están configuradas para cambiar el rendimiento mediante el control programático de la calidad del modelo, pero no se recomienda. Se espera que estas opciones se puedan usar para ajustar el rendimiento. Es mejor dejar que el artista procese directamente el modelo. Después de todo, son más profesionales y pueden garantizar mejor el equilibrio entre el rendimiento del modelo y el rendimiento.
4. Uso de LOD
En cuanto LOD
a , de hecho, debería mencionarse en la sección de renderizado, pero esta tecnología tiene mucho que ver con la malla del modelo, así que permítanme presentarla de antemano.
LOD
Es decir Levels of Detail
, la traducción son detalles de varios niveles, similar a la Mip map
tecnología de renderizado de texturas, y también es una tecnología que establece la precisión de renderizado de acuerdo con la distancia de renderizado. La forma de lograr esto es que durante el desarrollo del juego, los artistas crean un conjunto de modelos con diferentes precisiones en función de diferentes distancias de renderizado, los importan al conjunto de modelos que están conectados Unity
a través LOD
de componentes y establecen los parámetros relevantes. De esta forma, cuando el juego se esté ejecutando, tendrá una precisión de renderizado diferente a diferentes distancias:
Este es Unity
un ejemplo del documento oficial. Se puede ver que a medida que aumenta la distancia de renderizado, la precisión de renderizado disminuye gradualmente hasta que finalmente se elimina. La ventaja de esto es que la presión de renderizado se puede minimizar mientras se asegura el rendimiento del juego. pantalla. Entendimiento simple, si no se usa LOD
, a medida que aumenta la distancia, los píxeles de la pantalla ocupados por el objeto serán menores y la cantidad de caras triangulares por unidad de píxel será mayor. La presión de renderizado de la unidad aumentará. La presión de renderizado es mayor en lugares donde la demanda de rendimiento de imagen no es alta, lo que obviamente no es razonable. Por lo que es necesario LOD
solucionar este problema.
Por supuesto, esta tecnología en sí tiene fallas considerables. En primer lugar, aumentará el volumen del paquete y también aumentará la carga de trabajo del arte. Por lo tanto, en la apertura real, esta tecnología generalmente solo se usa para algunos objetos importantes.
Resumir
Algunos de los puntos comunes presentados anteriormente sobre el impacto de los recursos en el rendimiento del juego son aquellos con los que los desarrolladores de juegos tienen más contacto diario, mientras que los más profundos y de menor nivel requieren una adaptación y ajuste especiales según las características del proyecto.