加速碰撞

加速碰撞

一个aabb碰撞优化的模组。

性能

Accelerated Recoiling

Accelerated Recoiling 是一个专注于优化服务端实体碰撞逻辑的模组。它利用 Java 21+ 的 FFM(Foreign Function & Memory)API 接管实体 AABB 碰撞检测,将高强度的计算工作负载卸载到原生 C++ 库,从而显著提升服务器性能。

本模组目前处于实验阶段,实体挤压行为与原生版本不完全一致。请务必谨慎使用,并提前备份存档。

官方 QQ 群:1023713677

需求与依赖

  • Java 21 或更高版本:必须使用 Java 21 或 Java 21+ 启动游戏/服务器(FFM API 在 Java 21 中为预览特性)。
  • 64 位操作系统:原生库(.dll / .so)仅支持 64 位环境。
  • Windows 平台:需要安装 Microsoft Visual C++ Redistributable(如果游戏无法启动,请先安装此项)。
  • Leaves 服务端:启动参数必须包含 -Dleavesclip.enable.mixin=true。

安装与配置

首次启动时,模组会自动将原生库文件解压到根目录,并生成 acceleratedRecoiling.json 配置文件。

默认配置与说明:

{
   "enableEntityCollision": true,      // 是否启用实体挤压优化
   "enableEntityGetterOptimization": true, // 启用 EntityGetter 接口优化(目前无效)
   "maxCollision": 32,                 // 每个实体的最大碰撞交互次数
   "gridSize": 1,                      // 算法网格大小
   "densityWindow": 4,                 // 密度平滑窗口
   "densityThreshold": 16              // 触发加速回弹的周围实体密度阈值
}

注意:如果启用模组后性能不升反降,请尝试降低 densityThreshold。

常见问题(Q&A)

Q:为什么游戏崩溃或无法启动? A: 请按照以下步骤排查:

  1. 确保已正确安装 Java 21+ 和 MSVC Redistributable。
  2. 如果你的客户端是 NeoForge 1.21.1/1.21.8,请尝试使用 Java 22+ 启动游戏。
  3. 如果使用 Leaves 服务端,请确保启动参数包含 -Dleavesclip.enable.mixin=true。
  4. 如果你最近更新了模组,请尝试删除根目录或 .minecraft 文件夹中的 acceleratedRecoilingLib.dll 和 acceleratedRecoiling.json,然后重启游戏让其重新生成。

Q:实体挤压行为与原生版本一致吗? A: 不完全一致。本模组目前处于实验阶段,且改变了底层计算逻辑,因此挤压行为会与原生版本不同。请务必在使用前备份存档。

Q:会影响技术 Minecraft(TMC)机制吗? A: 目前尚不清楚。可能会影响依赖实体挤压的红石装置/农场。请务必在使用前备份存档。

Q:为什么启用模组后服务器性能反而下降了? A: 可能是周围实体密度尚未达到触发优化的阈值,导致游戏同时运行原生和加速回弹两条计算路径。请打开配置文件,尝试适当降低 densityThreshold 的值。

性能基准测试

测试环境: i5-12600KF | 32GB 内存 | RTX 3060 Ti | Leaves 1.21.8 | GraalVM JDK 21

测试 1:TPS 变化(在同一区块内的 2x2 空间生成实体)

实体数量 Leaves + Accelerated Recoiling 原生 Leaves 性能提升
2,048 20.0 TPS(16 MSPT) 3.0 TPS 20.8 倍
4,096 20.0 TPS(27 MSPT) 0.5 TPS 74 倍
16,384 8.6 TPS(115 MSPT) - -
32,768 4.3 TPS(230 MSPT) - -

测试 2:BroadPhase 执行时间(纯 C++ 端性能)

实体数量 每帧毫秒数 等效 FPS
10,000 0.2 ms 5000
50,000 1.1 ms 909
100,000 2.5 ms 400
400,000 21.3 ms 46

待办事项(TODO)

  • MacOS 兼容性
  • Luminol 支持

从源码构建

本项目使用 Gradle 调用 MSVC 和 WSL 进行跨平台编译(生成 .dll 和 .so)。建议在已安装 WSL 的 Windows 10/11 环境中进行操作。

1. 环境准备

  • 安装 JDK 21。
  • 安装 Visual Studio 2022,确保勾选“使用 C++ 的桌面开发”。
  • 在 WSL 中安装构建工具:sudo apt update && sudo apt install build-essential libgomp1 -y

2. 修改脚本路径 打开 build.gradle.kts,找到 compileNativeLib 任务,将 vcvarsScript 变量的值替换为你本机 vcvars64.bat 的实际路径。

3. 构建 在项目根目录运行以下命令:

gradlew jar
gradlew build

编译产物(包含两个平台动态库的 Jar 文件)将生成在 build/libs/ 目录中。

鸣谢与许可证

本项目基于 MIT 许可证开源。 特别感谢以下开发人员为本项目的核心概念和代码移植提供的巨大帮助:

  • Argon4W:原始概念与核心思路。
  • fireboy637:Architectury API 移植方案的核心代码。
  • hydropuse:JDK 22 兼容性方案的核心代码。