Artículo final sobre el formato de textura de optimización del rendimiento de Unity

Autobús matutino del conocimiento:

1. Cuando n es mayor que 1, la enésima potencia de 2 debe ser divisible por 4, demuestre: 2^n = 2^2*2^(n-1) = 4*2^(n-1)

Los múltiplos de 2 y 4 no son necesariamente todos potencias de 2; demuestre: 4*3 = 12; 12 no es una potencia de 2

3. Píxel es la unidad más pequeña que compone una imagen, Byte es la unidad más pequeña de tamaño de archivo de computadora y bit (bit/bit) es la unidad más pequeña de operaciones de procesamiento de computadora.

4. RGB común de 16 bits, ARGB/RGBA de 16 bits, RGB de 24 bits, ARGB/RGBA de 32 bits, etc. Sus asignaciones de canales habituales son:

RGB de 16 bits = RGB565 = RGB555 (no se utiliza el bit más alto), ARGB/RGBA de 16 bits = ARGB4444 = RGBA4444 = ARGB1555 = RGBA5551

RGB de 24 bits = RGB888, ARGB/RGBA de 24 bits = ARGB/RGBA6666, RGB de 32 bits = RGB888 (los 8 bits restantes están reservados), ARGB/RGBA de 32 bits = ARGB/RGBA8888

Punto de partida del conocimiento

Cuando optimizamos recursos, inevitablemente debemos lidiar con formatos de textura. Cualquier formato de archivo de imagen se convertirá al formato Textur2D después de importarlo a Unity. Luego, podemos configurar el formato de compresión de la textura de acuerdo con las diferentes plataformas en las opciones de configuración de importación de Texture2D.

Entonces, ¿por qué necesitamos formatos de compresión de texturas?

Por ejemplo, los formatos de imagen sin comprimir como RGB565, ARGB4444, ARGB1555, RGB888 y ARGB8888 son formatos de textura nativos que la GPU puede leer directamente. Pero en dispositivos de hardware de gama baja o plataformas móviles, hay dos problemas que deben resolverse: memoria + ancho de banda;

1. Por ejemplo, un píxel en el formato ARGB8888 ocupa 4 bytes. Si la resolución es 512 x 512, el uso de memoria es: 512 x 512 x 4 B = 1048576 B = 1 M. Este tipo de consumo de memoria es simplemente inaceptable en dispositivos de gama baja.

2. Otra cosa importante es el ancho de banda durante la transmisión de datos. El ancho de banda es el culpable de la generación de calor. Al renderizar escenas 3D, una gran cantidad de texturas se transferirán a la GPU. Si no se restringe, el ancho de banda del bus pronto se convertirá en un cuello de botella. y el teléfono móvil se convertirá rápidamente en un cuello de botella. El calentamiento del dispositivo portátil afectará gravemente el rendimiento del renderizado.

Por lo tanto, necesitamos un formato que ocupe poco espacio de memoria y que pueda ser leído por la GPU: un formato de textura comprimido. La compresión de texturas corresponde a un algoritmo que codifica bloques de píxeles de tamaño fijo en bloques de bytes de tamaño fijo utilizando alguna forma de cuantificación vectorial con pérdida de velocidad fija.

Con pérdida: indica que la compresión con pérdida es aceptable para el renderizado. Generalmente, al elegir un formato de compresión, debe encontrar un equilibrio entre la calidad de la textura y el tamaño del archivo.

Compresión de velocidad fija: debido a que la GPU debe poder acceder eficientemente a un píxel de forma aleatoria, esto significa que para cualquier píxel, la velocidad de decodificación no debería cambiar mucho. Por lo tanto, nuestros algoritmos de compresión de texturas comunes son compresión con pérdida. Por el contrario, zip, por ejemplo, es una compresión de tasa variable.

Cuantización vectorial: técnica de cuantificación que divide un gran conjunto de puntos (vectores) en grupos con aproximadamente el mismo número de puntos más cercanos a ellos. Cada grupo está representado por su punto centroide y, por lo tanto, está sujeto a errores de datos, lo que es adecuado para la compresión con pérdidas. Para entenderlo en la compresión de texturas, por ejemplo, el color de un bloque de píxeles de 4x4 está representado por 2 colores base.

Velocidad de codificación y decodificación: en términos generales, no importa si la velocidad de codificación es lenta, porque normalmente la compresión de texturas solo necesita realizarse una vez cuando el juego está empaquetado, y no tiene ningún impacto en la experiencia de ejecución del usuario. Pero la velocidad de decodificación debe ser lo suficientemente rápida sin afectar básicamente el rendimiento de renderizado.

Relación de compresión: generalmente se expresa en términos de velocidad de bits o el número promedio de bits por píxel (bits por píxel, bpp), comúnmente de 1 a 8 bpp. Generalmente los píxeles de las texturas nativas RGB se refieren a 24 bits, es decir, cada píxel ocupa 24 bits (bit), los 4bpp existentes significa que cada píxel ocupa 4 bits (bit), por lo que se puede considerar que 4bpp significa que la compresión la proporción es 6:1.

Además, Unity convertirá las imágenes de recursos importadas, ya sea en formato PNG o JPG, al formato Texture2D procesado por el motor de Unity.

¿Por qué no utilizamos formatos de compresión comunes como png y jpg?

Aunque jpg y png tienen altas tasas de compresión, no son adecuados para texturas. El principal problema es que no admiten el acceso aleatorio a los píxeles, lo cual es bastante hostil para la GPU. La GPU solo usa la parte de textura requerida al renderizar. ¿No siempre puedes acceder a ciertos píxeles para decodificar toda la textura? Sin conocer el orden y sin estar seguro de si los triángulos adyacentes muestreados en la textura también lo son, es difícil optimizar. Este tipo de formato es más adecuado para descargar y transferir y reducir el espacio en disco.

Formatos comunes de compresión de texturas

1、ETC

ETC es principalmente el esquema de compresión estándar para Android. Su principio es simplemente codificar un bloque de 4x4 píxeles en dos bloques de 2x4 o 4x2 píxeles. Cada bloque especifica un color base y el color de cada píxel se codifica como un valor relativo en escala de grises. De estos cambios de colores primarios se determinan.

Los formatos de compresión ETC comúnmente utilizados en Unity son:

  • RGB ETC1 4 bits: 4 bits/píxel, la relación de compresión RGB es 6:1, no es compatible con alfa, la mayoría de los dispositivos Android lo admiten

  • RGB ETC2 4 bits: 4 bits/píxel, relación de compresión RGB 6:1. Alpha no es compatible. ETC2 es compatible con ETC1. La calidad de compresión puede ser mayor, pero el error también será mayor para bloques con grandes cambios de croma. Se requieren OpenGL ES 3.0 y OpenGL 4.3 o superior.

  • RGBA ETC2 8 bits: 8 bits/píxel, relación de compresión RGBA 4:1. Admite canales completamente transparentes, los requisitos de versión son los mismos que los anteriores.

  • RGB +1 bit Alfa ETC2 4 bits: 4 bits/píxel. Admite canal Alfa de 1 bit, es decir, solo admite imágenes huecas, la imagen solo tiene partes transparentes y opacas, y no hay transparencia intermedia.

2、DXT y S3TC (compresión de textura S3)

El principio es simplemente describir un bloque de píxeles RGB de 4x4 mediante un par de "colores primarios" de baja precisión y permitir que cada píxel especifique una interpolación entre estos colores primarios. Existen varias variaciones de S3TC, cada una diseñada para un tipo específico de datos de imagen, pero todas convierten bloques de píxeles de 4x4 en datos de 64 o 128 bits.

3、ASTC

ASTC es un método de compresión de alta calidad para las plataformas Android e iOS, compatible con Android5.0 y iPhone6 ​​​​y modelos superiores. También es un algoritmo de compresión con pérdida basado en bloques, sus bloques son de tamaño fijo de 128 bits, aunque es un tamaño fijo, a diferencia de los bloques fijos 4x4 del formato anterior, cada textura puede tener diferentes tamaños en estos 128 bits. Puede ser cuadrado o no cuadrado. En la codificación de texturas 2D, varían de 4x4 a 12x12 píxeles y la relación de compresión correspondiente es de 1 a 8 bpp. Tiene muchas características:

  • Alta flexibilidad: admite mapas de 1 a 4 componentes

  • Tasa/calidad de compresión flexible: se seleccionarán diferentes algoritmos de tasa de compresión según las diferentes imágenes.

  • Admite texturas 2D/3D

  • Multiplataforma: iOS, Android, PC

  • Admite LDR y HDR: BC6H admite HDR pero no admite el canal Alpha

Cuanto más grandes sean los bloques, peor será la calidad de la compresión, pero más pequeña será la imagen. La velocidad de bits de ASTC se puede cambiar a nivel decimal. Esta tecnología se llama BISE (Bounded Integer Sequence Encoding).

Pero tenga en cuenta que, aunque las texturas se pueden codificar como imágenes de 1 a 4 canales, los valores decodificados siempre se generan en formato RGBA. Los valores de color se devuelven como números enteros de 8 bits en el modo LDR sRGB o como flotantes de 16 bits en HDR.

Al configurar el formato ASTC, debe prestar atención a los siguientes puntos:

  • Mapa normal: intenta elegir 4x4 para evitar perder demasiados datos.

  • Texturas detalladas: elige 4x4 o 6x6; de lo contrario, se perderán los detalles.

  • Mapas generales: elija 6 x 6 u 8 x 8. 4. Imágenes insignificantes pero de tamaño extremadamente grande: considere 8 x 8, 10 x 10 o 12 x 12, de lo contrario serán demasiado grandes cuando se empaqueten.

A través de los tres formatos de compresión anteriores, descubrimos que los tres algoritmos de compresión utilizan bloques de 4x4 píxeles para su operación, lo que nos hace pensar que cuando optimizamos una imagen, a menudo les pedimos a los estudiantes de arte que mantengan la distancia al generar el tamaño de la imagen. La razón por la cual el ancho es múltiplo de 4 es para que podamos lograr mejores resultados al configurar el formato de compresión para imágenes importadas a Unity. Sin embargo, es posible que algunos estudiantes aún se pregunten: ¿por qué a veces escuchan que el tamaño de la imagen se establece en una potencia de 2? Esto se debe a que el algoritmo de compresión ETC original no admite canales transparentes y el ancho y alto de la imagen deben ser una potencia de 2. Además, el formato de compresión PVRTC en la plataforma iOS solo admite una potencia de 2. Además, cuando n >1, 2^n debe ser múltiplo de 4, por lo que existe el requisito de que el tamaño de salida de la imagen sea una potencia de 2; afortunadamente, la mayoría de las plataformas Android ahora admiten ETC1/ETC2. ETC2 es una extensión de ETC, admite canales transparentes , y el ancho y alto de la imagen Siempre que sea un múltiplo de 4, las plataformas de PC también admiten DXT1/DXT5/DXT5. Los principios de DXT3 y DXT5 son los mismos que los de DXT1, excepto que DXT3 y DXT5 admiten canales transparentes y el El ancho y el alto de la imagen también deben ser múltiplos de 4; ASTC El formato también es compatible con cada vez más plataformas, por lo que cuando configuramos el tamaño de la imagen, solo necesitamos configurarlo en un múltiplo de 4. Además, si Generar mapas Mip está activado, solo se puede comprimir la potencia de 2, porque el mapa mip generado debe tener una potencia de 2 píxeles.

Consejos de conocimiento:

1. Para las imágenes, ahora se utiliza el atlas de sprites para administrar las imágenes. Para las imágenes que se van a ingresar en el atlas, no es necesario establecer el tamaño en múltiplos de 4, porque estas imágenes eventualmente se ingresarán en el atlas. Puede modificar el atlas. Configurar múltiplos de 4, pero una desventaja de esto es que para mantener el tamaño del conjunto múltiplos de 4, el álbum tiene que desperdiciar algo de espacio, por lo que la mejor manera es configurar todas las imágenes en múltiplos de 4. 4; no ingrese la imagen El tamaño de las imágenes configuradas debe controlarse estrictamente, preferiblemente un múltiplo de 4, y el tamaño máximo no debe exceder 1024x1024.

2. Desactive la opción Leer/Escribir, porque activar esta opción permitirá acceder a los datos de textura desde scripts, lo que producirá una copia de los datos de textura. La copia ocupará memoria, lo que equivale al doble del consumo de memoria de un dato de textura.

3. Configure el modo de filtro en Textura bilineal: filtrado trilineal trilineal (interpolación trilineal), la textura se difuminará entre diferentes niveles de mip, lo que aumentará la sobrecarga de la GPU.

4. Desactive Mipmap para textura Sprite: después de activar Mipmap, la memoria será 1,33 veces mayor que la de Mipmap que no está activado, porque Mipmap generará un conjunto de secuencias de textura cuyo largo y ancho se reducen una vez, hasta 1*1. Mipmap mejora la eficiencia de la GPU; generalmente se usa en escenas o personajes 3D, no se recomienda activarlo en la interfaz de usuario.

5. Establezca el modo Wrap en Sujetar: el modo Wrap utiliza el modo Repetir, que puede causar fácilmente que aparezca ruido en el borde del mapa.

Tome la plataforma de PC como ejemplo:

Si el largo y el ancho de la imagen importada son múltiplos de 4 y una potencia de 2, se comprimirá en RGB Compressed DXT1 o RGBA Compressed DXT5;

Si la longitud y el ancho de la imagen importada son múltiplos de 4 pero no potencias de 2, se comprimirán en (NPOT)RGB Compressed DXT1 o (NPOT)RGBA Compressed DXT5;

Si la longitud y el ancho de la imagen importada no son múltiplos de 4 o una potencia de 2, se comprimirán en (NPOT) RGB24/(NPOT) RGBA32. Estos son formatos sin comprimir y ocupan mucha memoria.

Supongo que te gusta

Origin blog.csdn.net/u014086857/article/details/129052970
Recomendado
Clasificación