-
Notifications
You must be signed in to change notification settings - Fork 2
Grid Status Mechanism_CN
电网状态计算依赖固定间隔的能量采样。MTE(无线能量监视器)与 HUD(便携终端)使用同步采样参数:
- **检测间隔:**100 ticks(5 秒),MTE 与 HUD 同步
- **窗口时长:**300 秒
- **样本数量:**61 个样本(1 个初始样本 + 60 个间隔检测样本)
-
数据集:
EUDataSet,固定容量 61,FIFO 老化 - **滚动窗口:**新样本推入时若已满载,则移除最旧样本,维持滚动 300 秒窗口
**设计说明:**固定容量 61 + FIFO 老化保证了窗口始终覆盖最近 300 秒,无论电网运行多久内存占用恒定。
斜率(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 间隔下可忽略不计。
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 估计。
当电网处于特殊状态时,EU/t 显示行替换为状态文本:
| 触发条件 | 显示文本 | 颜色 |
|---|---|---|
| |eut| < 1 | 0 (<1EU) | 灰色 |
| eut == 0(所有值相同) | 0 (静默) | 灰色 |
| 静默 ≥ 300 秒 | 0 (长期静默) | 深灰色 |
| MTE 重载延迟 | 重载计算中,红石逻辑维持 | 红色 |
| HUD 冷启动(size < 2) | 网络状态:计算中... | 青色标题 + 橙色值 |
当电网持续静默(所有采样值相同)达到 **300 秒(6000 ticks)**时,触发长期静默机制:
- 电网静默(所有采样值相同)持续 ≥ 300 秒(6000 ticks)
- 状态标签从"静默"切换为"长期静默"
- 数据集压缩为 2 个数据点(首末),节省内存
- 下次采样若值不同,保留末位点作为新数据集起点(size=2,立即可计算 eut)
- 若值仍相同,仅更新末位点的 tick
-
longTermSilent标志持久化到 NBT(MTE)/ 内存(HUD) - **v1.3.2 修正:**保留末位点避免 size=1 触发"计算中"循环
**v1.3.2 修正说明:**此前在长期静默后首次采样到不同值时,可能将数据集重置为 size=1,触发"计算中..."显示循环。修正后保留末位点使 size=2,立即可计算斜率。
电网重载(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%,在可接受范围内,因此短时重载不清空数据集。
便携设备(HUD)的数据集处理与 MTE 不同,因为便携设备不跨存档持久化:
- **不持久化:**便携设备数据集不跨存档持久化
- **重置时机:**玩家重进/退出后数据集重置
- **真实时间 gap 检测:**使用
System.currentTimeMillis(),阈值 10000ms(10 秒) -
原因:
getTotalWorldTime()在玩家退出时不推进,无法用世界时间检测退出
**设计说明:**MTE 位于世界中,世界时间持续推进,可用 tick gap 检测重载;而 HUD 跟随玩家,玩家退出后世界时间对该玩家不再推进,必须改用真实时间检测玩家是否离开过游戏。
系统同时计算两种 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。