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

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

打包和测试方法:

  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,但是会增加数倍的压缩时间,在项目资源量巨大的情况下,有些得不偿失。

全文完,若有不足之处请评论指正。

微信扫描二维码,关注我的公众号。

本文标题:Zlib/Oodle/ZSTD压缩算法性能对比
文章作者:查利鹏
发布时间:2021年07月06日 19时59分
本文字数:本文一共有2k字
原始链接:https://imzlp.com/posts/30732/
许可协议: CC BY-NC-SA 4.0
文章禁止全文转载,摘要转发请保留原文链接及作者信息,谢谢!
您的捐赠将鼓励我继续创作!