创建优化列车

创建优化列车

为Create Mod列车创建优化列车——性能优化附加组件。

游戏机制

🚅⚡Create Optimized Trains

Create Mod 列车的性能优化附加模组(Forge 1.20.1)。

🔗依赖项

本模组需要 Create 或 Create Fabric。

  • Minecraft 1.20.1
  • Forge 47.1.33+
  • Create Mod 6.0.8+
  • Flywheel 1.0.6+(随 Create 一同提供)

📦功能

1. 列车的 LOD(细节层级)

  • FULL(完整) — 具有完整物理效果的真实车厢(玩家在附近时)
  • MEDIUM(中等) — 简化物理效果,正常渲染
  • LOW(低) — 无物理效果,无碰撞,最小化装置更新
  • GHOST(幽灵) — 幽灵实体,不渲染,仅保留抽象数据

2. 车厢分组 / 抽象化

  • 将多个车厢合并为单个逻辑实体(TrainGroup)
  • 仅存储:长度、速度、位置、车厢列表(以 NBT 形式)
  • 玩家接近时重新展开

3. 安全多线程

副线程(安全):

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

主线程(必需):

  • 实际实体移动
  • Create 物理
  • 渲染
  • 方块交互

4. Tick 节流(部分更新)

  • FULL:每个 tick
  • MEDIUM:每 3 个 tick(可配置)
  • LOW:每 8 个 tick
  • GHOST:每 20 个 tick

5. 渲染优化

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

6. 代理实体

  • 用轻量级实体代表整个列车
  • 替代数十个装置
  • 保留位置、速度和方向
  • 需要时重新创建真实车厢

7. 智能区块加载管理

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

8. 物理优化

  • 为远处的车厢简化物理
  • 在低 LOD 下禁用车厢之间的碰撞
  • 减少转向架检查
  • 距离较远时禁用内部装置物理

9. 网络优化

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

10. 优先级系统

  • 按类型划分优先级(EXPRESS > PASSENGER > FREIGHT > LOW)
  • 交叉路口冲突解决
  • 轨道区段预留
  • 异步冲突分析

11. 动态性能监控

  • NORMAL(正常)(TPS >= 18):完整还原度
  • DEGRADED(降级)(15 <= TPS < 18):轻度优化
  • CRITICAL(危急)(TPS < 15):激进优化,缩短 LOD 距离

🏅技术性能认证

Create Optimized Trains 已通过一系列内部和社区测试,包括:

压力测试

  • 长度超过 300 个方块的列车
  • 同时移动的多个装置
  • 渲染数百个实体
  • 具有激进预加载的世界

兼容性测试

  • Create
  • Steam ’n’ Rails
  • Embeddium
  • Radium
  • Copycats+
  • Distant Horizons

社区测试

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

⚙️配置

文件:create_optimized_trains-common.toml

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

🪄从 Create 6.0.9+ 移植的修复

Create 6.0.9(适用于 Minecraft 1.21.1)引入了多项重要修复,这些修复从未被移植到 1.20.1。由于 1.20.1 不再从 Create 团队接收更新,本模组为仍停留在 1.20.1 的用户移植了以下修复:

装置碰撞箱 GC 压力(#6902)

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

我们的修复: ContraptionCollisionMixin 将碰撞收集算法替换为与 Create 6.0.9 相同的 O(n) 方法(commit 8f30c2c)。它不再合并 VoxelShapes,而是直接从每个方块的碰撞形状中收集 AABB——无中间分配,无 GC 压力。同时包含相关重复问题:#4607、#5685、#9026、#9389。

carriageWaitingForChunks 导致的列车卡顿

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

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

碰撞检查性能

原始问题: collideWithOtherTrains() 对每列列车每个 tick 都会运行,在拥有 20+ 列列车的地图上会变得非常昂贵。

我们的修复: TrainMixin 根据服务器性能自适应地节流碰撞检查——正常情况下每 4 个 tick,降级时每 8 个 tick,危急时每 12 个 tick。每列列车的检查按其实体的 UUID 哈希进行偏移,以将负载均匀分配到各个 tick 上。

💚关于我们

发行商:GreenToastSoftware Games® (C)GreenToastSoftware Corporation. 版权所有 2020-2026。