
蔚蓝叉
进度优化模组,Icterine / Cerulean 的更新分支,增加了新功能
查看大图
这是 Cerulan 的分支,而它实际上是 Icterine 的分支。原维护者已经一年没有更新它了,所以我以 Cerulean 分支的名义将其更新到现代版本。
Cerulean 是一个优化 Minecraft 进度检测系统的模组,特别是针对卡顿的 InventoryChangeTrigger,在拥有大量模组进度的整合包中会导致严重卡顿。Cerulean 是 Icterine 的分支,由 Txni 更新到 1.21.1 并添加了额外功能。
除了更新到 1.21.1 之外,Cerulean 还添加了一个选项,可以每隔几个 tick 才处理一次进度,这正是 Achievements Optimizer 等模组使用的策略(该模组与原始 Icterine 不兼容)。此选项的处理方式确保了每位玩家首次拾取物品时始终会被处理以检查进度——防止了进度停滞直到你移动物品才触发的情况。
原模组摘要:
- 优化了获得物品时触发进度的检测;
- 可能会破坏与原版的 parity,但不影响原版进度,且不应影响绝大多数模组/数据包;
- 即使确实影响了某些内容,只需丢弃并重新拾取所需物品之一,进度仍然可以获得;
- 目前没有已知的不兼容性或问题;
- 每次对原版代码的注入都可以在配置文件中禁用。
- 所有更改均为服务端。
结果
在一台有 3 名活跃玩家在线的专用服务器上进行了实时测试,运行包含 200 多个模组的自定义 Forge 整合包以及 BlazeandCave 的进度包,该数据包添加了超过 950 个进度。使用 Spark 收集了一小时的数据。
使用 Icterine 后,InventoryChangeTrigger 的执行速度几乎快了 2.5 倍(截至 1.1.0 版本),仅占用约 7.5% 的 tick 时间,而非 20%。
Icterine 1.0.0 的统计对比(约快 2 倍):

原版 InventoryChangeTrigger 的工作原理
- 当游戏检测到玩家背包中的物品堆发生了变化时,会为其调用 InventoryChangeTrigger。这包括拾取物品、丢弃物品、丢弃整组物品、在背包中移动物品。
- 此外,当你打开容器(箱子、熔炉等)时,游戏会认为你背包中的所有槽位都发生了变化,并为所有槽位调用触发器,包括空槽位。
- InventoryChangeTrigger 会统计你背包中空槽位、非空槽位和完全填满的槽位数量。此信息可用于进度触发器,但在原版中并未使用。
- InventoryChangeTrigger 会遍历已注册的进度条件。
- 如果条件有槽位数量要求且与第 2 步的值不匹配,或者条件没有物品要求,则跳过该条件。
- 如果条件只有一个物品要求,则将变化的物品堆与该要求进行比对。
- 如果条件有多个物品要求(例如,"用残骸覆盖我"需要拥有完整的下界合金盔甲套装),则会检查背包中的每一个物品堆是否满足每一个要求(但已满足的要求会被移除,不再检查)。
- 物品匹配,尤其是对标签的匹配,非常耗费性能。但游戏会先检查玩家的物品类型是否与要求中的类型匹配,然后才检查其他参数,如数量、附魔和其他 NBT 数据。
Icterine 的优化工作原理
- 在第 1 步中,当你丢弃物品堆或将它们移出背包(例如移到箱子)时,不调用 InventoryChangeTrigger。这由配置文件中的
ignore_triggers_for_emptied_stacks参数控制。 - 类似地,如果物品堆变化是由于数量减少但未清空(例如,玩家从满堆中丢弃了单个物品),则不调用 InventoryChangeTrigger。由
ignore_triggers_for_decreased_stacks控制。 - 另外,如果物品堆数量增加了,但没有超过任何进度的阈值,也不调用 InventoryChangeTrigger。例如,泥土堆数量从 52 增加到 53,但你的整合包中没有获得 53 个泥土的进度。由
optimize_triggers_for_increased_stacks控制。 - 修改游戏在玩家打开容器界面时检查变化物品的方式,使其不会在你打开任何东西的瞬间就将所有物品堆视为已变化。由
initialize_inventory_last_slots控制。 - 在第 6 步中,首先检查变化的槽位是否匹配任何要求,然后才检查背包中的其他物品堆。由
optimize_multiple_predicate_trigger控制。 - 在第 7 步中,首先比较物品堆数量以避免不必要的标签匹配。同时使用先前的物品堆数量来避免更多不必要的匹配。由
check_count_before_item_predicate_match控制。
支持的版本
Icterine v1.2.0 适用于 Minecraft Fabric/Quilt 1.18.2 至 1.19.4,以及 Forge 1.18.2 至 1.19.2 (forge 时刻)。
Icterine v1.3.0 具有与 v1.2.0 相同的功能,适用于 Fabric/Quilt 1.20 - 1.20.4、Forge 1.19.3 - 1.20.4 以及 NeoForge 1.20.1 - 1.20.4。
使用版本页面上的筛选器来选择正确的文件。
如果你需要移植到任何其他版本,请提交 issue,或在 Discord 服务器上询问。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。