Grid(appeng.me.Grid)
基本信息
| 属性 | 值 |
|---|---|
| 源码 | appeng/me/Grid.java |
| 类声明行号 | 40 |
| 实现接口 | appeng.api.networking.IGrid |
| 实例化点 | 不由 AE2 内部 new;由 GridNode 在首次接入时触发 |
| 身份 | private final UUID id(Grid.java:42,构造器 Grid.java:57 生成) |
职责
Grid 是一张 ME 网络的运行时对象。它自身不做传输计算,而是:
- 持有
pivot(Grid.java:47)——网的「代表节点」,网为空时为null。 - 持有
machines(Grid.java:45):Map<Class<? extends IGridHost>, MachineSet>, 按宿主类型分组索引全网节点。 - 持有
caches(Grid.java:46):本网实例化的 10 个IGridCache。 - 持有
myStorage(Grid.java:49):IGridStorage,持久化载体。
构造:cache 实例化的唯一入口
// Grid.java:59-60
final Map<Class<? extends IGridCache>, IGridCache> myCaches =
AEApi.instance().registries().gridCache().createCacheInstance(this);
9 个注册项见 grid-cache 总览。
add():拆网 / 合网的真正逻辑
Grid.java:126-185。三个分支:
| 条件 | 行为 | 行号 |
|---|---|---|
gridNode.getGridStorage() != null 且 gs.getGrid() == null |
认领这块已有存储,不 split(存档加载路径) | 141-147 |
gridNode.getGridStorage() != null 且 grid != this |
两网相撞 → split:老网的 cache 全部 onSplit(tmp),新网的 cache 全部 onJoin(tmp) |
148-166 |
gridNode.getGridStorage() == null 且 myStorage == null |
向 WorldData.instance().storageData().getNewGridStorage() 申请新存储 |
167-170 |
split 受 gs.hasDivided(this.myStorage) 保护(Grid.java:155-156)——同一对网
只会真正分裂一次,重复触发被短路。
remove():节点移除与空网销毁
Grid.java:100-124。若被移除的正是 pivot,则从剩余节点里另选一个作新 pivot;
若已无节点,则 pivot = null → TickHandler.INSTANCE.removeNetwork(this) →
this.myStorage.remove()(Grid.java:114-123)。这就是「网消失」的唯一路径。
tick
Grid.java:264-281 update():对每个 cache 调 onUpdateTick(),但前提是
this.pivot != null(Grid.java:269)。空网不 tick。
内置性能采样:PROFILING_SAMPLE_COUNT = 200(Grid.java:51),仅在
startProfiling() 打开后统计,isProfiling() 为 false 时无额外开销。
跨网递归查询(Storage Bus 互联)
Grid.getSubnetGridMap()(Grid.java:326-336)只认一种跨网通道:宿主是
appeng.parts.misc.PartStorageBus 且 sb.getConnectedGrid() != null。
getAllRecursiveGridConnections()(Grid.java:321-361)的递归深度上限是
配置项 AEConfig.instance.maxRecursiveDepth,默认 100
(appeng/core/AEConfig.java:150,读取于 AEConfig.java:307-308),
并在 Grid.java:341 提前返回。这是防环的第二道保险(第一道是 visited 集合,
Grid.java:348-352)。
注意
setImportantFlag(int, boolean)(Grid.java:289-292)是位图操作,不是布尔赋值; 参数名publicHasPower是 SRG 直露的遗留命名。equals/hashCode(Grid.java:294-305)只按id比,不按对象身份。getGridConnections(accessType)在accessType == null时由调用方保证非空;getAllRecursiveGridConnections才显式处理null(Grid.java:322)。