实体碰撞优化器

实体碰撞优化器

为Minecraft Fabric服务器提供原版精确的实体碰撞加速。

性能

Entity Collision Optimizer logo
Entity Collision Optimizer
面向 Minecraft Fabric 服务器的原版精确实体碰撞加速。
English | 简体中文
Entity Collision Optimizer 是一个面向 Minecraft 26.2 的服务端 Fabric 模组,它使用 C++ 原生后端来加速实体查询、推动和移动碰撞,同时默认保留原版实体碰撞行为。在下面的密集实体对比中,其可选的无序模式达到了原版 tick 处理速率的 6.58 倍以及 Lithium 速率的 4.87 倍。安装即可生效;连接的客户端无需安装此模组。

为什么要使用 Entity Collision Optimizer?

拥挤的刷怪场、运输系统以及其他实体密集的建筑可能会将大部分 tick 时间花费在查找附近实体、检查碰撞箱、施加推动以及处理与方块的移动碰撞上。Entity Collision Optimizer 仅专注于这部分工作。它不会尝试优化 AI、寻路、区块生成、网络或客户端渲染,因此你所看到的提升取决于你的服务器执行了多少碰撞工作。 这不是碰撞限制器,也不是近似模拟。在默认的有序后端下,原版实体产生相同的候选项、顺序相同,运行相同的碰撞规则,并在与 Mojang 实现相同的时机发布每次速度或移动更新。该算法不会随实体密度而变化,也从不丢弃候选项。

游戏内对比

下面的截图使用相同的密集僵尸猪灵围栏和相同的测试条件。实时 tick 叠加层报告了以下结果:
配置 MSPT 相对原版的速度 相对原版的 MSPT 降低
原版 268.4 1.00× —
Lithium 198.5 1.35× 26.0%
Entity Collision Optimizer 40.8 6.58× 84.8%
在此场景中,Entity Collision Optimizer 将 MSPT 相对原版降低了 84.8%,相对 Lithium 降低了 79.4%,使服务器降至 Minecraft 的 50 MSPT 预算以下。 Bar chart comparing MSPT and tick-processing rate for Vanilla, Lithium, and Entity Collision Optimizer
原版
268.4 MSPT
Lithium
198.5 MSPT
ECO
40.8 MSPT
Vanilla running the dense entity comparison at 268.4 MSPT Lithium running the dense entity comparison at 198.5 MSPT Entity Collision Optimizer running the dense entity comparison at 40.8 MSPT

工作原理

Minecraft 将实体存储在区块段中。碰撞查询会遍历相关的区块段,访问 Java 对象,检查它们的碰撞箱,并构建推动或移动代码所需的数据。这简单且灵活,但当许多实体占据一小片区域时,对象访问、临时分配和重复准备会变得非常昂贵。 Entity Collision Optimizer 为每个维度维护一个 C++ 原生碰撞上下文,并在实体被跟踪、移动、跨维度传输或移除时更新它。一个持久的细粒度 XYZ 网格将每次查询缩小到附近的实体。在默认后端中,第二个区块段索引在该空间过滤之后恢复 Minecraft 的区块段遍历和插入顺序,因此保留原版顺序无需对每个结果进行排序。 碰撞代码使用的位置、速度、碰撞箱和同步状态存储于紧凑的共享堆外表中。Java 和 C++ 原生代码操作同一份状态,而诸如 Vec3 这样的 Java 对象仅在 Java 代码实际读取它们时才被实体化。候选边界使用 SoA 布局,以便热 AABB 循环能有效利用 CPU 缓存和 AVX2。 对于实体推动,一次原生查询执行空间和规则过滤。使用 Minecraft 标准推动公式的连续实体对随后会被按顺序批量计算,每一对的速度变化对下一对可见。实体特定的原版回调仍在其原始时机运行。对于移动,一个维护中的方块掩码会跳过无法碰撞的位置;Java 仍解析上下文相关的 VoxelShape 值,而原生代码执行大部分几何裁剪、台阶计算和移动积分。 因此,FFM 边界承载的是完整的查询、推动批次或移动操作,而不是为每个候选项在 Java 和原生代码之间来回切换。重力、摩擦、坠落处理、流体、伤害、爆炸、方块效果和世界回调仍保留在 Minecraft 正常的 Java 逻辑中。有关原生模块的边界,请参见 native/README.md。

需求

组件 要求
Minecraft 26.2
模组加载器 Fabric Loader 0.17.0 或更新版本
依赖 兼容 Minecraft 26.2 的 Fabric API 0.145.4 或更新版本
Java 25
操作系统 Windows、Linux 或 macOS
处理器 支持 AVX2 的 x86-64
发布版 JAR 包含适用于 x86-64 Windows、Linux 和 macOS 的原生库。目前不支持 ARM64。

安装

  1. 安装 Fabric Loader 和 Fabric API。
  2. 下载 JAR 并将其放入实例的 mods 目录中。
在受支持的 Java 25 运行时上不需要额外的 JVM 参数。官方 Minecraft 26.2 启动器已启用原生访问权限。手动启动且未使用该选项的专用服务器可能会打印一次 Java 原生访问警告,但 Java 25 仍允许该操作,模组会继续工作。 希望抑制该警告的服务器管理员可以选择添加:
--enable-native-access=ALL-UNNAMED
不支持的原生平台或 FFM 初始化失败会报告为错误。模组不会静默回退到其他实现。

配置

模组安装后即启用,无需配置。

兼容性

  • Lithium 和 Carpet 可与 Entity Collision Optimizer 一起安装。启用时,本模组会接管重叠的服务器碰撞路径,而不是同时运行两种实现。
  • Carpet 的 maxEntityCollisions 限制被有意忽略。限制碰撞候选项数量不在本模组的范围内。原版的 maxEntityCramming 伤害规则仍然适用。
  • 该模组不会更改存档格式,也不会注册必须同步到客户端的内容。
  • 原版实体是兼容性目标。自定义实体或直接替换相同碰撞路径的模组目前不保证可用。
请通过 问题追踪器 报告可复现的问题。

许可证

Entity Collision Optimizer 在 MIT 许可证 下提供。 致谢:本项目受 Accelerated Recoiling 启发,但在目标和实现上均有显著不同。