Bitmapblockkomprimering

CanvasBitmap stöder blockkomprimerade bitmappar. Dessa kan läsas in från en DDS-fil eller skapas med CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).

Blockkomprimerade bitmappar är utmärkta för bitmappsintensiva program (till exempel spel), eftersom de tar upp mindre minne och kan renderas effektivare. En blockkomprimerad bitmapp använder upp till 1/8 av minnet för en okomprimerad bitmapp. Därför måste GPU:n komma åt mycket mindre minne när bitmappen ritas, vilket resulterar i snabbare ritning.

Om blockkomprimering

Blockkomprimering skiljer sig från den komprimering som används av PNG- eller JPG-filer. Komprimerade filformat lagras komprimerade, men när de läses in av Win2D dekomprimeras de till en bitmapp med ett format som DirectXPixelFormat::B8G8R8A8UIntNormalized, som använder 32 bitar (4 byte) per pixel. Så en 256x256-bitmapp skulle ta upp 256 * 256 * 4 = 262 144 byte.

En blockkomprimerad bitmapp använder 8 eller 16 byte (beroende på format – mer om detta senare) för att lagra ett block på 4 x 4 bildpunkter. Så i det här fallet skulle en 256x256-bitkarta ta upp 256 * 256 / (4 * 4) * 8 = 32 768 byte, eller 256 * 256 / (4 * 4) * 16 = 65 536 byte. Det är upp till 8 gånger mindre! Eftersom blockkomprimering stöds direkt av GPU-maskinvaran kan bitmappen hållas komprimerad i minnet och hämtas direkt från det komprimerade formatet utan att behöva avkomprimera den helt.

Win2D stöder tre blockkomprimerade format. Tabellen nedan beskriver dessa format, tillsammans med ett okomprimerat format för jämförelse.

DirectXPixelFormat Storlek på 4x4-bitmapp Storlek på 256x256 bitmapp Alpha
BC1Unorm 8 byte 32 768 byte 1 bit
BC2Unorm 16 byte 65 536 byte 4 bit
BC3Unorm 16 byte 65 536 byte ~8 bitar (komprimerad)
B8G8R8A8UintNormalized 64 byte 262 144 byte 8 bit

BC1Unorm, BC2Unorm och BC3Unorm skiljer sig mest åt i hur de stöder alfa. BC1 stöder endast 1-bitars alfa. BC2 stöder varje pixel i blocket med ett unikt 4-bitars alfavärde. BC3 komprimerar alfavärdena.

Mer information om hur blockkomprimering fungerar finns i dokumentationen för Direct2D Block Compression och Direct3D Block Compression .

Restrictions

  • Alla blockkomprimerade texturer måste ha en bredd och höjd som är en multipel av 4. Detta beror på att blockkomprimering fungerar på block med 4 x 4 bildpunkter.
  • Alla åtgärder på en underrektangel av en blockkomprimerad textur (med hjälp av GetPixelBytes(), SetPixelBytes(Byte[]), CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) kräver att subrektangeln är 4 bildpunktsjusterad.
  • Win2D kräver premultiplicerad alfa vid användning av blockkomprimerade format.

Skapa DDS-filer

Blockkomprimerade bilder kan sparas i DDS-filer. Även om dessa kan genereras av insticksprogram för program som Photoshop eller Paint.NET, måste man se till att den resulterande filen sparas med premultiplicerad alfa. Win2D laddar alla DDS-filer som innehåller en BC1Unorm-, BC2Unorm- eller BC3Unorm-bild och förutsätter att den är skapad med premultiplicerad alfa.

Om du redigerar ett C++-projekt kan du använda pipelinen för bildinnehåll för att konvertera bilden, enligt beskrivningen i Visual Studio dokumentationen.

Du kan också använda texconv.exe från https://github.com/Microsoft/DirectXTex. texconv.exe kan skapas med hjälp av den DirectXTex_Desktop_2015.sln lösningen. Följande kommando konverterar "smoke.png" till en BC3Unorm med förmultiplicerad alfa:

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