Zlib/Oodle/ZSTD 压缩算法性能对比

之前我写了一篇文章,在 UE 中集成了 ZSTD 压缩算法:ModularFeature:为 UE4 集成 ZSTD 压缩算法,并且把 UE5 中的 Oodle 的压缩算法库提取出来,可以在 UE4 中使用:Oodle Compression。最近分析了一下他们的压缩性能,分别测试了 WindowsNoEditor/Android_ASTC/IOS 三个平台。

打包和测试方法:

  1. 打出默认的 zlib 基础包,不包含任何资源
  2. 基础包内包含 oodle/zstd 等代码,在启动时可指定压缩器和 compresslevel
  3. 使用 HotPatcher 打包 StarterContent,每次打包三个平台,打包时通过命令指定使用的压缩算法、压缩器、压缩级别
  4. 运行时使用 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

  1. zlib
  2. oodle(Kraken+fast)
  3. oodle(Hydra+fast)
  4. oodle(Leviathan+fast)
  5. zstd(level22)

Android_ASTC

  1. zlib

  2. oodle(Kraken+fast)



  3. oodle(Hydra+fast)

  4. oodle(Leviathan+fast)

  5. zstd(level22)

IOS

  1. zlib

  2. oodle(Kraken+fast)

  3. oodle(Hydra+fast)

  4. oodle(Leviathan+fast)

  5. zstd(level22)

Kraken 不同压缩级别对比

测试包与 perfdog 环境与上文相同。

WindowsNoEditor

  1. Fast

  2. Optimal2

  3. Optimal5

Android_ASTC

  1. Fast

  2. Optimal2

  3. Optimal5

IOS

  1. Fast

  2. Optimal2

  3. Optimal5

总结

压缩率和解压性能,是一个相互取舍的因素,从对比数据来看,不管是 Oodle/ZSTD,都在保持压缩率的同时,解压效率都远超 Zlib。
从对比数据看,ZSTD 的 22 级别性能与 Oodle 的 Leviathan 相近,Kraken 则在解压速度上更胜一筹,所以在游戏中使用 Kraken+fast 是比较合理的方案。
虽然选用其他的 CompressLevelOptimal2/Optimal5,但是会增加数倍的压缩时间,在项目资源量巨大的情况下,有些得不偿失。