me/ 加工诊断(diagnostics)
覆盖范围
appeng.me.diagnostics 包 3 个 文件,外加从 me/cluster/implementations/
归入本维度的 1 个(CraftingCpuDiagnostics.java),合计 4 个源文件。
实测:
find me/diagnostics -name '*.java' | wc -l= 3me/cluster/implementations/CraftingCpuDiagnostics.java= 1(本条目一并叙述)
四个类
| 文件 | 行号 | 职责 |
|---|---|---|
CraftingNetworkDiagnostics.java |
17 | public final class。聚合器:按产物记录「产出总量 + 观测时长 + 采样数」,可排序 / 搜索 / 持久化 |
CraftingDiagnosticSessionId.java |
6 | public final class。加工会话标识,不可变值对象,支持 NBT 与字符串双向转换 |
DiagnosticRowView.java |
5 | public final class。只读视图行,4 个 public final 字段,供 UI 直接读 |
CraftingCpuDiagnostics.java |
18 | 单个 CPU 内的产出 / 回收配对记录。见 cluster 总览 |
CraftingNetworkDiagnostics 关键方法
| 方法 | 行号 | 说明 |
|---|---|---|
nextSessionId() |
23 | 分配下一个会话 ID |
getSessionCounter() |
28 | |
setSessionCounter(long) |
32 | 反序列化用 |
recordSample(IAEStack<?>, CraftingDiagnosticSessionId, ...) |
36 | 记一次产出 |
completeSession(CraftingDiagnosticSessionId) |
55 | 结束会话 |
clear() |
70 | 全清 |
clear(IAEStack<?>) |
79 | 清单个产物 |
isEmpty() |
90 | |
getRevision() |
94 | 单调修订号,供 UI 判断是否重绘 |
createRows(String search, DiagnosticSortMode, boolean ascending) |
98 | 生成排序后的视图行 |
writeToNBT() |
136 | → NBTTagList |
readFromNBT(NBTTagList, boolean merge) |
147 | 反序列化,merge 决定是否合并 |
内部类 DiagnosticStats(:199,private static final)是每产物的统计量载体。
createRows 的三级排序(:110-122)
源码里的比较链值得记一笔,它是确定性排序:
compareRows(left, right, sortMode)(:111)—— 主排序键ascending取反(:112-114)- 平局 →
getDisplayName()忽略大小写比较(:116) - 仍平局 →
Integer.compare(hashCode)(:119)—— 用 hash 做最终 tiebreaker
第 4 步保证排序结果稳定可复现(不依赖 HashMap 迭代顺序)。
搜索条件在 :101-108:search 为 null 或 trim 后为空则不过滤,
否则对 IAEStack.getDisplayName() 做小写 contains 匹配。
⚠️ 搜索是子串匹配,不是分词、不支持通配符。
CraftingDiagnosticSessionId 的工厂语义
| 方法 | 行号 | 行为 |
|---|---|---|
of(long value) |
14 | value > 0 才造对象,否则返回 null |
fromNBT(NBTTagCompound, String key) |
18 | null / 空 key → null;先试 TAG_LONG(:23),再试 TAG_STRING(:27) |
fromSerializedString(String) |
34 | null / 空串 → null |
writeToNBT(NBTTagCompound, String key) |
56 | |
compareTo / equals / hashCode / toString |
61 / 66 / 79 / 84 |
⚠️ of(0) 与 of(-1) 返回 null 而不是抛异常。调用方必须处理 null。
NBT 读取顺序(先 long 后 string)说明历史版本曾用字符串存过 ID。
DiagnosticRowView 是纯值对象
DiagnosticRowView.java:7-10 的 4 个字段全是 public final:
| 字段 | 类型 | 含义 |
|---|---|---|
stack |
IAEStack<?> |
产物 |
totalProduced |
long |
累计产出量 |
elapsedTimeTicks |
long |
观测总时长(tick) |
sampleCount |
long |
采样次数 |
createRows 构造时对栈做了 .copy()(CraftingNetworkDiagnostics.java:128),
所以视图行与内部状态不共享可变对象。
与既有维度的关系
- 采集方:CraftingCPUCluster 与
me/cluster/implementations/CraftingCpuDiagnostics.java:18 - 索引方:CraftingGridCache
- 开关:AEFeature.CraftingCpu、 AEFeature.CraftingLog
- UI:客户端在
appeng/client/gui/(不在本分片); 存在配方诊断终端 part:配方诊断终端