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 网络的运行时对象。它自身不做传输计算,而是:

  1. 持有 pivot(Grid.java:47)——网的「代表节点」,网为空时为 null。
  2. 持有 machines(Grid.java:45):Map<Class<? extends IGridHost>, MachineSet>, 按宿主类型分组索引全网节点。
  3. 持有 caches(Grid.java:46):本网实例化的 10 个 IGridCache。
  4. 持有 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)。

相关条目