lanyer 发表于 2024-11-17 04:40:18

【光盘压缩】CHDMAN 算法优化版

本帖最后由 lanyer 于 2024-12-1 20:37 编辑

目前,官方的chdman 有四种默认编码算法:lzma、deflate、flac 和 huffman。


其中 lzma编码 压缩率最高,但是解码速度最慢,7zip 默认就是这种算法。 更新的 zstd 算法解码速度最快,能比前者快5~10倍(来源),但是由于一些历史兼容性原因,chdman在默认参数下不开启zstd编码。

chdman 目前的做法是优先考虑文件大小,即对每个文件块分别用所选的算法进行压缩,然后盲目地选取最小的那个压缩块保留,这通常导致最终的 chd 文件大部分是 lzma,即使同时指定了 zstd 算法,也因其压缩比难以超越 lzma,而导致其解压速度快、CPU 开销小的特点也没机会体现。(目前官方的建议是如果要使用 zstd,则需要禁用 lzma)

另外,一些难以压缩的数据块,比如 mpeg2 视频,还有光盘中已经被压缩打包的数据,哪怕chdman压缩后体积只小一点点,也会被二次压缩。这就导致在用户端加载使用chd 时会产生无意义的解压系统开销。(Lzma 解压的 CPU 开销昂贵)。特别是对于一些对电池要求较高的手持或移动设备来说。况且这样做文件大小也并没有缩小太多。


有没有办法可以同时利用lzma的高压缩率和zstd的高速度和低CPU开销的优势,并且尽可能的减少不必要的二次解压系统开销呢?这里我们设计一个算法选择的阈值:94.4272%
默认(用于 dvd)四种压缩算法:zstd、flac、huff、lzma。前三个优先级相同,压缩后仍会保留最小的那个,但如果压缩后大小超过原始大小的 94.4272%,则不会对数据块进行压缩,而是直接存储(难压缩数据不进行二次压缩)。
LZMA的优先级落后于前三个,当 lzma 压缩后的数据块尺寸小于前三个中最优算法的 94.4272% 时,会选择 lzma 算法,
最终文件大小不会比默认参数大很多,但基本每个块都会得到合理的算法分配,在文件大小和解压速度/CPU 开销之间达到微妙的平衡。
至于 94.4272% 这个数字的由来,则是来自于黄金分割的三次递归。


例:
压缩 cd (ps1)镜像:
chdman.exe createcd-i "输入文件名.cue" -o "输出文件名.chd"

压缩 dvd (ps2, psp)镜像:
chdman.exe createdvd -hs 2048 -i "输入文件名.iso" -o "输出文件名.chd"

一个小贴士:压缩dvd光盘使用最小的块大小(2048),能捕获到最多的重复块而使最终的chd文件体积大幅减小。但是对于重复块较少的镜像,增大块大小能显著帮助压缩算法提高压缩率,最终缩减chd文件体积。

查询chd文件 详细算法统计信息命令:
chdman.exe verify -i "文件名.chd"

例如最新的 真·三国无双3 猛将传 中文版.iso ,用以上算法压缩后,显示 35.7%的数据块不压缩,49.6%的数据块用高效的 zstd算法压缩,只有 13.3%的数据用LZMA强力压缩。一个非常合理的搭配。比默认大部分lzma压缩的chd体积只大 0.5%











xyzhz 发表于 2024-11-17 05:44:10

又学习了一招,感谢楼主!

xxuu182002 发表于 2024-11-17 06:24:55

谢谢大佬分享

XY夏雾 发表于 2024-11-17 07:42:27

这种反常规压缩最讨厌!不是什么模拟器非得支持chd才行!

FromMars 发表于 2024-11-17 07:49:50

感谢楼主科普……但是我想问问现在有多少模拟器是支持直接读取CHD的?

FromMars 发表于 2024-11-17 07:50:29

像是redump的那些家用机的ISO,都是.zip为标准的

爱唱歌的汤姆猫 发表于 2024-11-17 08:27:03

路过看看!

地平线下沉 发表于 2024-11-17 10:01:50

感谢分享

Alifu1227 发表于 2024-11-17 12:55:29

进来看一下

勇敢的心 发表于 2024-11-17 14:00:38

支持支持,用CHD还是很方便的
页: [1] 2
查看完整版本: 【光盘压缩】CHDMAN 算法优化版