创建优化列车

创建优化列车

创建优化列车——为机械动力模组列车提供性能优化的附加组件。

创建

🚅⚡创建优化列车

为 机械动力模组 列车提供的性能优化插件(Forge 1.20.1)。

🔗依赖项

本模组需要安装机械动力或机械动力(Fabric版)。

  • 我的世界 1.20.1
  • Forge 47.1.33+
  • 机械动力模组 6.0.8+
  • Flywheel 1.0.6+(随机械动力捆绑提供)

📦功能特性

1. 列车细节级别(LOD)

  • 精细 — 完整的物理车厢(玩家附近)
  • 中等 — 简化物理,正常渲染
  • 低 — 无物理,无碰撞,最小化机械更新
  • 虚影 — 虚影实体,无渲染,仅保留抽象数据

2. 车厢分组/抽象化

  • 将多个车厢合并为一个逻辑实体(TrainGroup)
  • 仅存储:长度、速度、位置、车厢列表(NBT格式)
  • 当玩家靠近时重新展开为详细状态

3. 安全多线程

辅助线程(安全):

  • 路线计算
  • 碰撞预测
  • 时刻表优化
  • 优先级管理
  • 细节级别决策
  • 预测性模拟

主线程(必需):

  • 实际实体移动
  • 机械动力物理
  • 渲染
  • 方块交互

4. 刻节流(部分更新)

  • 精细:每刻
  • 中等:每3刻(可配置)
  • 低:每8刻
  • 虚影:每20刻

5. 渲染优化

  • 禁用远处列车的动画
  • 跳过虚影细节级别(GHOST LOD)的完整渲染
  • 减少粒子和视觉效果
  • 隐藏不可见时的内部细节

6. 代理实体

  • 代表整列列车的轻量级实体
  • 替代数十个机械装置
  • 保持位置、速度和方向
  • 需要时重新生成真实车厢

7. 智能区块加载管理

  • 仅加载必要的区块
  • 更早卸载列车后方的区块
  • 预加载前方区块
  • 抗抖动(防止重复加载/卸载循环)

8. 物理优化

  • 简化远处车厢的物理计算
  • 低细节级别时禁用车厢间碰撞
  • 减少转向架检查
  • 远处时禁用内部机械物理

9. 网络优化

  • 仅在速度/方向变化时发送更新
  • 批量打包(增量压缩)
  • 降低远处列车的同步频率

10. 优先级系统

  • 按类型优先级排序(特快 > 客运 > 货运 > 低速)
  • 道口冲突解决
  • 轨道片段预留
  • 异步冲突分析

11. 动态性能监视器

  • 正常(TPS >= 18):完整保真度
  • 降级(15 <= TPS < 18):轻度优化
  • 严重(TPS < 15):激进优化,降低细节级别距离

🏅技术性能认证

创建优化列车经历了系列内部和社区测试,包括:

压力测试

  • 长度超过300格的列车
  • 同时移动的机械装置
  • 数百个实体的渲染
  • 激进预加载的世界

兼容性测试

  • 机械动力
  • Steam 'n' Rails
  • Embeddium
  • Radium
  • Copycats+
  • Distant Horizons

社区测试

预发布版本已在官方Discord上提供,确保每次公开更新都稳定且无回归问题。

⚙️配置

文件:create_optimized_trains-common.toml

所有功能都可单独配置距离、间隔和开关。

🪄从机械动力 6.0.9+ 反向移植的修复

机械动力 6.0.9(针对我的世界 1.21.1)引入了几个重要的修复,但从未反向移植到 1.20.1。由于 1.20.1 不再接收机械动力团队的更新,本模组为留守在 1.20.1 的玩家反向移植了以下修复:

机械碰撞箱GC压力(#6902)

原始问题: 当列车门在车站打开/关闭时,gatherBBsOffThread() 会使用 Shapes.joinUnoptimized() 将所有方块碰撞形状合并为一个 VoxelShape —— 这是一个 O(n²) 的操作,会创建大量临时对象。垃圾收集器无法跟上,导致1-30+秒的卡顿峰值,具体取决于列车复杂度。

我们的修复: ContraptionCollisionMixin 将碰撞收集算法替换为机械动力 6.0.9 中使用的相同 O(n) 方法(提交 8f30c2c)。它不再合并 VoxelShape,而是直接从每个方块的碰撞形状中收集 AABB —— 没有中间分配,没有GC压力。还包括相关重复问题:#4607、#5685、#9026、#9389。

车厢等待区块导致的列车卡顿

原始问题: 在 Train.tick() 中,当车厢进入未加载的区块时,机械动力会设置 carriageWaitingForChunks,强制将 speed 设为 0,直到区块加载完成。在包含许多列车且视野距离有限的地图上,这会导致每列列车跨越区块边界时出现0.5-1.5秒的冻结。

我们的修复: TrainMixin 将所有 tick() 中对 carriageWaitingForChunks 的读取重定向为始终返回 -1,因此速度永远不会归零。结合智能区块加载系统(预先加载列车前方的区块),列车能够连续行驶而不会卡顿。

碰撞检查性能

原始问题: collideWithOtherTrains() 每刻对所有列车运行,这在地图上有20多列列车时会变得代价高昂。

我们的修复: TrainMixin 根据服务器性能自适应地限制碰撞检查频率——正常时每4刻一次,降级时每8刻一次,严重时每12刻一次。每列列车的检查通过其UUID哈希值进行偏移,以均匀分布各刻的负载。

💚关于我们

发行商:GreenToastSoftware Games® (C)GreenToastSoftware Corporation。保留所有权利 2020-2026。