Bitmap blok sıkıştırma

CanvasBitmap, blok sıkıştırmalı bit eşlemlerini destekler. Bunlar bir DDS dosyasından yüklenebilir veya ile CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat)oluşturulabilir.

Blok sıkıştırılmış bit eşlemler, bit eşlem ağır uygulamaları (oyunlar gibi) için mükemmeldir çünkü bunlar daha az bellek alır ve daha verimli bir şekilde çizilebilir. Blok sıkıştırılmış bit eşlem sıkıştırılmamış bit eşlem belleğinin en fazla 1/8'ini kullanır. Sonuç olarak, bit eşlemi çizerken GPU'nın çok daha az belleğe erişmesi gerekir ve bu da daha hızlı çizime neden olur.

Blok sıkıştırma hakkında

Blok sıkıştırma, PNG veya JPG dosyaları tarafından kullanılan sıkıştırmadan farklıdır. Sıkıştırılmış dosya biçimleri sıkıştırılmış olarak depolanır; ancak Win2D tarafından yüklendiklerinde, sıkıştırmaları çözülerek piksel başına 32 bit (4 bayt) kullanan DirectXPixelFormat::B8G8R8A8UIntNormalized gibi bir bitmap biçimine dönüştürülürler. Dolayısıyla 256x256 bit eşlemli görüntü 256 * 256 * 4 = 262.144 bayt yer kaplar.

Blok sıkıştırmalı bir bit eşlem, 4x4 piksellik bir bloğu depolamak için 8 veya 16 bayt (biçime bağlı olarak -- buna daha sonra değineceğiz) kullanır. Bu durumda 256x256 bit eşlem 256 * 256 / (4 * 4) * 8 = 32.768 bayt veya 256 * 256 / (4 * 4) * 16 = 65.536 bayt kadar sürebilir. Bu, 8 kat daha küçüktür! Blok sıkıştırma doğrudan GPU donanımı tarafından desteklendiğinden bit eşlem bellekte sıkıştırılabilir ve sıkıştırmayı tamamen açmak zorunda kalmadan doğrudan sıkıştırılmış biçimden çekilebilir.

Win2D üç blok sıkıştırılmış biçimi destekler. Aşağıdaki tabloda bu biçimler ve karşılaştırma için sıkıştırılmamış biçim açıklanmaktadır.

DirectXPixelFormat 4x4 bitmap boyutu 256x256 bit eşlem boyutu Alpha
BC1Unorm 8 bayt 32.768 bayt 1 bit
BC2Unorm 16 bayt 65.536 bayt 4 bit
BC3Unorm 16 bayt 65.536 bayt ~8 bit (sıkıştırılmış)
B8G8R8A8UintNormalized 64 bayt 262.144 bayt 8 bit

BC1Unormve BC2UnormBC3Unorm çoğunlukla alfayı nasıl destekledikleri konusunda farklılık gösterir. BC1 yalnızca 1 bit alfayı destekler. BC2, bloktaki her pikselin benzersiz bir 4 bit alfa değerine sahip olmasını destekler. BC3, alfa değerlerini sıkıştırır.

Blok sıkıştırmanın nasıl çalıştığı hakkında daha fazla bilgi için Direct2D Blok Sıkıştırma belgelerine ve Direct3D Blok Sıkıştırma belgelerine bakın.

Restrictions

  • Tüm blok sıkıştırılmış dokuların genişliği ve yüksekliği 4'ün katı olmalıdır. Bunun nedeni blok sıkıştırmanın 4x4 piksellik bloklarda çalışmasıdır.
  • Blok sıkıştırılmış dokusunun alt dikdörtgeni üzerindeki herhangi bir işlem (GetPixelBytes()kullanarak , SetPixelBytes(Byte[])CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)), alt dikdörtgenin 4 piksel hizalanmış olmasını gerektirir.
  • Win2D, blok sıkıştırmalı biçimler kullanıldığında önceden çarpılmış alfa gerektirir.

DDS dosyaları yazma

Blok sıkıştırılmış görüntüleri DDS dosyalarına kaydedilebilir. Bunlar Photoshop veya Paint.NET gibi uygulamalara yönelik eklentilerle üretilebilse de, ortaya çıkan dosyanın önceden çarpılmış alfa ile kaydedildiğinden emin olmak için dikkatli olunmalıdır. Win2D, BC1Unorm, BC2Unorm veya BC3Unorm görüntüsü içeren tüm DDS dosyalarını yükler ve bunların önceden çarpılmış alfa ile oluşturulduğunu varsayar.

C++ projesi yazarsanız, Visual Studio belgelerinde açıklandığı gibi görüntüyü dönüştürmek için Görüntü İçeriği İşlem Hattı'nı kullanabilirsiniz.

Alternatif olarak, https://github.com/Microsoft/DirectXTex içinden texconv.exe kullanabilirsiniz. texconv.exe DirectXTex_Desktop_2015.sln çözümü kullanılarak oluşturulabilir. Aşağıdaki komut, "smoke.png" dosyasını önceden çarpılmış alfa içeren bir BC3Unorm öğesine dönüştürür:

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