Compressione a blocchi delle trame

CanvasBitmap supporta bitmap compresse a blocchi. Questi file possono essere caricati da un file DDS o creati con CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).

Le bitmap compresse bloccate sono ideali per le applicazioni bitmap pesanti (ad esempio i giochi) perché occupano meno memoria e possono essere disegnate in modo più efficiente. Una bitmap compressa a blocchi usa fino a 1/8 della memoria di una bitmap non compressa. Di conseguenza, la GPU deve accedere a una quantità molto inferiore di memoria quando si disegna la bitmap, ottenendo un disegno più veloce.

Informazioni sulla compressione dei blocchi

La compressione a blocchi è diversa dalla compressione utilizzata dai file PNG o JPG. La compressione a blocchi è diversa dalla compressione utilizzata dai file PNG o JPG. I formati di file compressi vengono archiviati compressi, ma quando vengono caricati da Win2D vengono decompressi in una bitmap con un formato come DirectXPixelFormat::B8G8R8A8UIntNormalized, che usa 32 bit (4 byte) per pixel. Quindi una bitmap 256x256 richiederebbe 256 * 256 * 4 = 262.144 byte.

Una bitmap compressa a blocchi usa 8 o 16 byte (a seconda del formato, più avanti) per archiviare un blocco di 4x4 pixel. In questo caso, una bitmap 256x256 richiederebbe 256 * 256 * 256 / (4 * 4) * 8 = 32.768 byte o 256 * 256 / (4 * 4) * 16 = 65.536 byte. Questo è fino a 8 volte più piccolo! Poiché la compressione a blocchi è supportata direttamente dall'hardware GPU, la bitmap può essere mantenuta compressa in memoria e disegnata direttamente dal formato compresso senza doverla mai decomprimere completamente.

Win2D supporta tre formati compressi a blocchi. La tabella seguente descrive questi formati, insieme a un formato non compresso per il confronto.

DirectXPixelFormat Dimensioni della bitmap 4x4 Dimensioni della bitmap da 256x256 Alfa
BC1Unorm 8 byte 32.768 byte 1 bit
BC2Unorm 16 byte 65.536 byte 4 bit
BC3Unorm 16 byte 65.536 byte ~8 bit (compresso)
B8G8R8A8UintNormalized 64 byte 262.144 byte 8 bit

BC1Unorm, BC2Unorm e BC3Unorm differiscono principalmente per il modo in cui supportano alfa. BC1 supporta solo alfa a 1 bit. BC2 supporta ogni pixel nel blocco con un valore alfa a 4 bit univoco. BC3 comprime i valori alfa.

Per altre informazioni sul funzionamento della compressione a blocchi, vedere la documentazione sulla compressione a blocchi Direct2D e la documentazione sulla compressione a blocchi Direct3D.

Restrizioni

  • Tutte le trame compresse a blocchi devono avere una larghezza e un'altezza che è un multiplo di 4. Ciò è dovuto al fatto che la compressione a blocchi funziona su blocchi di 4x4 pixel.
  • Qualsiasi operazione su un sotto rettangolo di una trama compressa a blocchi (usando GetPixelBytes(), SetPixelBytes(Byte[]), CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) richiede che il rettangolo secondario sia allineato a 4 pixel.
  • Win2D richiede alfa premoltiplicato quando si usano formati compressi in blocchi.

Creazione di file DDS

Le immagini compresse a blocchi possono essere salvate in file DDS. Sebbene questi possano essere generati da plugin di applicazioni come Photoshop o Paint.NET, occorre assicurarsi che il file risultante venga salvato con l’alfa premoltiplicato. Win2D caricherà qualsiasi file DDS contenente un'immagine BC1Unorm, BC2Unorm or BC3Unorm e presupporrà che venga creato con alfa premoltiplicato.

Se si crea un progetto C++, è possibile usare la pipeline di contenuto immagine per convertire l'immagine, come descritto nella documentazione Visual Studio.

In alternativa, è possibile usare texconv.exe da https://github.com/Microsoft/DirectXTex. texconv.exe può essere compilato usando la soluzione DirectXTex_Desktop_2015.sln. Il comando seguente converte "smoke.png" in un BC3Unorm con alfa premoltiplicato:

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