Condividi tramite


Compressione a blocchi delle trame

CanvasBitmap supporta bitmap compresse in 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 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 bloccate possono essere salvate nei file DDS. Anche se questi possono essere generati da plug-in per applicazioni come Foto hop o Paint.NET, è necessario assicurarsi che il file risultante venga salvato con 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 in MSDN.

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 oggetto con alfa premoltiplicato:

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