背包成就性能优化

背包成就性能优化

invadvopt 是 Minecraft 1.21.1 的专用服务器 NeoForge 模组。它加速了热门的 inventory_changed 进度触发器,而不会替换 Minecraft 的谓词或奖励逻辑。客户端无需安装。

优化

🚀 物品栏进度加速器

当服务器拥有大量进度、数据包或在线玩家时,原版 Minecraft 会频繁遍历相关的进度条件。本模组为每位玩家创建物品索引,仅筛选可能与当前物品栏变化匹配的条件,同时继续使用 Minecraft 原版的谓词和奖励逻辑进行最终判定。

简而言之:减少不必要的检查,同时保留原版行为。⚡

🚀 大幅减少候选检查

根据玩家物品栏中实际发生变化的物品来定位相关的进度条件,避免每次都对所有监听器进行完整扫描。

🎯 精确的原版判定

最终匹配仍由 Minecraft 原版的 TriggerInstance、ItemPredicate 和上下文谓词执行。原版奖励逻辑未被替换。

🧩 支持复杂物品条件

正确处理物品数量、标签、数据组件、空槽位变化、物品移除以及多个条件的组合。

🖥️ 仅需服务端安装

客户端无需安装本模组。原版客户端可直接连接到服务器。

🛡️ 安全回退机制

当遇到未知条件、异步调用、资源重载、Mixin 注入失败或内部异常时,本模组会保留或回退到原版处理流程。

🔍 影子验证与断路器保护

默认情况下,本模组会抽样并将优化结果与完整判定结果进行比对。如果检测到不一致,则使用完整结果,并且模组可以自动禁用受影响的索引或切换回原版模式。

📊 内置运行时指标

查看触发次数、候选减少比例、完整扫描次数、回退原因、延迟分布以及最活跃的玩家和物品。

💾 不修改世界数据

本模组不会添加玩家附件、能力、存档格式更改或网络通道。移除本模组无需迁移存档。

本项目包含一个确定性的候选层微基准测试,包含:

  • 5,000 个物品条件监听器
  • 1,000 个唯一物品 ID
  • 50 个模拟玩家
  • 每次操作每位玩家更改一种物品类型

测试结果:

  • 每次操作平均生成约 5.014 个候选条件
  • 候选数量减少约 99.9%
  • 候选层测试速度提升约 4.04 倍

⚠️ 这些结果来自候选过滤层的微基准测试,并不意味着每个服务器都能获得相同的 MSPT 提升。实际性能取决于数据包、进度数量、在线玩家数量以及整合包环境。

首次启动后,NeoForge 会生成:

config/invadvopt-common.toml

默认启用安全的 EXACT 模式:

mode = "EXACT"
enabled = true
shadowVerifyRate = 0.01
periodicFullScanTicks = 200
fallbackOnUnknownPredicate = true
fallbackOnOffThreadCall = true
disableOnMismatch = true
metricsEnabled = true
debugLogging = false

要立即禁用优化,请将模式切换为 VANILLA。无需卸载模组或重启服务器。

以下命令需要服务器管理员权限等级 4:

/invadvopt status
/invadvopt stats
/invadvopt verify
/invadvopt mode vanilla
/invadvopt mode exact
/invadvopt reset-stats

🎮 Minecraft 1.21.1

🔧 NeoForge 21.1.x

☕ Java 21

🖥️ 专用服务器

👤 无需客户端安装

将模组 JAR 放入服务器的 mods 文件夹并启动服务器即可。

本模组专为 NeoForge/Bukkit/Paper 混合服务器环境设计,包括 Youer 等服务器:

  • 不使用 @Overwrite
  • 不依赖 Bukkit 内部实现
  • 不使用 Unsafe 或 ClassLoader 技巧
  • 当 Mixin 目标发生变化时自动保留原版逻辑
  • 针对可能的运行时差异提供抽样验证和断路器保护

以下类似的进度优化模组与本模组不兼容:

  • achiopt
  • cerulean
  • icterine

当检测到冲突时,本模组会记录错误并保留原版触发处理流程。

本模组特别适合:

📚 拥有大型数据包的服务器

🏆 包含大量自定义进度的整合包

👥 多人生存服务器

🧱 频繁修改玩家物品栏的模组服务器

📉 希望减少进度判定开销的服务器

你可以随时通过以下方式还原:

  • 使用 /invadvopt mode vanilla 切换回原版模式
  • 在配置文件中设置 mode = "VANILLA"
  • 停止服务器并直接移除模组 JAR

380 个模组服务器的实际测试结果:

游戏内测试 spark