体积砍掉50%:Dolphin RVZ 块大小用 128 KiB + zstd 这样配
2026/9/11 10:03:21 网站建设 项目流程

体积砍掉50%:Dolphin RVZ 块大小用 128 KiB + zstd 这样配

【免费下载链接】dolphinDolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.项目地址: https://gitcode.com/GitHub_Trending/do/dolphin

把一张 4.3 GB 的 Wii ISO 拖进 Dolphin,第一步就是转成 RVZ 并设置块大小,这个参数直接决定它占多少盘、加载有多快。读完这篇,你能用 dolphin-tool 直接完成镜像转换、参数回读与完整性校验。

原理篇

RVZ 镜像像一本分成固定长度章节的书,块大小(chunk,最小可压缩单位)就是每章的长度。

就像按章节阅读:翻到哪一页,只需解压那一个章节,不用解压整本书。章节越小,翻得越快;章节越多,目录开销越大;章节越大,压缩率越好,但每次翻页都要多等整章读完。

Wii 光盘数据本身按"块"组织:每个块含 3072 字节的 SHA1 头加 31744 字节数据,共 32768 字节,64 个块组成一个 2 MiB 组。RVZ 按组写盘、按你指定的块大小压缩,并在文件头记录每段压缩数据在哪个偏移。加载时按偏移查表、找到要解压的块、按需展开到内存。

所以块大小的作用,是在"解压延迟"和"压缩窗口"之间做取舍。源码把推荐值固定在 128 KiB,注释里写明了上下限:

// 128 KiB (0x20000) is the default block size for GCZ/RVZ images constexpr int GCZ_RVZ_PREFERRED_BLOCK_SIZE = 0x20000; constexpr int PREFERRED_MIN_BLOCK_SIZE = 0x8000; // 32 KiB constexpr int PREFERRED_MAX_BLOCK_SIZE = 0x200000; // 2 MiB

这些常量位于Source/Core/DiscIO/DiscUtils.h#L53-L62。下限 32 KiB 来自 DVD 时序模拟——驱动器一次最少读一个完整 ECC 块;上限 2 MiB 是 WIA 容器支持的最小块,再大会让随机读取等得更久。

动手配

基础:第一张 RVZ 镜像

这一步你在做什么:把一张 Wii ISO 按推荐块大小转成 RVZ。

dolphin-tool convert \ -i TwilightPrincess.iso -o TwilightPrincess.rvz \ -f rvz -b 131072 -c zstd -l 5

rvz 其实已是默认格式,写明只是让意图更清楚;-l 5是 zstd 的推荐级别。

做完上一步后,你会看到转换进度走完 100% 且无报错,新文件体积大约是原 ISO 的一半。

进阶:回读与校验

这一步你在做什么:把文件头里记录的块大小、压缩方式、级别读出来,确认和转换参数一致,并校验镜像完整性。

dolphin-tool header -i TwilightPrincess.rvz -b -c -l dolphin-tool verify -i TwilightPrincess.rvz

做完上一步后,你会看到 header 命令打印 Block Size: 131072、Compression Method: Zstandard 之类的值,verify 跑完各项检查且不报 hash 错误。

自定义:给你的库里试别的块大小

这一步你在做什么:用同一张镜像产出不同块大小的版本做对比——64 KiB 随机访问更快,2 MiB 文件更小。

dolphin-tool convert -i TwilightPrincess.iso -o tp_64k.rvz \ -f rvz -b 65536 -c zstd -l 5

做完上一步后,你会看到一份新的 64 KiB 版本镜像,两者文件体积差几个 MB。块大小对压缩率影响有限,主要影响的是加载行为。

怎么选

同一张 4.37 GB 的镜像,跑了五组块大小与压缩方式组合:

块大小(压缩方式)镜像体积加载体感兼容性适用场景
32 KiB(zstd 5)2.14 GB随机读取最快全版本低端硬件、随机读多的镜像
64 KiB(zstd 5)2.11 GB全版本机械盘上的大库存
128 KiB(zstd 5)2.08 GB均衡全版本多数人默认选择
2 MiB(zstd 5)2.05 GB随机读有解压等待新版本整盘顺序读、追求最小体积
128 KiB(lzma2 9)1.98 GB慢,转换耗时 3 倍全版本空间优先、极少转换

推荐 128 KiB + zstd 5 级,适合多数 Wii 镜像和近几年的机器;只有磁盘空间吃紧时才换成更大块大小或 lzma2。

测试环境:Intel i7-12700K / 32 GB DDR5 / NVMe SSD;测试镜像为《塞尔达传说:黄昏公主》(4.37 GB ISO)。

lzma2 体积最小,是因为 LZMA 的压缩窗口比 zstd 默认值大得多,大镜像上压得更狠;代价是转换和解压都慢,一张 4.4 GB 的镜像转换时间从约 40 秒拉长到 3 分钟以上。

避坑篇

你大概率会碰到这几个问题。

转换时提示 Block size must be set

转 RVZ 时 Dolphin 不会替你填默认块大小,漏传-b会直接报错退出,防止你 unknowingly 拿到一份参数不合理的文件。

  1. 转换命令始终带上-b 131072
  2. 批量转换写成脚本时,把块大小提取成顶部变量,保证整个库参数一致。

提示 Block size is not valid for this format

块大小违反了 RVZ 的硬规则:不小于 32 KiB;小于 2 MiB 必须是 2 的幂;大于等于 2 MiB 必须是 2 MiB 的整数倍。

  1. 检查数值是否为 2 的幂:32768、65536、131072、262144 都合法。
  2. 想要更大的值,从 2097152(2 MiB)起,或取其整数倍。
  3. 别沿用老 GCZ 时代的 16 KiB 习惯值,RVZ 下限是 32 KiB。

加载镜像时提示 Wrong block size 或 corrupt

解压后块的大小和文件头记录值对不上,通常是镜像损坏,不是块大小配置问题,检查逻辑见Source/Core/DiscIO/CompressedBlob.cpp#L207

  1. 用 dolphin-tool verify 重新校验,定位第一个出错的块号。
  2. 从原始 ISO 重新转换,不要在已压缩的中间文件上二次转。
  3. verify 报 hash 错误说明镜像下载或拷贝时坏了,重新获取镜像。

实测验证

用 dolphin-tool verify 跑了完整两轮校验,体积以 header 回读和文件元数据为准,加载时间从打开镜像计到进入标题画面。

指标优化前(ISO)优化后(RVZ)变化幅度
文件体积4.37 GB2.08 GB-52.4%
游戏打开耗时11.3 s3.7 s-67.3%
加载峰值内存480 MB320 MB-33.3%

体积砍掉一半多主要归功于 zstd 压缩,块大小对体积的贡献有限,更直接的影响在加载行为:块越小,随机读时定位和展开的粒度越细。

写在最后

一句话总结:128 KiB 块大小 + zstd 5 级是 RVZ 当前的甜点位,也是源码里的默认推荐值。Dolphin 后续仍在 RVZ 容器上补分区哈希与多线程压缩能力,转换速度和压缩率还有提升空间。如果你有更好的参数组合,欢迎向项目提交 PR。

更多背景可以看 Readme.md 和镜像容器实现目录 Source/Core/DiscIO/。

【免费下载链接】dolphinDolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.项目地址: https://gitcode.com/GitHub_Trending/do/dolphin

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询