Kompresi blok bitmap

CanvasBitmap mendukung bitmap terkompresi blok. Ini dapat dimuat dari file DDS, atau dibuat dengan CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).

Bitmap terkompresi berbasis blok sangat bagus untuk aplikasi yang banyak menggunakan bitmap (seperti game) karena menggunakan lebih sedikit memori dan dapat dirender dengan lebih efisien. Bitmap terkompresi blok hanya menggunakan hingga 1/8 dari memori bitmap yang tidak terkompresi. Akibatnya, GPU perlu mengakses memori yang jauh lebih sedikit saat menggambar bitmap, menghasilkan gambar yang lebih cepat.

Tentang kompresi blok

Kompresi blok berbeda dengan kompresi yang digunakan oleh file PNG atau JPG. Format file terkompresi disimpan dikompresi tetapi ketika dimuat oleh Win2D, format file tersebut didekompresi ke dalam bitmap dengan format seperti DirectXPixelFormat::B8G8R8A8UIntNormalized, yang menggunakan 32 bit (4 byte) per piksel. Jadi bitmap 256x256 akan memakan waktu 256 * 256 * 4 = 262.144 byte.

Bitmap terkompresi per blok menggunakan 8 atau 16 byte (tergantung pada format -- hal ini akan dibahas lebih lanjut nanti) untuk menyimpan blok sebesar 4x4 piksel. Jadi dalam hal ini bitmap 256x256 akan memakan waktu 256 * 256 / (4 * 4) * 8 = 32.768 byte, atau 256 * 256 / (4 * 4) * 16 = 65.536 byte. Itu hingga 8 kali lebih kecil! Karena kompresi blok didukung langsung oleh perangkat keras GPU, bitmap dapat tetap disimpan dalam keadaan terkompresi di memori dan dirender langsung dari format terkompresi tanpa harus pernah mendekompresinya sepenuhnya.

Win2D mendukung tiga format terkompresi blok. Tabel di bawah ini menjelaskan format ini, bersama dengan format yang tidak dikompresi untuk perbandingan.

DirectXPixelFormat Ukuran bitmap 4x4 Ukuran bitmap 256x256 Alpha
BC1Unorm 8 byte 32.768 byte 1 bit
BC2Unorm 16 byte 65.536 byte 4 bit
BC3Unorm 16 byte 65.536 byte ~8 bit (terkompresi)
B8G8R8A8UintNormalized 64 byte 262.144 byte 8 bit

BC1Unorm, BC2Unorm dan BC3Unorm sebagian besar berbeda dalam cara mereka mendukung alfa. BC1 hanya mendukung alfa 1-bit. BC2 mendukung setiap piksel dalam blok yang memiliki nilai alfa 4-bit yang unik. BC3 memadatkan nilai alfa.

Lihat dokumentasi Kompresi Blok Direct2D dan dokumentasi Kompresi Blok Direct3D untuk informasi selengkapnya tentang cara kerja kompresi blok.

Restrictions

  • Semua tekstur terkompresi blok harus memiliki lebar dan tinggi yang merupakan kelipatan 4. Ini karena kompresi blok berfungsi pada blok 4x4 piksel.
  • Setiap operasi pada subrektangel dari tekstur terkompresi blok (menggunakan GetPixelBytes(), SetPixelBytes(Byte[]), CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) mensyaratkan agar subrektangel tersebut disejajarkan pada batas 4 piksel.
  • Win2D memerlukan alpha premultiplied saat menggunakan format kompresi blok.

Membuat file DDS

Gambar dengan kompresi blok dapat disimpan dalam file DDS. Meskipun ini dapat dihasilkan oleh plugin untuk aplikasi seperti Photoshop atau Paint.NET, perlu berhati-hati untuk memastikan bahwa file yang dihasilkan disimpan dengan premultiplied alpha. Win2D akan memuat file DDS apa pun yang berisi gambar BC1Unorm, BC2Unorm, atau BC3Unorm dan menganggap bahwa file tersebut dibuat dengan alfa premultiplikasi.

Jika Anda menulis proyek C++ maka Anda dapat menggunakan Alur Konten Gambar untuk mengonversi gambar, seperti yang dijelaskan dalam dokumentasi Visual Studio.

Atau, Anda dapat menggunakan texconv.exe dari https://github.com/Microsoft/DirectXTex. texconv.exe dapat dibangun menggunakan solusi DirectXTex_Desktop_2015.sln. Perintah berikut mengonversi "smoke.png" menjadi BC3Unorm dengan alfa yang telah diubah sebelumnya:

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