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 |
正式通道收尾 |
关于「一个控制器能带多少机器」
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)。