纹理压缩

纹理压缩是专门应用于纹理的图像压缩。

游戏的纹理可能会占用很大一部分内存,在内存和显存中也是如此。例如,一个 2048x2048 像素的纹理图像包含所有四个通道 (R,G,B 和 A),占用 (2048x2048) 像素 x4 通道 / 像素 x1 字节 / 通道 = 16777216 字节或 16MB 的显存。所有这些数据都需要加载到内存中,然后发送到内存中。

可以压缩纹理以减小其大小,从而最大限度地减少在预取纹理时需要从 RAM 内存移动到 VRAM 的数据量(因为可用带宽有限)。此外,如果您的游戏执行多次纹理查找,并且运行该游戏的平台没有足够的图形内存带宽来处理高帧速率的纹理读取,则游戏可能会变慢。

GameMaker 有两种方式支持纹理压缩和解压缩。纹理压缩按纹理组设置,并根据使用的格式而不同: 

下图显示了不同纹理格式的比较: 

不同纹理组格式的比较。
从左到右:BZ2 + QOI (无 GPU 纹理压缩)、BC7 和 BC3。

GPU 压缩纹理

纹理以压缩格式存储在 VRAM 中,并由 GPU 实时解压缩。

自定义GPU纹理压缩使用扩展:GM-GPUTextureCompression。要生成 GPU 纹理,应首先将此扩展添加到项目中。

添加扩展后,要为纹理组启用GPU压缩纹理:

当游戏被编译时,纹理由外部工具生成,该工具通过扩展执行。该工具将纹理压缩为优化的格式,以便在 GPU 上解压缩。

有关支持的可用纹理格式的完整信息,请参阅 wiki

警告 某些纹理格式仅在某些平台上受支持。您应确保为要编译的平台选择适当的纹理格式。如果扩展不存在或任何设置不正确,则输出窗口中会显示错误消息。

GPU 压缩纹理使用块压缩进行压缩。这是 GPU 压缩的最常见形式,几乎所有现代平台都支持某种格式。当 GPU 纹理使用例如 BCN 压缩从原始图像生成时,它被细分为固定大小的 4x4 像素或纹理块 (其他压缩算法支持不同的块大小 ). 这个块中像素的信息被转换成一个 128 位的值.当 GPU 读回这个值时,它会尽可能精确地从请求的像素中恢复颜色值。有关详细信息,请参阅 S3_Texture_Compression