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 位图 | Alpha |
---|---|---|---|
BC1Unorm |
8 字节 | 32,768 字节 | 1 位 |
BC2Unorm |
16 个字节 | 65,536 字节 | 4 位 |
BC3Unorm |
16 个字节 | 65,536 字节 | 约 8 位(压缩) |
B8G8R8A8UintNormalized |
64 字节 | 262,144 字节 | 8 位 |
BC1Unorm
, BC2Unorm
而且 BC3Unorm
在它们支持 alpha 的方式上大相径庭。 BC1 仅支持 1 位 alpha。 BC2 支持块中的每个像素具有唯一的 4 位 alpha 值。 BC3 压缩 alpha 值。
有关块压缩工作原理的详细信息,请参阅 Direct2D 块压缩文档 和 Direct3D 块压缩文档 。
限制
- 所有块压缩纹理的宽度和高度都必须是 4 的倍数。 这是因为块压缩适用于 4x4 像素块。
- 块压缩纹理(使用
GetPixelBytes()
,SetPixelBytes(Byte[])
)CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)
子矩形上的任何操作都要求子矩形对齐 4 像素。 - 使用块压缩格式时,Win2D 需要预乘 alpha。
创作 DDS 文件
块压缩图像可以保存在 DDS 文件中。 尽管这些插件可由 Photoshop 或 Paint.NET 等应用程序生成,但必须确保生成的文件是使用预乘 alpha 保存的。 Win2D 将加载包含或 BC1Unorm
图像的任何 DDS 文件, BC2Unorm
BC3Unorm
并假定它是使用预乘 alpha 创作的。
如果要创作C++项目,则可以使用图像内容管道转换图像,如 MSDN 中所述。
或者,可以使用 texconv.exe
. https://github.com/Microsoft/DirectXTex. texconv.exe
可以使用DirectXTex_Desktop_2015.sln解决方案生成。 以下命令将“smoke.png”转换为 BC3Unorm
预乘 alpha:
texconv -pmalpha -m 1 -f BC3_UNORM smoke.png