me/ 网格缓存子系统(grid-cache)

覆盖范围

appeng.me.cache 包 + appeng.me.cache.helpers 包,共 16 个 .java 文件。

实测:find me/cache -name '*.java' | wc -l = 16(cache/ 根 10 + cache/helpers/ 6)。

最重要的一条事实:注册的是 9 个,不是 10 个

me/cache/ 目录下有 10 个类,但只有 9 个进入 IGridCacheRegistry。 集合运算结果:

类 是否注册 依据
TickManagerCache ✅ core/Registration.java:544
EnergyGridCache ✅ :545
PathGridCache ✅ :546
GridStorageCache ✅ :547
P2PCache ✅ :548
SpatialPylonCache ✅ :549
SecurityCache ✅ :550
CraftingGridCache ✅ :551
ItemFlowGridCache ✅ :552
NetworkMonitor ❌ 不在注册表内

NetworkMonitor 不是 IGridCache,它由 GridStorageCache.java:123 内部创建:

// GridStorageCache.java:123
this.monitors.put(type, new NetworkMonitor<>(this, type));

⚠️ 它没有 @Reflected 式的注册注入点,因此不能计入「网格缓存」计数。

注册表机制

core/Registration.java:543 取出注册表,:544-552 注册 9 项。 注册表实现在 core/features/registries/GridCacheRegistry.java:23, 容器字段在 core/features/registries/RegistryContainer.java:51。

GridCacheRegistry.createCacheInstance(IGrid)(GridCacheRegistry.java:42-58) 对每个注册项 强制要求一个 IGrid 单参构造器,否则:

异常 抛出 行号
NoSuchMethodException IllegalArgumentException :49-50
InvocationTargetException / IllegalAccessException / InstantiationException IllegalStateException :52-54

调用链:Grid.java:59-60 → AEApi.instance().registries().gridCache().createCacheInstance(this)。

注册键的两类形态

形态 注册项 含义
接口 → 实现 ITickManager→TickManagerCache、IEnergyGrid→EnergyGridCache、IPathingGrid→PathGridCache、IStorageGrid→GridStorageCache、ISpatialCache→SpatialPylonCache、ISecurityGrid→SecurityCache、ICraftingGrid→CraftingGridCache 对外暴露 API 接口,Addon 可取
类 → 自身 P2PCache→P2PCache、ItemFlowGridCache→ItemFlowGridCache 无 api/ 接口,纯实现类,Addon 拿不到类型化句柄

getCache(Class) 按注册键查(Grid.java:189-191),所以想取 P2PCache 必须传 P2PCache.class 而不是某个接口。

16 个文件逐个职责

me/cache/ —— 10 个

文件 行号 职责
GridStorageCache.java 68 IStorageGrid。持有全网 NetworkInventoryHandler 列表、cell 提供者、变更追踪;产出 getItemInventory() / getFluidInventory() 两个 NetworkMonitor
EnergyGridCache.java 50 IEnergyGrid。能量供给 / 消耗 / 存储的分配中心,跨网递归用 Set<IEnergyGrid> seen 防环
PathGridCache.java 47 IPathingGrid。持有当前 controller 位置、启动状态、通道需求;repath()(:352)是建边 / 拆边的唯一触发入口
CraftingGridCache.java 107 ICraftingGrid。加工列表 → 可用产物索引、CPU cluster 索引;带静态 pauseRebuilds() / unpauseRebuilds()(:277 / :281)
SecurityCache.java 37 ISecurityGrid。owner 玩家 ID、权限位、OP 白名单(:164 / :168 / :172)
P2PCache.java 33 纯实现类。维护 P2P 隧道频率表:getOutputs(freq, Class)(:170)、getInput(freq)(:184)、unbind(:160)
SpatialPylonCache.java 31 ISpatialCache。空间 IO 的加速计算:把柱体高度算成 requiredPower()(:172)与 currentEfficiency()(:177)。5 个生命周期钩子全为空实现(:182/:185/:188/:191/:194)
TickManagerCache.java 33 ITickManager。按 node 分配 tick 频率,支持 alertDevice(:171)/ sleepDevice(:195)/ wakeDevice(:209)三档降频
ItemFlowGridCache.java 26 纯实现类,新增于上游。物品流量采样:环形桶 Bucket(:51)+ 累加器 ItemFlowAccumulator(:61),对外给 getRecentFlow(:130)/ getAllRecentFlow(:157)
NetworkMonitor.java 55 不是 IGridCache。IMEMonitor<T> 的全网视图,每个 stack 类型一个实例,由 GridStorageCache.java:123 创建

me/cache/helpers/ —— 6 个

文件 行号 职责
TunnelCollection.java 19 Iterable<T extends PartP2PTunnel>,按类型过滤的一组 P2P 隧道
TunnelIterator.java 18 上者的迭代器(同样按类型过滤)
TunnelConnection.java 16 一对 (PartP2PTunnelME, IGridConnection)
ConnectionWrapper.java 15 IGridConnection 的可变持有者(带 getter/setter),供量子桥重接
Connections.java 21 IWorldCallable<Void>,P2P 的延迟建链批处理器:markCreate()(:44)/ markDestroy()(:39)后由 PartP2PTunnelME.updateConnections() 统一执行
TickTracker.java 24 单个 node 的 tick 速率记录,实现 Comparable(:63);addEntityCrashInfo(:69)把崩溃报告挂进 AE 自己的诊断里

逐条生命周期钩子实现度

IGridCache 有 5 个钩子:onUpdateTick / addNode / removeNode / onSplit / onJoin (外加 populateGridStorage)。

cache onUpdateTick addNode removeNode onSplit onJoin populateGridStorage
GridStorageCache :128 :165 :143 :187 空 :190 空 :193 空
EnergyGridCache :143 :565 :516 :613 :621 :628
PathGridCache :70 :150 :125 :179 :186 :195
CraftingGridCache :169 :212 :184 :238 :246 :270
SecurityCache :66 :96 :71 :106 空 :109 空 :112 空
P2PCache :65 空 :90 :68 :112 空 :115 空 :118 空
SpatialPylonCache :182 空 :188 空 :185 空 :191 空 :194 空 :197 空
TickManagerCache :65 :141 :132 :162 空 :165 空 :168 空
ItemFlowGridCache :177 :189 空 :186 空 :192 :197 :209

SecurityCache 刻意不实现 split/join(权限随网走,不随存储走); SpatialPylonCache 完全不持久化(纯派生值,每 tick 重算)。 EnergyGridCache 是唯一 6 个钩子全部实现的 cache —— 网格合并时能量必须 重新分配,拆开时必须归还,属于硬需求。

与既有维度的关系

关系 说明
→ Grid Grid 是唯一持有者;cache 之间不互相引用,只通过事件总线通信
→ 方块安全站 SecurityCache 的权限源;me/storage/SecurityInventory.java 读它的数据
→ 方块加工单元 / CPU CraftingGridCache 的 CPU cluster 索引来源,见 cluster 总览
→ P2P part P2PCache 的数据源是 PartP2PTunnel 实例
→ 存储总线 part GridStorageCache 汇聚的就是这些 part 的 handler
→ AEFeature.Security SecurityCache.isAvailable()(:115)的开关来源

反向链接