Bitképblokkok tömörítése

CanvasBitmap támogatja a blokktömörített bitképeket. Ezek betölthetők egy DDS-fájlból, vagy a(z) CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat) segítségével hozhatók létre.

A blokktömörített bitképek nagyszerűek a bitképes alkalmazásokhoz (például játékokhoz), mivel kevesebb memóriát igényelnek, és hatékonyabban rajzolhatók. A blokktömörített bitképek a tömörítetlen bitképek memóriájának legfeljebb 1/8-át használják. Ennek eredményeképpen a GPU-nak sokkal kevesebb memóriát kell elérnie a bitkép rajzolásakor, ami gyorsabb rajzolást eredményez.

Tudnivalók a blokktömörítésről

A blokktömörítés eltér a PNG- vagy JPG-fájlok tömörítésétől. A tömörített fájlformátumok tömörítve vannak tárolva, de amikor a Win2D betölti őket, a rendszer egy bitképbe tömöríti őket, amely például DirectXPixelFormat::B8G8R8A8UIntNormalized32 bitet (4 bájt) használ képpontonként. Tehát egy 256x256-os bitkép 256 * 256 * 4 = 262 144 bájtot vesz igénybe.

A blokktömörített bitképek 8 vagy 16 bájtot használnak (a formátumtól függően – erről később bővebben olvashat) egy 4x4 képpontos blokk tárolására. Tehát ebben az esetben egy 256x256 bitkép 256 * 256 / (4 * 4) * 8 = 32 768 bájt, vagy 256 * 256 / (4 * 4) * 16 = 65 536 bájt. Ez akár 8-szor kisebb is lehet! Mivel a blokktömörítést közvetlenül a GPU-hardver támogatja, a bitkép a memóriában tömörítve tartható, és közvetlenül a tömörített formátumból rajzolható anélkül, hogy teljesen ki kellene vonnia a tömörítést.

A Win2D három blokktömörített formátumot támogat. Az alábbi táblázat ezeket a formátumokat ismerteti, valamint egy tömörítetlen formátumot az összehasonlításhoz.

DirectXPixelFormat 4x4-es bitkép mérete 256x256-os bitkép mérete Alpha
BC1Unorm 8 bájt 32 768 bájt 1 bit
BC2Unorm 16 bájt 65 536 bájt 4 bit
BC3Unorm 16 bájt 65 536 bájt ~8 bit (tömörített)
B8G8R8A8UintNormalized 64 bájt 262 144 bájt 8 bit

BC1Unorm, BC2Unorm és BC3Unorm leginkább abban különböznek, hogy hogyan támogatják az alfa. A BC1 csak az 1 bites alfát támogatja. A BC2 támogatja a blokk minden képpontjának egyedi 4 bites alfaértékét. A BC3 tömöríti az alfaértékeket.

A blokktömörítés működésével kapcsolatos további információkért tekintse meg a Direct2D blokktömörítés dokumentációját és a Direct3D blokktömörítés dokumentációját .

Restrictions

  • Minden blokktömörített anyagmintának 4-ből többszörös szélességűnek és magasságúnak kell lennie. Ennek az az oka, hogy a blokktömörítés 4x4 képpontos blokkokon működik.
  • A blokkosan tömörített textúra egy résztéglalapján végzett bármely művelethez (a GetPixelBytes(), SetPixelBytes(Byte[]) és CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32) használatával) az szükséges, hogy a résztéglalap 4 képponthoz igazított legyen.
  • A Win2D előre szorzott alfát igényel blokktömörítésű formátumok használatakor.

DDS-fájlok létrehozása

A blokktömörített képek DDS-fájlokba menthetők. Bár ezek olyan alkalmazások beépülő moduljaival hozhatók létre, mint a Photoshop vagy a Paint.NET, ügyelni kell arra, hogy az eredményül kapott fájl előre meghatározott alfa használatával legyen mentve. A Win2D minden olyan DDS-fájlt be fog tölteni, amely BC1Unorm, BC2Unorm vagy BC3Unorm képet tartalmaz, és feltételezi, hogy az premultiplikált alfával készült.

Ha C++ projektet hoz létre, a kép konvertálásához használhatja a Képtartalom-folyamatot a Visual Studio dokumentációban leírtak szerint.

Másik lehetőségként használhatja a(z) texconv.exe elemet innen: https://github.com/Microsoft/DirectXTex. texconv.exe a DirectXTex_Desktop_2015.sln megoldással hozható létre. A következő parancs a(z) "smoke.png" fájlt előre szorzott alfával rendelkező BC3Unorm-vá alakítja:

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