跳到正文

Icterine

作者:Mephodio

进度优化(具体来说,是 InventoryChangeTrigger)

收藏

截图

介绍

介绍由机器翻译自 Modrinth 原页面,仅供参考。

概述

  • 优化获取物品时触发进度的过程;
  • 可能会破坏与原版的一致性,但不会影响原版进度,也不应影响绝大多数模组/数据包;
  • 即使确实影响了某些内容,仍然应该只需丢下并捡起一个所需物品即可获得对应进度;
  • 目前没有已知的不兼容或问题;
  • 所有注入原版代码的功能都可以在配置文件中禁用。
  • 所有改动均在服务端运行。

测试结果

在专用服务器上进行了实际测试,服务器中有 3 名玩家在线,运行着一个包含 200 多个模组的自定义 Forge 整合包,以及会新增超过 950 项进度的 BlazeandCave’s Advancements Pack。使用 Spark 收集了持续一小时的统计数据。

使用 Icterine 后,InventoryChangeTrigger 的执行速度几乎提升至原来的 2.5 倍(截至 1.1.0 版本),占用约 7.5% 的刻时间,而不是 20%。

Icterine 1.0.0 的统计对比(速度约提升 2 倍):

统计数据

原版 InventoryChangeTrigger 的工作方式

  1. 当游戏检测到玩家物品栏中的物品堆发生变化时,就会为该物品堆调用 InventoryChangeTrigger。这包括捡起物品、丢弃物品、丢弃整组物品,以及在物品栏中移动物品。
  2. 此外,当你打开容器(箱子、熔炉等)时,游戏会认为你物品栏中的所有槽位都发生了变化,并为所有槽位调用触发器,包括空槽位。
  3. InventoryChangeTrigger 会统计你物品栏中的空槽位、非空槽位以及已完全填满的槽位数量。这些信息可以用于进度触发条件,但原版并未使用。
  4. InventoryChangeTrigger 会遍历已注册的进度条件。
  5. 如果某个条件有槽位数量要求,且这些要求与第 2 步中的数值不匹配,或者该条件没有物品要求,则跳过该条件。
  6. 如果某个条件只有一个物品要求,则会将发生变化的物品堆与该要求进行比对。
  7. 如果某个条件有多个物品要求(例如,“用残骸包裹我”要求拥有一整套下界合金盔甲),则会将物品栏中的每一个物品堆与每一项要求进行比对(但已满足的要求会被移除,不再继续检查)。
  8. 物品匹配过程,尤其是针对标签进行匹配时,开销非常大。不过,游戏会先检查玩家的物品类型是否与要求中的类型匹配,之后才会检查数量、附魔以及其他 NBT 数据等参数。

Icterine 的优化方式

  1. 在步骤 1 中,当你丢弃整组物品或将它们移出背包(例如放入箱子)时,不会调用 InventoryChangeTrigger。此功能由配置文件中的 ignore_triggers_for_emptied_stacks 参数控制。
  2. 同样地,如果物品堆数量减少但没有被清空(例如玩家从一组完整的物品中丢出单个物品),也不会调用 InventoryChangeTrigger。此功能由 ignore_triggers_for_decreased_stacks 参数控制。
  3. 此外,如果物品堆数量增加,但尚未达到任何进度的阈值,也不会调用 InventoryChangeTrigger。例如,泥土数量从 52 增加到 53,但你的整合包中没有要求获得 53 个泥土的进度。此功能由 optimize_triggers_for_increased_stacks 参数控制。
  4. 修改玩家打开容器界面时检查物品变化的方式,避免在你打开任何容器后将整组物品都视为已发生变化。此功能由 initialize_inventory_last_slots 参数控制。
  5. 在步骤 6 中,首先检查发生变化的槽位是否符合任意要求,只有在此之后才检查背包中的其他物品堆。此功能由 optimize_multiple_predicate_trigger 参数控制。
  6. 在步骤 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 服务器中提出请求。

常见问题

Icterine 支持哪些 Minecraft 版本?

Icterine 支持 Minecraft Java 版 1.18.2–1.20.4,共 11 个版本,可用的加载器:Fabric / Forge / NeoForge / Quilt。下载时注意选择和你游戏版本一致的文件。

Icterine 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Fabric / Forge / NeoForge / Quilt,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。运行环境:仅服务端。

评论

登录后评论和评分

Mephodio 的其他作品

查看全部 →