Сжатие блоков растрового рисунка
CanvasBitmap
поддерживает сжатые растровые изображения. Их можно загрузить из DDS-файла или создать с помощью CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat)
.
Блочные сжатые растровые изображения отлично подходят для тяжелых приложений (таких как игры), так как они занимают меньше памяти и могут быть нарисованы более эффективно. Блок сжатого растрового изображения использует до 1/8-го объема памяти несжатой растровой карты. В результате gpu должен получить доступ к гораздо меньшему объему памяти при рисовании растрового изображения, что приведет к более быстрому рисованию.
Сведения о сжатие блоков
Сжатие блоков отличается от сжатия, используемого PNG или JPG-файлами. Сжатые форматы файлов хранятся в сжатом виде, но при их загрузке Win2D они распаковываются в растровое изображение с таким форматом, как DirectXPixelFormat::B8G8R8A8UIntNormalized
формат, который использует 32 бита (4 байта) на пиксель. Таким образом, 256x256 битовое изображение займет 256 * 256 * 4 = 262 144 байта.
Блочное растровое изображение использует 8 или 16 байтов (в зависимости от формата— больше в этом случае) для хранения блока размером 4x4 пикселей. Поэтому в этом случае 256x256 битовая карта займет до 256 * 256 / (4 * 4) * 8 = 32 768 байт, или 256 * 256 / (4 * 4) * 16 = 65 536 байт. Это до 8 раз меньше! Так как сжатие блоков поддерживается непосредственно оборудованием GPU, растровое изображение можно хранить в памяти и получать непосредственно из сжатого формата без необходимости полностью распаковывать его.
Win2D поддерживает три сжатых формата блока. В таблице ниже описаны эти форматы, а также несжатый формат для сравнения.
DirectXPixelFormat |
Размер 4x4-битового изображения | Размер растрового изображения размером 256x256 | Коэффициент альфа |
---|---|---|---|
BC1Unorm |
8 байт | 32 768 байт | 1 бит |
BC2Unorm |
16 байт | 65 536 байт | 4-разрядная версия |
BC3Unorm |
16 байт | 65 536 байт | ~8 бит (сжатый) |
B8G8R8A8UintNormalized |
64 байта | 262 144 байта | 8 бит |
BC1Unorm
, BC2Unorm
и BC3Unorm
в основном отличаются в том, как они поддерживают альфа. BC1 поддерживает только 1-разрядную альфа-версию. BC2 поддерживает каждый пиксель в блоке с уникальным 4-разрядным альфа-значением. BC3 сжимает альфа-значения.
Дополнительные сведения о том, как работает сжатие блоков, см . в документации по сжатия блоков Direct2D и документации по сжатием блоков Direct3D.
Ограничения
- Все сжатые текстуры блока должны иметь ширину и высоту, которая составляет 4. Это связано с тем, что сжатие блоков работает на блоках 4x4 пикселей.
- Любая операция с вложенным прямоугольником сжатой текстуры блока (с помощью
GetPixelBytes()
SetPixelBytes(Byte[])
, )CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)
требует, чтобы подстановка была выровнена по 4 пикселям. - Для Win2D требуется предварительно подготовленный альфа-файл при использовании сжатых блоков форматов.
Создание DDS-файлов
Блокировать сжатые изображения можно сохранить в файлах DDS. Несмотря на то, что они могут быть созданы подключаемыми модулями для таких приложений, как Photoshop или Paint.NET, необходимо принять меры, чтобы обеспечить сохранение результирующего файла с предварительно подготовленным альфа-файлом. Win2D загружает любой DDS-файл, BC1Unorm
содержащий изображение или BC3Unorm
изображение, BC2Unorm
и предполагается, что он создан с предварительно подготовленным альфа-файлом.
Если вы создаете проект C++, можно использовать конвейер содержимого изображения для преобразования изображения, как описано в MSDN.
Кроме того, можно использовать из texconv.exe
https://github.com/Microsoft/DirectXTex. texconv.exe
можно создавать с помощью решения DirectXTex_Desktop_2015.sln. Следующая команда преобразует "smoke.png" в букву BC3Unorm
с предварительно заданным альфа-кодом:
texconv -pmalpha -m 1 -f BC3_UNORM smoke.png
Windows developer