之前我写了一篇文章,在 UE 中集成了 ZSTD 压缩算法:ModularFeature:为 UE4 集成 ZSTD 压缩算法,并且把 UE5 中的 Oodle 的压缩算法库提取出来,可以在 UE4 中使用:Oodle Compression。最近分析了一下他们的压缩性能,分别测试了 WindowsNoEditor/Android_ASTC/IOS 三个平台。
打包和测试方法:
- 打出默认的 zlib 基础包,不包含任何资源
- 基础包内包含 oodle/zstd 等代码,在启动时可指定压缩器和 compresslevel
- 使用 HotPatcher 打包 StarterContent,每次打包三个平台,打包时通过命令指定使用的压缩算法、压缩器、压缩级别
- 运行时使用 Perfdog 和 stat compression 查看数据
使用不同的压缩算法打包 StarterContent 的大小(单位 MB):
以下数据中,Oodle 默认使用 Fast
压缩级别,区别是 compressor 的不同。
- | ZLIB | OODLE(Kraken) | OODLE(Leviathan) | Oodle(Hydra) | ZSTD(Level22) |
---|---|---|---|---|---|
WindowsNoEditor | 295.93 | 284 | 273.18 | 278.40 | 286 |
Android_ASTC | 177 | 170 | 165 | 167 | 171 |
IOS | 174 | 162 | 155 | 158 | 163 |
在 Oodle 的 Fast
模式下,打包 StarterContent 为 Android_ASTC
/IOS
/WindowsNoEditor
三个平台,只是打包 Pak 的耗时,总共约 35 秒。
在压缩级别开到最高的Optimal5
,压缩速度明显降低,但压缩率明显提升,三个平台约+00:06:55.764
,大约七分钟。
- | Leviathan(Fast) | Leviathan(Optimal5) | Leviathan(Optimal2) | ZSTD Level 22 |
---|---|---|---|---|
WindowsNoEditor | 273.18 (13.54s) | 263 (180.63s) | 266 (41.69s) | 286(31.24s) |
Android_ASTC | 165 (8.39s.) | 152 (95.59s) | 157 (23.19s) | 171(19.86s) |
IOS | 155 (10.38s) | 147 (138.13s) | 150 (34.96s) | 163(20.43s) |
Kraken 使用不同压缩级别的对比(文末有运行时对比数据):
- | Kraken(Fast) | Kraken(Optimal5) | Kraken(Optimal2) |
---|---|---|---|
WindowsNoEditor | 283 (5.83s) | 273 (82.24) | 276 (41.69s) |
Android_ASTC | 170 (3.52s.) | 161 (49.88s) | 166 (23.19s) |
IOS | 161 (4.01s) | 152 (57.34s) | 155 (34.96s) |
使用 stat 组合 PerfDog 分析各种压缩算法的效率,测试方法,加载不同压缩算法打包的 Pak,进入相同的地图(/Game/StarterContent/Maps/StarterMap
),开启stat compression
, 游览整个场景三分钟后的性能数据(移动端会开启 PerfDog 分析,会有一定的性能影响,但移动端所有的测试均使用相同的操作和流程,数据对比准确性还是 OK 的)。
WindowsNoEditor
- zlib
- oodle(Kraken+fast)
- oodle(Hydra+fast)
- oodle(Leviathan+fast)
- zstd(level22)
Android_ASTC
zlib
oodle(Kraken+fast)
oodle(Hydra+fast)
oodle(Leviathan+fast)
zstd(level22)
IOS
zlib
oodle(Kraken+fast)
oodle(Hydra+fast)
oodle(Leviathan+fast)
zstd(level22)
Kraken 不同压缩级别对比
测试包与 perfdog 环境与上文相同。
WindowsNoEditor
Fast
Optimal2
Optimal5
Android_ASTC
Fast
Optimal2
Optimal5
IOS
Fast
Optimal2
Optimal5
总结
压缩率和解压性能,是一个相互取舍的因素,从对比数据来看,不管是 Oodle/ZSTD,都在保持压缩率的同时,解压效率都远超 Zlib。
从对比数据看,ZSTD 的 22 级别性能与 Oodle 的 Leviathan 相近,Kraken 则在解压速度上更胜一筹,所以在游戏中使用 Kraken+fast 是比较合理的方案。
虽然选用其他的 CompressLevel
如Optimal2
/Optimal5
,但是会增加数倍的压缩时间,在项目资源量巨大的情况下,有些得不偿失。