title: Defold 中的纹理档案
Defold 可以自动把图片数据处理成纹理并进行压缩 (称为 Atlas, Tile sources, Cubemaps 和模型纹理, GUI资源等等).
压缩有两种, 图片软件压缩与纹理硬件压缩.
软件压缩 (比如 PNG 和 JPEG) 减少了图片占用空间. 可以让成品打包小一点. 但是读取到内存的时候必须解压, 硬盘上很小的图片, 都可能占用大量内存空间.
硬件压缩也是减小图片占用空间. 区别于软件压缩的是, 纹理的内存占用也能减少. 这是因为图像硬件可以直接处理压缩图片而省去了解压过程.
纹理的处理基于纹理档案的设定. Profiles 描述了不同平台下使用哪种压缩格式和纹理类型. Profiles 绑定了 paths patterns, 用以微调和确定实际的压缩算法.
因为所有硬件压缩都是有损的, 纹理数据可能会不如压缩前好看. 造成这种现象的原因高度取决于材质和压缩算法. 为了得到最好的效果就需要多多尝试. 别忘了 Google 是你的好伙伴.
软件压缩方面可以在打包时选择如何保存纹理数据 (压缩或者原图). Defold 支持 基础通用 纹理压缩, 它能把图片压缩为一个中间格式. 这种格式可以在运行时解码为适合硬件 GPU 使用的数据. 基础通用格式是高质量有损格式. 打包时还会使用 LZ4 算法进一步对图片进行压缩以减小包体.
::: sidenote 压缩属于资源密集型耗时操作, 图片多的话可以 大大 增加编译时间, 还取决于你选择的纹理格式和压缩类型. :::
每个项目都有 .texture_profiles 文件用来进行纹理压缩设置. 默认情况下, 这个文件位于 builtins/graphics/default.texture_profiles 并且设置为所有纹理都绑定一个档案就是使用 RGBA 不进行硬件压缩并且使用默认 ZLib 压缩算法.
新增纹理压缩:
你可以选择启用还是禁用纹理档案. 点击 File ▸ Preferences.... 在 General 部分就有 Enable texture profiles 选项.
纹理档案的 Path Settings 部分是一个 profile 表格用以引用各种档案路径. 路径使用 "Ant Glob" 样式 (详情请见 http://ant.apache.org/manual/dirtasks.html#patterns) 表示. 样式中可以使用通配符:
*
: 匹配0个或多个字符. 例如 sprite*.png 匹配文件 sprite.png, sprite1.png 和 sprite_with_a_long_name.png.
?
: 匹配1个字符. 例如 sprite?.png 匹配文件 sprite1.png, spriteA.png, 但是不匹配文件 sprite.png 和 sprite_with_a_long_name.png.
**
: 匹配一个目录树, 或者在目录名中使用时可匹配多个目录. 例如 /gui/** 匹配 /gui 及其所有子目录下的文件.
本例中引用了两个档案路径.
/gui/**/*.atlas
: 在 /gui 下及其子目录下的所有 .atlas 文件被描述为 "gui_atlas" 档案.
/**/*.atlas
: 项目中所有 .atlas 文件被描述为 "atlas" 档案.
注意把广泛匹配放在下面. 文件匹配是从上到下进行的. 上面的匹配优先与下面的. 下面的档案不会覆盖上面的. 否则的话所有 "atlas" 都被第二条匹配了, 包括第一条 /gui 下的.
对于 没有被 匹配到的纹理会被编译且缩放为最近的2次方幂大小, 或者不做任何压缩处理.
profiles 包含与上述对应的档案表. 每个档案包含一个或多个 platforms, 每个平台又包括一系列属性设定.
Platforms
: 指定平台. OS_ID_GENERIC 匹配所有平台, OS_ID_WINDOWS 对应 Windows 平台, OS_ID_IOS 对应 iOS 平台. 注意如果使用 OS_ID_GENERIC, 设定将会对所有平台生效.
::: important 如果两个 路径样式 匹配一个文件并且这两个路径分别指定不同的平台, 那么这两个档案 都会 生效, 所以会生成 两个 纹理. :::
Formats : 纹理格式. 如果指定多个, 每个格式都会生效. 引擎会在运行时选择合适的纹理格式.
Mipmaps : 是否生成mipmap. 默认不勾选.
Premultiply alpha : 是否预乘alpha. 默认勾选.
Max Texture Size : 如果填入非0值, 纹理将限制最大尺寸为填入值. 如果图片本身比填入值打, 纹理会被缩小.
对于每个档案的每个 Formats, 又有以下属性设定:
Format : 纹理编码格式. 可用格式见下文.
Compression : 选择图片压缩质量等级.
| 等级 | 说明 |
|---|---|
FAST |
压缩速度最快. 图片质量最低 |
NORMAL |
默认压缩. 图片质量最高 |
HIGH |
最慢压缩. 缩小图片文件大小 |
BEST |
慢压缩. 图片文件大小最小 |
::: sidenote 为了避免歧义, 从版本 1.2.185 开始, 等级枚举用词做了调整. :::
Type
: 压缩类型, 可选值有 COMPRESSION_TYPE_DEFAULT 或 COMPRESSION_TYPE_BASIS_UASTC. 详见下文 压缩类型.
硬件可以直接处理未压缩纹理以及 有损 压缩纹理. 固定硬件压缩意思是纹理大小是一定的, 而不论纹理的内容. 一定意义上原图内容决定了硬件压缩后纹理的质量.
因为基础通用压缩解码取决于设备的 GPU 功能, 推荐配合基础通用压缩的格式为:
TEXTURE_FORMAT_RGB, TEXTURE_FORMAT_RGBA, TEXTURE_FORMAT_RGB_16BPP, TEXTURE_FORMAT_RGBA_16BPP, TEXTURE_FORMAT_LUMINANCE 与 TEXTURE_FORMAT_LUMINANCE_ALPHA.
基础通用压缩解码支持各种输出格式, 例如 ASTC4x4, BCx, ETC2, ETC1 与 PVRTC1.
目前支持以下有损压缩格式:
| 格式 | 压缩 | 描述 |
| --------------------------------- | ----------- | -------------------------------- | ---- |
| TEXTURE_FORMAT_RGB | none | 3 颜色通道. Alpha 被丢弃 |
| TEXTURE_FORMAT_RGBA | none | 3 颜色通道和 1 alpha 通道. |
| TEXTURE_FORMAT_RGB_16BPP | none | 3 颜色通道. 5+6+5 比特. |
| TEXTURE_FORMAT_RGBA_16BPP | none | 3 颜色通道和 1 alpha 通道. 4+4+4+4 比特. |
| TEXTURE_FORMAT_LUMINANCE | none | 1 灰度通道, 无 alpha 通道. RGB 编码为 1 颜色通道. Alpha 被丢弃. |
| TEXTURE_FORMAT_LUMINANCE_ALPHA | none | 1 灰度通道和 1 alpha 通道. RGB 编码为 1 颜色通道. |
支持以下软件压缩类型. 载入内存时需要解压.
::: sidenote 我们目前正在研究重新支持硬件格式以及读取 WEBP 压缩格式. 远期未来目标是引入内容管线插件来解决这个问题. :::
| 类型 | 格式 | 说明 |
|---|---|---|
COMPRESSION_TYPE_DEFAULT |
All formats | 常见有损压缩. 默认类型. |
COMPRESSION_TYPE_BASIS_UASTC |
All RGB/RGBA formats | 基础通用高质, 有损压缩. 质量等级越低体积越小. |
为了便于更好地理解, 这里举了一个例子. 注意图片质量, 压缩时间和压缩量取决于原始图片, 不同图片可能效果不同.
| 等级 | 压缩时间 | 倍率 |
| ----------------------------- | --------------- |
| FAST | 0m0.143s | 0.5x |
| NORMAL | 0m0.294s | 1.0x |
| HIGH | 0m1.764s | 6.0x |
| BEST | 0m1.109s | 3.8x |
这里使用 basisu 工具进行比较 (比较参数 PSNR)
100 dB 表示不失真 (也就是说和原始图片完全相同).
| 等级 | 数据 |
| ------------------------------------------------------------ |
| FAST | Max: 34 Mean: 0.470 RMS: 1.088 PSNR: 47.399 dB |
| NORMAL | Max: 35 Mean: 0.439 RMS: 1.061 PSNR: 47.620 dB |
| HIGH | Max: 37 Mean: 0.898 RMS: 1.606 PSNR: 44.018 dB |
| BEST | Max: 51 Mean: 1.298 RMS: 2.478 PSNR: 40.249 dB |
原始文件 1572882 字节.
| 等级 | 文件大小 | 压缩率 |
| ---------------------------------- |
| FAST | 357225 | 22.71 % |
| NORMAL | 365548 | 23.24 % |
| HIGH | 277186 | 17.62 % |
| BEST | 254380 | 16.17 % |
下面给出压缩后的图片 (使用basisu 工具的 ASTC 编码进行了修正)