Defold 可以自动把图片数据处理成纹理并进行压缩 (称为 Atlas, Tile sources, Cubemaps 和模型纹理, GUI资源等等).
压缩有两种, 图片软件压缩与纹理硬件压缩.
软件压缩 (比如 PNG 和 JPEG) 减少了图片占用空间. 可以让成品打包小一点. 但是读取到内存的时候必须解压, 硬盘上很小的图片, 都可能占用大量内存空间.
硬件压缩也是减小图片占用空间. 区别于软件压缩的是, 纹理的内存占用也能减少. 这是因为图像硬件可以直接处理压缩图片而省去了解压过程.
纹理的处理基于纹理档案的设定. Profiles 描述了不同平台下使用哪种压缩格式和纹理类型. Profiles 绑定了 paths patterns, 用以微调和确定实际的压缩算法.
因为所有硬件压缩都是有损的, 纹理数据可能会不如压缩前好看. 造成这种现象的原因高度取决于材质和压缩算法. 为了得到最好的效果就需要多多尝试. 别忘了 Google 是你的好伙伴.
软件压缩方面可以在打包时选择如何保存纹理数据 (压缩或者原图). Defold 支持 基础通用 纹理压缩, 它能把图片压缩为一个中间格式. 这种格式可以在运行时解码为适合硬件 GPU 使用的数据. 基础通用格式是高质量有损格式. 打包时还会使用 LZ4 算法进一步对图片进行压缩以减小包体.
压缩属于资源密集型耗时操作, 图片多的话可以 大大 增加编译时间, 还取决于你选择的纹理格式和压缩类型.
每个项目都有 .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) 表示. 样式中可以使用通配符:
*
sprite*.png
匹配文件 sprite.png, sprite1.png 和 sprite_with_a_long_name.png.?
sprite?.png
匹配文件 sprite1.png, spriteA.png, 但是不匹配文件 sprite.png 和 sprite_with_a_long_name.png.**
/gui/**
匹配 /gui 及其所有子目录下的文件.本例中引用了两个档案路径.
/gui/**/*.atlas
/**/*.atlas
注意把广泛匹配放在下面. 文件匹配是从上到下进行的. 上面的匹配优先与下面的. 下面的档案不会覆盖上面的. 否则的话所有 “atlas” 都被第二条匹配了, 包括第一条 /gui 下的.
对于 没有被 匹配到的纹理会被编译且缩放为最近的2次方幂大小, 或者不做任何压缩处理.
profiles 包含与上述对应的档案表. 每个档案包含一个或多个 platforms, 每个平台又包括一系列属性设定.
OS_ID_GENERIC
匹配所有平台, OS_ID_WINDOWS
对应 Windows 平台, OS_ID_IOS
对应 iOS 平台. 注意如果使用 OS_ID_GENERIC
, 设定将会对所有平台生效.如果两个 路径样式 匹配一个文件并且这两个路径分别指定不同的平台, 那么这两个档案 都会 生效, 所以会生成 两个 纹理.
对于每个档案的每个 Formats, 又有以下属性设定:
等级 | 说明 |
---|---|
FAST |
压缩速度最快. 图片质量最低 |
NORMAL |
默认压缩. 图片质量最高 |
HIGH |
最慢压缩. 缩小图片文件大小 |
BEST |
慢压缩. 图片文件大小最小 |
为了避免歧义, 从版本 1.2.185 开始, 等级枚举用词做了调整.
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 颜色通道. |
支持以下软件压缩类型. 载入内存时需要解压.
我们目前正在研究重新支持硬件格式以及读取 WEBP 压缩格式. 远期未来目标是引入内容管线插件来解决这个问题.
类型 | 格式 | 说明 |
---|---|---|
COMPRESSION_TYPE_DEFAULT |
All formats | 常见有损压缩. 默认类型. |
COMPRESSION_TYPE_BASIS_UASTC |
All RGB/RGBA formats | 基础通用高质, 有损压缩. 质量等级越低体积越小. |
为了便于更好地理解, 这里举了一个例子. 注意图片质量, 压缩时间和压缩量取决于原始图片, 不同图片可能效果不同.
原始图片 (1024x512):
等级 | 压缩时间 | 倍率 |
---|---|---|
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 编码进行了修正)
FAST
NORMAL
HIGH
BEST
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB