Optimización del rendimiento de Unity: recursos

Optimización del rendimiento de Unity

En gran medida, Unityla 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 Inspectorver la información de los recursos de imagen en el panel, similar a la siguiente imagen:
Por favor agregue la descripción de la 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
  • desmarcarRead/Write Enabled
  • Desactivar redundancia Mip Map: los mapas son inútiles en texturas de tamaño constante como Mip Mapsprites 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 Buttontextura suele ser menor que 128X. 128Si se usa el tamaño de la especificación 1024X 024, se perderá rendimiento.

InspectorComo 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 Sizecambie el tamaño a 1024, el tamaño del recurso de textura es4.9MB
Por favor agregue la descripción de la imagen

La segunda imagen: Max Sizeajuste a 512, el tamaño del recurso de la imagen es1.3MB
Por favor agregue la descripción de la imagen

2. Compresión de texturas

Antes de elegir activamente el formato de compresión, Unityrealizará un procesamiento en la imagen misma. Independientemente de lo que ingrese PNG, JPG, PSDo TGA, Unitynos ayudará a ajustarlo manualmente Texture 2D, esta es una estrategia de programación simple:
inserte la descripción de la imagen aquí

Entonces , dado Unityque 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, Unityen 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 Unityla 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)

inserte la descripción de la imagen aquí

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:1024RGBA32

Como RGBA32cada 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, Gy Bse Aobtienen 4 bytes, es decir 4B, luego se multiplica el último 1024píxel 1024, el el tamaño final 4MBes 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 6G4G, 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: RGBA32como 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+ Es Ditheringuna versión castrada cuando la escuchas En RGBA32resumen, en comparación con RGBA32su gran grado de subdivisión de color, puedes ver claramente el sentido de los pasos y el rendimiento visual es relativamente RGB32suave .

  • Formatos de compresión de baja calidad: ETC1+ Alpha/ PVRTC4Estos 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, PVRTC4etc. no necesitan descomprimirse en la memoria, pero pueden admitirse directamente GPU, 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 CPUobtener datos, es necesario hacer una copia de seguridad de los datos en la memoria. dar CPUacceso. Al mismo tiempo, para la representación y visualización de gráficos, se cargará en la memoria de video para GPUproporcionar datos.

En pocas palabras, esta opción hará una copia de seguridad de una textura en CPUla memoria y GPUla 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 MapSimilar 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 Mapaumentará el uso de la memoria al usarlo.

Mip mapEl 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 , y 256X256se generarán 8imágenes de diferentes precisiones . Disminuya el tamaño de cada textura según 2el 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) 8Luego 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
inserte la descripción de la imagen aquí
puede ver, el resultado obtenido es cercano a 33%, por supuesto, si Mip Mapel 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:
inserte la descripción de la imagen aquí
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 Unitytextura 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 mipy dicen que aumentará 33%la huella de memoria.

Aunque Mip mapes una tecnología de optimización del rendimiento en sí misma, solo ocupará memoria adicional en texturas como 2Dsprites o elementos que no cambien la precisión de la representación, así que recuerda no verificar cuando uses texturas en sprites o elementos .UI2DUIMip 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:
inserte la descripción de la imagen aquí
1. Deshabilitar lectura/escritura Habilita:

Haga clic en el modelo, puede Inspectorver 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 Enablespara 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:
inserte la descripción de la imagen aquí
La traducción es:

  • Cuando esta opción está habilitada, los datosUnity 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.MeshGPUCPUUnityMesh

  • Cuando esta opción está deshabilitada, los datos seUnity cargan en la memoria direccionable y luego se eliminan de la memoria direccionable.MeshGPUCPU

  • 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:inserte la descripción de la imagen aquí

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 Enablesopciones 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

UnitySe proporcionan algunas opciones para optimizar el modelo. Puede consultar la Unitydocumentación oficial para leerlas y comprenderlas. Aquí hay una breve lista:
inserte la descripción de la imagen aquí
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 se Meshvea 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 mejor GPUrendimiento , todo marcado de forma predeterminada
  • Normals: si el modelo de malla no es un mapa normal ni se ve afectado por la iluminación en tiempo real, selecciónelo None, lo que también puede mejorar el rendimiento.

De hecho, Unityalgunas 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 LODa , 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.

LODEs decir Levels of Detail, la traducción son detalles de varios niveles, similar a la Mip maptecnologí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 Unitya través LODde 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:
inserte la descripción de la imagen aquí

Este es Unityun 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 LODsolucionar 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.

Supongo que te gusta

Origin blog.csdn.net/xinzhilinger/article/details/119959861
Recomendado
Clasificación