之前我写了一篇文章,在UE中集成了ZSTD压缩算法:ModularFeature:为 UE4 集成 ZSTD 压缩算法,并且把UE5中的Oodle的压缩算法库提取出来,可以在UE4中使用:Oodle Compression。最近分析了一下他们的压缩、解压、CPU、内存的消耗,分别测试了WindowsNoEditor/Android_ASTC/IOS三个平台,以及Oodle的Kraken使用不同的压缩级别在不同平台的性能。
打包和测试方法:
- 打出默认的zlib基础包,不包含任何资源
- 基础包内包含oodle/zstd等代码,在启动时可指定压缩器和compresslevel
- 使用HotPatcher打包StarterContent,每次打包三个平台,打包时通过命令指定使用的压缩算法、压缩器、压缩级别
- 运行时使用Perfdog和stat compression查看数据
使用不同的压缩算法打包StarterContent的大小(单位MB)。未使用压缩的Pak大小:
Uncompress Pak | Size |
---|---|
WindowsNoEditor | 465M |
Android_ASTC | 260M |
IOS | 291M |
以下数据中,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
,但是会增加数倍的压缩时间,在项目资源量巨大的情况下,有些得不偿失。