状态流

状态流

通过重构BlockState查询和邻居方块更新,实现激进的性能优化。

优化

StateStream

针对于 Minecraft 26.1.2 的激进性能优化——零游戏性改动,性能保证。

StateStream 精准针对 Minecraft 服务器循环中最耗时的三个热点路径,并将它们替换为简洁、缓存友好的实现。每个优化均可独立开关,并在出错时自动禁用,因此配置不当会静默回退至原版行为,而不会引发漏洞。


概述

StateStream 模组移除了游戏中大量不必要的检查,使你的服务器运行更加流畅。如果你的 TPS 未达到 20(20 为上限),这将提升你的 TPS。因此,若你遇到服务器卡顿,该模组尤其有帮助。即便你的 TPS 已达到 20(上限),该模组仍会帮助提升性能,因为你的电脑可以减少运算量。因此,在单人游戏或在你电脑上托管服务器/世界时,该模组极为有用,因为它能让 CPU 有更多资源用于提升你的 FPS。

性能提升

FPS(客户端帧率)

StateStream 的优化位于服务端,但会通过三种方式间接提升客户端的 FPS:

1. 减少服务器卡顿尖峰 → 更平滑的动画插值 当服务器错过一个 tick(低于 20 TPS)时,客户端会对实体和方块位置进行错误的插值。橡皮筋效应、卡顿和“抖动”移动均可追溯至服务器延迟。StateStream 能让服务器更稳定地保持在 20 TPS,客户端所体验到的帧率会更加平滑,即便你的 GPU 实际 FPS 未变。

2. 单人游戏 / 内置服务器(对单人玩家最为重要) 在单人游戏中,服务器和客户端共享同一个 CPU。服务器 tick 中每节省的一毫秒都会返还至渲染线程。在典型的生存世界中:

  • 方块状态缓存消除了区块渲染边界计算中的冗余 HashMap 遍历
  • 响应式 tick 减少了 tick 线程所耗时间,直接降低了帧时间

估算的单人游戏 FPS 提升:+3 – 12 FPS(基于 60 FPS 基线);若服务器占用更多 CPU、增加渲染距离,或由同一台电脑同时托管多人游戏世界时,可获更高收益。

3. 降低垃圾回收压力 扁平化的 long[] 缓存避免了原版通用属性系统每 tick 产生的数千个装箱 Boolean 和 Integer 对象分配。短生命周期对象减少 → 垃圾回收暂停减少 → 掉帧减少。

注意! 仅当服务器/世界与客户端运行在同一台电脑上时,FPS 提升才会显现,例如在本地为你的朋友托管服务器或使用 Essentials 等。当模组被安装在外部服务器上时,你会体验到服务器运行更流畅,而并非你的客户端。


各项优化的原理

JIT 方块状态内联

Minecraft 中的每个方块都拥有一个或多个方块状态(草方块有 snowy: true/false,原木有 axis: x/y/z 等)。原版通过 StateHolder 内的通用 HashMap 查找属性——灵活但每 tick 调用数百万次时速度较慢。

StateStream 在启动时将五个查询最频繁的属性(solid、opaque、hasCollision、isAir、lightEmission)预烘焙到一个扁平化的 long[] 数组中,每个方块状态 ID 对应一个条目。查找变成了一次数组读取,而非映射遍历。数组的排列方式使得频繁共同访问的属性共享同一 CPU 缓存行。

响应式方块刻

原版每个子区块每 tick 采样 random.nextInt(4096)。在典型的生存世界中,这 4096 个位置大部分是空气或不可刻的石头。StateStream 维护了一份仅包含可刻方块(作物、草、海带、冰等)位置的注册表,并直接跳转至这些位置。

刻速率与 Minecraft 原版数学上完全一致。 每方块每 tick 的 1/4096 概率被精确保留——我们没有改用轮询或确定性调度。作物生长速率、冰形成、树木蔓延——一切在统计上保持一致,只是更流畅且占用更少的 CPU。

更新剔除

当方块发生变化时,Minecraft 会通知最多 6 个相邻方块。其中许多通知是确有必要的(红石、水流、下落沙)。但部分接收方方块对通知不作任何响应——它们收到后立即返回。

StateStream 允许你在 JSON 配置文件中注册这些“惰性配对”。在传播相邻通知之前,它会检查该表,若接收方已知对该来源无响应则跳过调用。默认配置文件为空——开箱即用为零抑制,安全性最大化。


命令

需要操作员权限等级 2。

/statestream stats      — 缓存命中率、被抑制的更新、已追踪的可刻方块位置
/statestream status     — 各模块激活 / 自动禁用状态
/statestream reload     — 无需重启即可重新加载 inert_pairs.json
/statestream benchmark  — 定时性能扫描(结果见服务器日志)

配置

config/statestream.toml — 首次启动时自动生成,含安全默认值:

[general]
jit_inlining_enabled = true
update_culling_enabled = true
reactive_ticking_enabled = true
debug_logging = false

[culling]
inert_pairs_file = "config/statestream/inert_pairs.json"

三个模块均可独立开关。若某模块与另一模组冲突,可在单个配置行中禁用该模块。


常见问题 - 便是我自问自答罢了——嘻嘻 :(

这会改变我的农场运作方式吗? 不会。刻速率、生长概率及所有随机刻行为在数学上与原版完全一致。1/4096 概率模型被精确保留。

这会破坏红石吗? 默认情况下不会。更新剔除默认不抑制任何配对。红石行为完全不受影响,除非你手动添加惰性配对(且须先对照原版源码验证)。

这会导致我的世界损坏吗? 不会。StateStream 从不写入方块数据或修改世界状态。它只改变服务器读取方块属性的速度,而不改变这些属性的内容。

出现问题会怎样? 受影响的模块会记录警告并静默禁用。你的世界将在该会话剩余时间内保持原版行为运作。不会崩溃,不会丢失数据。