Asahi

Asahi

修复客户端不同步导致的移动太阳抖动问题!

工具

客户端侧 Minecraft 模组,用于消除因服务器延迟导致的昼夜循环橡皮筋效应!

如果你要 Forge 版,我就偷走你的膝盖骨

问题所在

每秒钟(20 个游戏刻),服务器会发送一个数据包,用于同步客户端与服务器之间的世界时间。由于客户端无法得知服务器的游戏刻速率,它们假设服务器以标准的每秒 20 游戏刻运行。因此,当服务器出现延迟时,这 20 个游戏刻需要更长时间处理,导致客户端显示的太阳位置落后于服务器上的实际位置。当同步数据包到达时,原版客户端会将太阳强制对齐到服务器位置,从而引发此模组所修复的问题。

解决方案

采用滚动加权平均值和插值算法!首先,我们采样过去 10 秒内服务器在客户端每个游戏刻上经过的游戏刻数量。然后,由于 10 秒前的样本不如最近一秒的样本相关性高,我们为每个样本赋予相对于第一个样本呈指数递减的权重。通过计算这一加权列表的平均值,我们可以有效预测接下来一秒内太阳的运动轨迹。预测导致的太阳位置误差会有所不同,但与使用原版逻辑时发生的回弹现象相比,几乎难以察觉。

不使用 Asahi 时:

不使用 Asahi 时的昼夜循环

使用 Asahi 时:

使用 Asahi 时的昼夜循环

请注意,此 GIF 来自模组的早期版本,自那时起所使用的插值算法已不断改进!

圆形太阳是 vanillatweaks.net 提供的资源包的一部分。

配置

{
  // 如果从服务器接收的时间与客户端时间相差 `skipDuration` 秒或更多,
  // 则直接跳转到服务器时间,绕过插值处理。
  // 如果昼夜循环速度异常快,可以尝试调整此值。
  "skipDuration": 60,
  // 在滚动平均插值中使用的先前因素数量。
  // 如果观察到太阳来回摆动且无法稳定到位,可以尝试调整此值。
  "interpolateSamples": 10,
  // 每个游戏刻的初始昼夜循环刻度数。
  // 如果存在其他模组加快或减慢昼夜循环速度,可以相应增加或减少此值。
  "initialFactor": 1.0,
  // 与昼夜循环分辨率相关的标准游戏刻速率。
  // 如果使用模组改变标准游戏刻速率或昼夜循环分辨率(24000 刻),则需调整此值。
  // 注意,据我所知,目前没有模组会改变这些参数。
  "standardTickRate": 20
}