Kompresja bloku mapy bitowej

CanvasBitmap obsługuje skompresowane mapy bitowe blokowe. Można je załadować z pliku DDS lub utworzyć za pomocą polecenia CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).

Skompresowane mapy bitowe blokowe doskonale nadają się do dużych aplikacji map bitowych (takich jak gry), ponieważ zajmują mniej pamięci i mogą być rysowane wydajniej. Mapa bitowa skompresowana blokowo wykorzystuje do 1/8 pamięci niż nieskompresowana mapa bitowa. W rezultacie procesor GPU musi uzyskać dostęp do znacznie mniejszej ilości pamięci podczas rysowania mapy bitowej, co powoduje szybsze rysowanie.

Informacje o kompresji blokowej

Kompresja bloku różni się od kompresji stosowanej przez pliki PNG lub JPG. Skompresowane formaty plików są przechowywane skompresowane, ale gdy są ładowane przez Win2D, są dekompresowane do mapy bitowej w formacie takim jak DirectXPixelFormat::B8G8R8A8UIntNormalized, który używa 32 bitów (4 bajty) na piksel. Więc mapa bitowa 256x256 zajmie 256 * 256 * 4 = 262,144 bajtów.

Skompresowana mapa bitowa bloku używa 8 lub 16 bajtów (w zależności od formatu — więcej na ten temat później) do przechowywania bloku o rozmiarze 4x4 pikseli. W tym przypadku mapa bitowa 256x256 zajęłaby 256 * 256 / (4 * 4) * 8 = 32 768 bajtów lub 256 * 256 / (4 * 4) * 16 = 65 536 bajtów. To nawet 8 razy mniej! Ponieważ kompresja bloków jest obsługiwana bezpośrednio przez sprzęt procesora GPU, mapa bitowa może być kompresowana w pamięci i pobierana bezpośrednio ze skompresowanego formatu bez konieczności całkowitego odłączania go.

Win2D obsługuje trzy skompresowane formaty bloków. W poniższej tabeli opisano te formaty wraz z nieskompresowanym formatem porównania.

DirectXPixelFormat Rozmiar mapy bitowej 4x4 Rozmiar mapy bitowej 256x256 Alpha
BC1Unorm 8 bajtów 32 768 bajtów 1 bit
BC2Unorm 16 bajtów 65 536 bajtów 4-bitowy
BC3Unorm 16 bajtów 65 536 bajtów ~8-bitowy (skompresowany)
B8G8R8A8UintNormalized 64 bajty 262 144 bajtów 8 bitów

BC1Unorm, BC2Unorm i BC3Unorm różnią się głównie sposobem obsługi kanału alfa. Bc1 obsługuje tylko 1-bitową alfa. Bc2 obsługuje każdy piksel w bloku o unikatowej 4-bitowej wartości alfa. BC3 kompresuje wartości alfa.

Aby uzyskać więcej informacji na temat działania kompresji bloków, zobacz dokumentację kompresji bloków Direct2D i kompresję bloków Direct3D .

Restrictions

  • Wszystkie ściśnięte tekstury blokowe muszą mieć szerokość i wysokość, która jest wielokrotną 4. Dzieje się tak, ponieważ kompresja bloków działa na blokach o rozmiarze 4x4 pikseli.
  • Każda operacja na podprostokącie tekstury skompresowanej blokowo (przy użyciu GetPixelBytes(), SetPixelBytes(Byte[]), CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) wymaga, aby podprostokąt był wyrównany do granicy 4 pikseli.
  • Win2D wymaga wstępnie przemnożonego kanału alfa podczas używania formatów kompresji blokowej.

Tworzenie plików DDS

Blokowe skompresowane obrazy można zapisywać w plikach DDS. Chociaż można je wygenerować za pomocą wtyczek do aplikacji takich jak Photoshop lub Paint.NET, należy upewnić się, że wynikowy plik został zapisany z wstępnie przemnożonym kanałem alfa. Win2D załaduje dowolny plik DDS zawierający obraz BC1Unorm, BC2Unorm lub BC3Unorm i założy, że został on utworzony z użyciem wstępnie przemnożonego kanału alfa.

Jeśli tworzysz projekt w języku C++, możesz użyć potoku przetwarzania zawartości obrazu do przekonwertowania tego obrazu, zgodnie z opisem w dokumentacji Visual Studio.

Alternatywnie możesz użyć texconv.exe z https://github.com/Microsoft/DirectXTex. texconv.exe można utworzyć przy użyciu rozwiązania DirectXTex_Desktop_2015.sln. Poniższe polecenie konwertuje „smoke.png” na BC3Unorm z wstępnie przemnożonym kanałem alfa:

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