Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
Windows developer