Skip to content

Grid Status Mechanism_CN

MIAOKATZE edited this page Jul 12, 2026 · 2 revisions

电网状态计算机制

1. 采样机制

电网状态计算依赖固定间隔的能量采样。MTE(无线能量监视器)与 HUD(便携终端)使用同步采样参数:

  • **检测间隔:**100 ticks(5 秒),MTE 与 HUD 同步
  • **窗口时长:**300 秒
  • **样本数量:**61 个样本(1 个初始样本 + 60 个间隔检测样本)
  • 数据集:EUDataSet,固定容量 61,FIFO 老化
  • **滚动窗口:**新样本推入时若已满载,则移除最旧样本,维持滚动 300 秒窗口

**设计说明:**固定容量 61 + FIFO 老化保证了窗口始终覆盖最近 300 秒,无论电网运行多久内存占用恒定。

2. BigDecimal 精度

斜率(EU/t)计算使用 BigDecimal 精确除法,避免浮点精度损失:

  • **精度:**6 位小数,RoundingMode.HALF_UP
  • **目的:**避免大 EU 值(可达 1018 量级)在 double 运算中的精度损失
  • 运算:(newest.value - oldest.value) / (newest.tick - oldest.tick) 全程使用 BigDecimal

**精度选择:**6 位小数对 EU/t 显示与红石判定绰绰有余,同时 BigDecimal 运算开销在 100 tick 间隔下可忽略不计。

3. 两类逻辑

EU/t 计算分为两个阶段,依据数据集当前容量切换:

阶段 触发条件 计算公式
冷启动 Dataset size < 61 (newest - oldest) / ((size - 1) × 100t)
工作态 Dataset size == 61 (newest - oldest) / 6000t

**数学等价:**当 size == 61 时,(size - 1) × 100t = 60 × 100t = 6000t,因此两个公式本质等价,统一为 (newest.value - oldest.value) / (newest.tick - oldest.tick)。冷启动公式允许在样本不足 61 个时也能给出可用的 EU/t 估计。

4. 特殊状态显示

当电网处于特殊状态时,EU/t 显示行替换为状态文本:

触发条件 显示文本 颜色
|eut| < 1 0 (<1EU) 灰色
eut == 0(所有值相同) 0 (静默) 灰色
静默 ≥ 300 秒 0 (长期静默) 深灰色
MTE 重载延迟 重载计算中,红石逻辑维持 红色
HUD 冷启动(size < 2) 网络状态:计算中... 青色标题 + 橙色值

5. 长期静默机制

当电网持续静默(所有采样值相同)达到 **300 秒(6000 ticks)**时,触发长期静默机制:

触发条件

  • 电网静默(所有采样值相同)持续 ≥ 300 秒(6000 ticks)

执行动作

  1. 状态标签从"静默"切换为"长期静默"
  2. 数据集压缩为 2 个数据点(首末),节省内存
  3. 下次采样若值不同,保留末位点作为新数据集起点(size=2,立即可计算 eut)
  4. 若值仍相同,仅更新末位点的 tick
  • longTermSilent 标志持久化到 NBT(MTE)/ 内存(HUD)
  • **末位点保留:**避免 size=1 触发"计算中"循环

**末位点保留说明:**此前在长期静默后首次采样到不同值时,可能将数据集重置为 size=1,触发"计算中..."显示循环。修正后保留末位点使 size=2,立即可计算斜率。

6. 重载处理

电网重载(chunk 重新加载、服务器重启等)按重载时长分流处理:

重载类型 判定 处理
短时重载 ≤ 10 秒 数据集保留,计算直接续传(≤ 3.3% 斜率误差,可接受)
长时重载 > 10 秒 数据集清空,触发冷启动
  • **MTE 长时重载:**启用 30 秒红石缓冲(redstoneReloadDelay = 600t)维持红石输出
  • **gap 检测:**gap > 200L(200 ticks)时清空数据集

**3.3% 误差来源:**短时重载最多丢失 10 秒(100 tick)数据,相对 300 秒(6000 tick)窗口约为 1.67%,斜率误差上限约 3.3%,在可接受范围内,因此短时重载不清空数据集。

7. HUD 重进处理

便携设备(HUD)的数据集处理与 MTE 不同,因为便携设备不跨存档持久化:

  • **不持久化:**便携设备数据集不跨存档持久化
  • **重置时机:**玩家重进/退出后数据集重置
  • **真实时间 gap 检测:**使用 System.currentTimeMillis(),阈值 10000ms(10 秒)
  • 原因:getTotalWorldTime() 在玩家退出时不推进,无法用世界时间检测退出

**设计说明:**MTE 位于世界中,世界时间持续推进,可用 tick gap 检测重载;而 HUD 跟随玩家,玩家退出后世界时间对该玩家不再推进,必须改用真实时间检测玩家是否离开过游戏。

8. 实时 EU/t vs 平均 EU/t

系统同时计算两种 EU/t,分别用于不同场景:

类型 计算方法 特点
实时 EU/t calculateRecentEUT(),最近 2 个样本斜率 响应快但波动大
平均 EU/t calculateEUT(),首末两点斜率(300 秒窗口) 平滑但延迟
  • **GUI 显示:**两者均在 GUI 中显示(实时状态行 + 平均状态行)
  • **HUD 显示:**HUD 也显示两行(实时 EU/t 行 + 平均 EU/t 行)

**使用场景:**实时 EU/t 适合观察短时波动(例如机器启停);平均 EU/t 适合评估长期趋势(例如电网整体收支)。红石模式 1/2 可选锚定平均或实时 EU/t。

Clone this wiki locally