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)的开关来源 |