介绍
该模组将红石线电路进行了优化,使其运行更高效且不再被位置影响运行结果。
模组致力于减少红石线带来的卡顿,实现方式是优化红石信号的计算方式并减少红石线的形状和方块更新次数。
这些更改的副作用则是红石线电路的更新顺序是更规律且可预测的,而不是被位置影响且混乱的。
性能表现
红石线对于 MSPT 的负面影响因该模组缩小至原来的二十分之一,且基本上没有造成红石线电路计算结果与原版的差异。
较少的代码修改次数将该模组的侵入性降到了最低,因此它是原版红石线计算不错的替代品。
该模组如何工作?
该模组使用的算法在设计时考虑了以下目标:
减少红石线为了确认自身的红石信号强度而检查周围方块的次数;
减少进行方块和形状更新的次数;
不以位置顺序进行方块和形状更新,而是以确定性的顺序进行,修复了错误 MC-11193。
在原版游戏中,红石线总是造成卡顿,因为它针对第一点和第二点进行优化并不成功。
红石线电路是递归更新的,每根红石线单独计算其红石信号强度,而不是根据它在红石线电路中连接的其他红石线进行计算。这意味着红石线电路中的红石线在确定其最终的红石信号强度之前可以改变红石信号强度六次以上。这个问题在 1.13 以及更低的版本中更加严重,红石线甚至必须在其中一次红石信号强度更新时将自身的红石信号强度更新至 1。
除此之外,红石线每次改变红石信号强度时会进行 42 次方块更新和多达 22 次的形状更新。
在这 42 次方块更新中,有 6 次是针对红石线自身的,它们不仅是多余的更新,也是红石线造成卡顿的重要原因,因为这些更新或导致红石线又进行不必要的红石信号强度计算。一个方块在曼哈顿距离为 2 的范围内只有 24 个邻近方块,意味着剩下的 36 次方块更新中有 12 次是重复的,因此它们也是在做无用功。
在 22 次形状更新中,只有 6 次是必须的。其他 16 次更新被传递到上方和下方的对角线方块。
如果红石线需要改变其连接情况,那么这些更新是必须的,但当它改变红石信号强度时则不是。
第三点更像是一个游戏体验问题,而不是红石线卡顿,不过原版红石线计算在处理这个问题上也并无建树。红石线电路更新的递归性质,加上每根红石线的更新受到其邻近红石线的更新影响,使红石线电路中的红石线更新顺序非常不统一,看起来甚至是随机的。
该模组则通过如下方式修复这些问题。
(1)为了确保红石线尽可能少的计算其红石信号强度,该模组删除了红石线电路在原版中递归更新的性质。作为替代,该模组将红石线电路变为一个整体,找到从电路外接收红石信号的红石线,并从那里开始传播红石信号。这有几个优点:
(2)有两种明显的方法可以减少方块和形状更新的次数。
对于单根红石线,这两种优化已经是最佳的了,但对于整个红石线电路来说,可以有更棒的优化!
前文提到该模组将红石线电路变为一个整体以传播红石信号,因此向该电路中的红石线传递方块和形状更新完全是多余的。剔除这些更新可以减少方块和形状更新的 20%。
(3)为了使红石线电路中相邻红石线的更新顺序具有确定性,该模组替换了红石线基于位置更新其相邻红石线的顺序。作为代替,红石线更新其相邻红石线的顺序基于红石信号的来源方向。算法的这一部分在很大程度上受到 theosib 的“RedstoneWireTurbo”的启发,对这部分感兴趣的可以阅读 theosib 在 Mojira 上发表的评论,或是参考它在 Carpet 中的实现方式。
该想法是根据传递红石信号的红石线与接收红石信号的红石线的相对位置决定红石信号流的方向。例如,红石线接收的唯一红石信号来自其西边的红石线,那么红石信号流的方向是东。
该模组使红石线对邻近红石线传递更新的顺序基于红石信号流的方向。这不仅完全消除了位置对红石信号更新的影响,还在很多情况下消除了方向对其造成的影响。然而,与“RedstoneWireTurbo”不同的是,该模组决定在模棱两可的情况下保留一定的方向性,而不是引入随机性,尽管这并不是技术难题。
虽然这些更改修复了单个红石线的方块更新顺序,但红石线电路整体的方块更新顺序亟待解决。事实证明,这并不是什么难题,因为前文提到的更改:红石线电路会检查从电路外接收红石信号的红石线,并从那里开始传播红石信号。如果每根红石线都能根据红石信号流的方向传递红石信号,最终就会得到一个不受位置影响且基本上不受方向影响的红石线更新顺序。
注意事项
对于支持 1.3.2 至 1.13.2 的 Fabric 版模组,需要预先安装 Legacy Fabric,在模组关系中有提到。
对于支持 1.0 至 1.13.2 的 Quilt 版模组,需要预先安装 Ornithe,它实现了 Quilt 在低于 1.14 的版本上的运行。