Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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