Поделиться через


Сжатие блоков растрового рисунка

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