PathingCalculation(appeng.me.pathfinding.PathingCalculation)

基本信息

属性 值
源码 appeng/me/pathfinding/PathingCalculation.java
类声明行号 48
接口 无(纯算法类,一次性使用)
构造器 :95,单参 IGrid
唯一硬编码常量 CONTROLLER_FACE_CHANNELS = 32(:50)

职责

一次全网通道分配。这是 AE2 里最核心的一段算法:给定一张网和它所有节点 的通道需求,算出每个控制器朝向面该背多少、每条线缆走多少。

它是一次性对象 —— 算完就扔。PathGridCache.repath() (me/cache/PathGridCache.java:352)负责造它、用它、丢掉它。

关键常量与内部类型

成员 行号 说明
CONTROLLER_FACE_CHANNELS = 32 50 每朝向面通道预算
ControllerFace(static final class) 247 承载「控制器节点 + 朝向」的配对
SUBTREE_END = new Object() 265 迭代式 DFS 的栈底哨兵
getChannelsInUse() 327 实际占用
getChannelsByBlocks() 331 按方块折算的占用

唯一入口

compute()(:157)。

⚠️ 算法用显式栈 + SUBTREE_END 哨兵而不是递归。这是性能选择: 网络规模大时递归会爆栈。源码里没有对递归深度的限制说明。

与 visitor 的配合

compute() 内部使用本包另外两个类:

协作类 源文件 角色
ControllerValidator ControllerValidator.java:18 找控制器并校验朝向
AdHocChannelUpdater AdHocChannelUpdater.java:19 临时通道
ChannelFinalizer ChannelFinalizer.java:19 正式通道收尾

见 pathfinding 总览。

关于「一个控制器能带多少机器」

me/ 源码里没有这样的常量。已确认的只有:

  • 每朝向面 32 通道(:50)
  • 递归联网深度上限 AEConfig.instance.maxRecursiveDepth, 默认 100(appeng/core/AEConfig.java:150)——但那是存储总线跨网查询 的限制(me/Grid.java:341),与通道无关

任何「N 个方块 / M 台机器」的数字在本仓库没有源码依据,不写。

生命周期

GridConnection.java:261   p.repath()
  └─ PathGridCache.repath()          me/cache/PathGridCache.java:352
       └─ new PathingCalculation(grid)  :95
            ├─ compute()              :157
            │    ├─ ControllerValidator
            │    ├─ AdHocChannelUpdater
            │    └─ ChannelFinalizer
            └─ 读 getChannelsInUse() / getChannelsByBlocks()

调试开关:AEConfig.instance.debugPathFinding(me/GridConnection.java:255)。

相关条目