
被子二分法
用于通过二分搜索算法查找导致问题的模组的 Quilt 模组和加载器插件。这包括 n 元模组不兼容性。
查看大图Quilt Bisect
一个 Quilt 模组与加载器插件,使用源自二分搜索的搜索算法来找出导致问题的模组。这包括以崩溃或用户检测到的问题形式出现的 n 路模组不兼容性。
警告
Quilt Bisect 仍处于实验阶段。不过,我认为它已准备好应对大多数用例。某些功能尚未经过测试(Realms 支持),并且它依赖于 quilt loader 中的一个实验性 API。在向其他项目报告问题之前,请先在没有 Quilt Bisect 的情况下测试所有问题(尤其是与 Quilt Loader 相关的问题)。或者,加入我的 discord 并在那里获取支持。
用法
- 本项目使用 Loader Plugins,需要将
-Dloader.experimental.allow_loading_plugins=true添加到你的 JVM 参数中。 - 安装此模组
- 如果你的游戏崩溃,会弹出一个对话框询问你是否要进行二分查找,否则点击屏幕顶部的开始二分查找按钮,系统会提示你为问题命名。
- 游戏将自动重启。尝试重现你之前遇到的问题。
- 如果一切正常,点击
No Issue按钮 - 如果你遇到问题,点击
Manual Issue按钮,并选择你遇到的问题或创建一个新问题- 注意,建议在一次二分查找中减少问题的数量,而是在应用之前的修复后运行多次二分查找。参见一次性二分查找多个问题
- 如果一切正常,点击
- 一旦某个问题被隔离,二分查找将验证解决方案并继续二分查找其他问题
- 二分查找完成后,它将提供所遇到的问题和解决方案的摘要。不过请谨慎对待这些内容,因为二分查找的工作原理如此
配置
文件 <config>/quilt_bisect/main.json 包含用户可能想要配置的大部分内容,目前请参见 MainConfig.java。
文件 <config>/quilt_bisect/active_bisect.json 包含有关活动二分查找的信息,包括设置、所有已尝试的模组集及其各自的日志,以及问题信息。
文件 <config>/quilt_bisect/modSet.txt、<config>/quilt_bisect/sections.txt 和 <config>/quilt_bisect/lastActiveJoin.txt 包含内部信息,不应修改。
工作原理
一次性二分查找多个问题
虽然同时二分查找多个问题是可行的,但当存在多个问题时,二分查找会做出一些至关重要的假设:
- 只能通过移除模组来修复问题,而不能通过添加模组
- 一个常见的例子是 indium,它修复了 sodium 与其他模组之间的兼容性问题,前提是相关其他模组没有声明它
- 问题之间存在固定的优先级顺序
- 如果带有问题 A 的模组集的子集 B 存在与问题 A 不同的问题,那么问题 A 不会在 B 的任何子集上出现。这意味着(即使用户标记了问题)必须始终按相同顺序测试问题
自动将内容标记为正常
开始新的二分查找时,你可以配置二分查找以
- 自动加入一个世界、服务器、Realms 或最后加入的那个(注意,Realms 依赖 ID 而非名称)
- 在给定时间后自动将模组集接受为正常
- 时间以 1/20 秒为单位,如果启用了自动加入,则从加入世界时开始计时,否则从标题屏幕显示时开始。如果在单人游戏中,它还会等待足够的刻数过去
- 在自动加入后自动运行命令或发送聊天消息。
- 它将被视为你从聊天中发送的,并且也适用于客户端侧命令
- 禁用世界保存
- 这是为了帮助重现那些世界状态相关的问题。如果此功能处于活动状态,重新启动后不会更改任何单人游戏世界。它还允许测试内容模组
- 为实现最大兼容性,目前它的实现方式是:备份 worlds 文件夹,并在活动状态下于启动前将已备份的世界重置为存储的状态
处理崩溃
作为加载器插件,二分查找在极其早期的阶段就挂钩到 Quilt 的加载器进程中。
在那里,它可以创建一个实际运行游戏的新进程,并等待该进程结束。
之后,二分查找通过搜索新的崩溃日志来检查 Minecraft 是否崩溃,复制 latest.log,并更新 config/quilt_bisect/active_bisect.json。
(如果没有活动的二分查找且发生了崩溃,它会询问是否应开始新的二分查找)
如果 Minecraft 没有正常退出(无论是通过崩溃还是通过二分查找菜单),并且有活动的二分查找,父进程将重新启动游戏。
幕后还有更多事情在进行,以确保例如杀死父进程或子进程时它们的行为符合预期。
检测问题
二分查找将
- 处理崩溃
- (TODO)使用正则表达式检查日志消息(如果可能)
- 依赖用户输入
选择下一个要测试的模组集
二分查找使用扩展版的二分搜索:
- 首先,选择带有(未修复的)问题的最小模组集
- 对于该模组集的每个区段(见最后一行)
- 如果一个区段只包含一个模组,则该模组是必需的,无需在该区段上做更多工作
- 将该区段分成两半
- 检查这两半
- 如果其中一半有问题,它将在下一次迭代中成为问题模组集的一部分
- 如果所有两半都正常,这意味着两半中都包含问题出现所需的模组
- => 将这些两半作为单独的区段存储,并像第 3 步那样二分查找它们
- 如果所有区段都只包含一个元素,则已隔离出最小重现。用得到的模组集将相应问题标记为已修复,并在移除当前模组之一的情况下调试下一个问题
- 完成所有这些后,显示最终摘要屏幕。
加载正确的模组集
此类二分查找算法面临的主要问题之一是依赖关系。 理想情况下,二分查找方法应该感知依赖关系并基于这些依赖关系进行二分查找。 然而,这会极大地增加算法的复杂性,而本项目目前已经足够复杂了。
相反,Quilt Bisect 在其搜索算法中简单地忽略依赖关系,并将所有模组提供给 quilt loader。 然而,它只强制加载模组集中的模组(这就是你的 mods 文件夹中模组的情况),并将其他模组作为可选模组提供,仅在依赖关系需要时才加载。 在解决依赖关系问题的同时,它有一些影响:
- 如果需要,不在模组集中的模组仍然可以被加载
- 这意味着当二分查找识别出最小重现时,该重现集实际上可能只包含一个依赖于真正罪魁祸首的模组
- 这意味着该模组集无法显示哪个模组有问题,并且在归咎于某个模组之前,必须进行一些更好的测试
开发
对于测试,我还推荐 Quilt Crasher,我开发它是为了能够测试这类模组。
许可
虽然代码是 ARR,但这只是为了阻止移植到其他模组加载器或低质量复制。欢迎复制部分代码用于你的模组。如果你的模组做了与本模组类似的事情,请注明我的贡献。你也可以向我请求许可。如果不是移植到其他模组加载器,我很可能会同意。
致谢
PluginLogger、MinecraftServerMixin 和 GracefulTerminator 大部分取自 https://github.com/comp500/ModVote。
BisectPluginProcessManager 也包含该仓库中 ModvotePlugin 的大部分内容。
所有这些均采用 MIT 许可证(作者 comp500)
IconStore 包含来自 https://github.com/TerraformersMC/ModMenu 的代码,具体来自 FabricIconHandler 和 FabricMod#getIcon。java_icon.png、minecraft_icon.png 和 unknown_icon.png 也取自那里。Mod Menu 同样采用 MIT 许可证(作者 Prospector)
正在加载版本记录…




正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。