me/ 路径与通道分配(pathfinding)
覆盖范围
appeng.me.pathfinding 包,5 个 .java 文件。
实测:find me/pathfinding -name '*.java' | wc -l = 5。
逐类职责
| 文件 | 行号 | 职责 |
|---|---|---|
IPathItem.java |
18 | 接口。可参与路径计算的对象。由本包定义(不是 api/),实现者有 GridNode、GridConnection |
PathingCalculation.java |
48 | 核心算法。一次全网通道分配:算控制器、算各面预算、传播通道数、收尾 |
ControllerValidator.java |
18 | IGridVisitor。在遍历中寻找朝向正确的控制器节点,产出 ControllerFace |
ChannelFinalizer.java |
19 | IGridConnectionVisitor。收尾遍历,把临时 ad hoc 通道转成正式通道 |
AdHocChannelUpdater.java |
19 | IGridConnectionVisitor。临时(ad hoc)通道的即时分配/回收 |
本包在 brief 里的定位澄清
brief 猜测的维度里「Channel」单列。在本源码树中,没有 me/channel/ 包。
通道相关代码分散在三处:
| 位置 | 内容 |
|---|---|
me/pathfinding/ |
分配算法(5 个文件,本维度) |
me/helpers/ChannelPowerSrc.java:18 |
通道能量来源(见 helpers) |
me/cache/PathGridCache.java |
通道需求状态(见 PathGridCache) |
me/GridConnection.java:123-179 |
通道计数的存储点 |
「Security」「Controller」「Crafting CPU」同理,也都不是 me/ 下的独立包:
| brief 猜测维度 | 真实位置 |
|---|---|
| Security | me/cache/SecurityCache.java:37 + me/storage/SecurityInventory.java:31;API 在 api/networking/security/ |
| Controller | 方块与渲染在 tile/networking/TileController.java、block/networking/BlockController.java;me/ 里只有 me/pathfinding/ControllerValidator.java:18 |
| Crafting CPU | me/cluster/implementations/CraftingCPUCluster.java:138(多方块,见 cluster) |
| P2P | me/cache/P2PCache.java:33(见 P2PCache);part 在 parts/p2p/ |
| DSU | me/ 下完全没有。全部在 integration/modules/DSU.java + integration/abstraction/IDSU.java + integration/modules/helpers/MFRDSUHandler.java |
| Grid / Storage / Network | ✅ 本包与 me/grid-core/、me/storage/ |
唯一可引用的数值
PathingCalculation.java:50:
private static final int CONTROLLER_FACE_CHANNELS = 32;
每个控制器朝向面 32 通道预算。这是本维度唯一的硬编码通道数值,
其余全由 AEConfig 与节点需求动态算出。
me/ 下不存在其它通道上限常量 —— 所谓「一个控制器支持 N 个通道」之类的
数字在源码中没有定义。
IPathItem 契约(IPathItem.java:18-)
源码里有明确的两段式注释:
/* USED BY AD HOC PATHING */ setAdHocChannels(int)
/* USED BY CONTROLLER PATHING */ getControllerRoute() / setControllerRoute(IPathItem)
getPossibleOptions() / incrementChannelCount(int)
即两套并行的通道机制:ad hoc(临时、即时)与 controller(正式、预算制)。
AdHocChannelUpdater 与 ChannelFinalizer 各自负责一条。
两个 visitor 的区别
| 类 | 类型 | 接口方法 | 作用 |
|---|---|---|---|
AdHocChannelUpdater |
IGridConnectionVisitor |
visitNode(:28)、visitConnection(:35) |
临时通道:构造器拿 int used(:23),逐节点写回 |
ChannelFinalizer |
IGridConnectionVisitor |
visitNode(:22)、visitConnection(:29) |
收尾:GridConnection.finalizeChannels()(me/GridConnection.java:179) |
ControllerValidator 是第三种:IGridVisitor,只有 visitNode(:39),
配 isValid()(:63)与 getFound()(:71)。
触发链
GridConnection 构造成功
└─ p.repath() me/GridConnection.java:261
└─ PathGridCache.repath() me/cache/PathGridCache.java:352
└─ PathingCalculation me/pathfinding/PathingCalculation.java:48
├─ ControllerValidator 找控制器 + 朝向面
├─ AdHocChannelUpdater 临时通道
└─ ChannelFinalizer 收尾
PathingCalculation 的两个公开结果:
getChannelsInUse()(:327)与 getChannelsByBlocks()(:331)。
内部哨兵 SUBTREE_END = new Object()(:265)用于迭代式 DFS 的栈底标记;
ControllerFace(:247)是包私有静态类,承载「控制器 + 朝向面」。