me/ 加工诊断(diagnostics)

覆盖范围

appeng.me.diagnostics 包 3 个 文件,外加从 me/cluster/implementations/ 归入本维度的 1 个(CraftingCpuDiagnostics.java),合计 4 个源文件。

实测:

  • find me/diagnostics -name '*.java' | wc -l = 3
  • me/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)

源码里的比较链值得记一笔,它是确定性排序:

  1. compareRows(left, right, sortMode)(:111)—— 主排序键
  2. ascending 取反(:112-114)
  3. 平局 → getDisplayName() 忽略大小写比较(:116)
  4. 仍平局 → 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), 所以视图行与内部状态不共享可变对象。

与既有维度的关系

相关条目