Compartir a través de


Compresión de bloques de mapa de bits

CanvasBitmap admite mapas de bits comprimidos en bloques. Se pueden cargar desde un archivo DDS o crearse con CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).

Los mapas de bits comprimidos en bloques son excelentes para aplicaciones pesadas de mapa de bits (como juegos) porque ocupan menos memoria y se pueden dibujar de forma más eficaz. Un mapa de bits comprimido de bloques usa hasta 1/8 de la memoria de un mapa de bits sin comprimir. Como resultado, la GPU necesita acceder a mucha menos memoria al dibujar el mapa de bits, lo que da lugar a un dibujo más rápido.

Acerca de la compresión de bloques

La compresión de bloques es diferente a la compresión empleada por archivos PNG o JPG. Los formatos de archivo comprimidos se almacenan comprimidos, pero cuando Win2D los cargan, se descomprimen en un mapa de bits con un formato como DirectXPixelFormat::B8G8R8A8UIntNormalized, que usa 32 bits (4 bytes) por píxel. Por lo tanto, un mapa de bits de 256x256 tardaría 256 * 256 * 4 = 262 144 bytes.

Un mapa de bits comprimido de bloques usa 8 o 16 bytes (según el formato , más adelante) para almacenar un bloque de 4 x 4 píxeles. Por lo tanto, en este caso un mapa de bits de 256x256 tardaría 256 * 256 / (4 * 4) * 8 = 32 768 bytes o 256 * 256 / (4 * 4) * 16 = 65 536 bytes. ¡Eso es hasta 8 veces más pequeño! Dado que la compresión de bloques es compatible directamente con el hardware de GPU, el mapa de bits se puede comprimir en memoria y dibujar directamente desde el formato comprimido sin tener que descomprimirlo por completo.

Win2D admite tres formatos comprimidos de bloque. En la tabla siguiente se describen estos formatos, junto con un formato sin comprimir para la comparación.

DirectXPixelFormat Tamaño de mapa de bits de 4x4 Tamaño de mapa de bits de 256x256 Alpha
BC1Unorm 8 bytes 32 768 bytes 1 bit
BC2Unorm 16 bytes 65 536 bytes 4 bits
BC3Unorm 16 bytes 65 536 bytes ~8 bits (comprimido)
B8G8R8A8UintNormalized 64 bytes 262,144 bytes 8 bits

BC1Unorm, BC2Unorm y BC3Unorm difieren principalmente en cómo admiten alfa. BC1 solo admite alfa de 1 bits. BC2 admite cada píxel del bloque que tiene un valor alfa de 4 bits único. BC3 comprime los valores alfa.

Consulte la documentación de compresión de bloques direct2D y la documentación de compresión de bloques de Direct3D para obtener más información sobre cómo funciona la compresión de bloques.

Restricciones

  • Todas las texturas comprimidas de bloque deben tener un ancho y alto que sea un múltiplo de 4. Esto se debe a que la compresión de bloques funciona en bloques de 4 x 4 píxeles.
  • Cualquier operación en un sub rectángulo de una textura comprimida de bloques (mediante GetPixelBytes(), SetPixelBytes(Byte[])) CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)requiere que el sub rectángulo esté alineado con 4 píxeles.
  • Win2D requiere alfa premultipado al usar formatos comprimidos de bloque.

Creación de archivos DDS

Las imágenes comprimidas en bloques se pueden guardar en archivos DDS. Aunque estos se pueden generar mediante complementos a aplicaciones como Photoshop o Paint.NET, se debe tener cuidado para asegurarse de que el archivo resultante se guarda con alfa premultipado. Win2D cargará cualquier archivo DDS que contenga una BC1UnormBC2Unorm imagen o BC3Unorm y presupone que se crea con alfa premultipado.

Si va a crear un proyecto de C++, puede usar la canalización de contenido de imágenes para convertir la imagen, como se describe en MSDN.

Como alternativa, puede usar texconv.exe desde https://github.com/Microsoft/DirectXTex. texconv.exe se puede crear mediante la solución DirectXTex_Desktop_2015.sln. El siguiente comando convierte "smoke.png" en un BC3Unorm con alfa premultipado:

texconv -pmalpha -m 1 -f BC3_UNORM smoke.png