延迟理论

延迟，本意是“推迟”，后来指从输入发生变化到输出发生变化所需的时间。在红石电路中，特指用刻分析电路后得到的电路响应时间长度，也泛指事件发生的时间长度。**延迟理论**是对红石电路计时的方法，在红石电路的发展过程中，给电路计时也是非常必要的。只有掌握了延迟理论，才有可能进行时间上的比较、时序上的优化，真正的解释并理解红石电路随时间运行背后的规律。随着红石原理的发展，延迟理论成为红石电路的一颗璀璨明珠。

## 启动延迟理论

### 启动延迟思想诞生的背景

在红石电路诞生初期，玩家就有了对延迟计时的需求。但是在基础理论不发达的当时，玩家只能做到了解红石中继器的4档延迟分别是1-4rt，对刻的理解还停留在10rt=1s的水平上，如果电路中存在活塞，那么这个电路就没有办法被计算延迟了。在这种不健全的发展状态下，红石电路却仍然在发展中，等到Defanive发表了无延迟电路后，甚至都没有一个人能解释，为什么在一长串无延迟电路中，只有第一个活塞有着0.5rt的延迟。这种矛盾推动着事物发展，Defanive开始给出了他对活塞启动延迟的设想，而这最晚不超过2013年7月。

以下是Defanive对活塞具有与众不同的可变延迟的思想：

活塞拥有2rt的延迟，其中0.5rt为启动延迟。当活塞被拉杆、压力板等元件激活时，方块被瞬间变为36号方块，但要等启动延迟经过后才能开始推出。当拉杆被中继器、比较器等原件激活时，方块也瞬间变为36号方块，但没有启动延迟，直接开始推出，此时活塞的延迟只有1.5rt。有无活塞启动延迟，是由游戏内的一个变量决定的，而所有的活塞都共享这一变量，因此只要有一个活塞的启动延迟被取消，全部的启动延迟都被取消。

据Defanive本人所说，这一思想的诞生，远在2014年6月之前。

### 启动延迟理论的完善

启动延迟的思想被提出后，玩家对其真实性产生了怀疑。2014年6月，凤合草酸泥煤用实验证明了启动延迟的可行性，在讨论当中，启动延迟理论得到完善。

2014年11月，彭哥·一世系统化、理论化地整理了启动延迟理论，并作为教程发布。文章中使用了投掷器投掷物品作为两线路比较先后激活顺序的方式，用浅显易懂的方式证明了启动延迟理论的数个结论。同时，正正正正正好发布了基于中继器D锁存器功能的精密时序比较器，这一时序比较器能够分辨精度为0.5rt的先后时序。同时也给出了中继器优先级大于比较器的结论，以及红石线直接相连的两个元件没有办法判断谁先激活的结论。

到目前为止，启动延迟理论得到完善，成为了能够真正解决问题的工具，此时的启动延迟理论可以表述如下：

活塞拥有1.5rt的延迟，其中0.5rt为启动延迟。当活塞被拉杆、压力板等原件激活或撤销激活时，方块被瞬间变为36号方块，接着等待0.5rt的启动延迟后，开始推出或拉回；当与活塞处于同一条红石线上有中继器、比较器、红石火把或其他活塞等先启动时，活塞的0.5rt启动延迟被取消，此时活塞的延迟只有1rt。

### 对启动延迟理论的质疑

启动延迟理论得到完善并作为解释实现现象的正统思想得到了很多人的支持，但是却很少有人意识到，在这看似平静的水面下，一股暗流正在涌动，它正在积蓄着力量，企图彻底摧毁现有的延迟体系。

首先，是对Defanive的思想中，“一个活塞的启动延迟被取消，全部的活塞的启动延迟被取消”的质疑。实验证明，即使在每个游戏刻中都有无启动延迟的活塞伸出收回，如果一个活塞没有和它们在同一个电路中，仍然会具有启动延迟。这意味着Defanive的“全世界的活塞共享一个变量”的说法是不成立的。

其次，是对启动延迟理论中，“活塞在接到信号的一瞬间将方块变为36号方块”的质疑。有的实验疑似表明，活塞并非在接到信号的一瞬间将方块变为36号方块，但更多的实验表明，活塞在接到信号的一瞬间将方块变为36号方块。

接着，是对“同一条红石线上有元件先启动”的质疑，这一要求的实现十分复杂而且没有太大的实际意义，编写游戏的程序员不太可能为了实现这样一个奇怪的目标而浪费大段的时间。这一思路启发人们，启动延迟理论仍然披着一层朦胧的面纱，只有揭开这一层谜团，才能看清延迟运行的本质，而这个本质一定是简单的。

但是人们并没有意识到这一点，而且，随着实验证据的不断增多，启动延迟理论出现了越来越多的问题。

2014年12月，在“什么样的情况下活塞启动延迟被取消”这一问题的指引下，人们开始尝试继续完善启动延迟理论，而后来的结果证明，这并没有起到太大的推动作用。

2015年1月，在短脉冲的研究下，人们发现启动延迟理论认为脉冲长度相同的两种脉冲会有不同的行为，这也暗示了电路在微观层次存在更精细的结构，但是人们掌握了大量有关短脉冲的现象资料，却没有找到背后蕴含的规律，只能把它按照行为，将短脉冲继续分类。同时，短脉冲之间的区分开始变得模糊，如果没有启动延迟理论的计算，人们甚至会把两个“不同延迟”的短脉冲当做是类似的脉冲。

2015年2月，幽灵方块被发现，这同样是启动延迟理论所无法解释的现象。

2015年上半年，启动延迟理论和方块更新理论保持着很良好的速度发展着，但对于延迟的更深入理解却没有进行，取得的成就越来越多，但人们仍然无法很好的认识短脉冲，换句话说，在微观领域，启动延迟理论总是有些无能为力。

2015年8月，一些看似能够更好解释“什么情况下活塞没有启动延迟”这一问题的想法被提出了。与2015年所发现的新内容结合到一起，这些新想法或许是仍然是徒劳无功的垂死挣扎，或许这些新的实验现象积累着量变，在某一时刻转化为质变，引领中国人自主找到启动延迟理论背后的秘密。但是历史无法告诉我们答案了，因为很快，启动延迟理论就面临了全盘崩坏的危机——即时更新理论传入了中国。

### 即时更新理论的冲击

Hiback于2015年7月上旬搬运了Youtube上Sancarn和Selulance的视频，hiback称其为“红石tick bug”（av2537345）。在这个视频中，Sancarn和Selulance基于大量的实验给出了一个新的延迟理论——即时更新理论（**T**he **I**mmediate **U**pdate **B**ug）。即时更新理论直接冲击启动延迟理论的根基——活塞具有启动延迟的假设。即时更新理论认为活塞的延迟恒为3gt，不存在所谓的启动延迟，反倒是中继器、比较器等元件的延迟可以变化。通过对输入信号类别的不同，决定中继器、比较器的元件延迟的不同。

而在这一理论刚刚传入中国时，中国人仍然受启动延迟理论根深蒂固的影响，拒绝接受即时更新理论，甚至认为Sancarn和Selulance提出即使更新理论是落后的表现，企图用启动延迟理论解释即时更新理论中板上钉钉的实验结果。但基于实验的即时更新理论能够完整的表述微观的延迟，而这一点恰恰是启动延迟理论所欠缺的。

由于中国的政策原因，外国人并不知道中国的启动延迟理论，因此他们曾诞生过类似启动延迟理论的理论，创作者是Myren Eario、Sharir1701和NasmNasmus。Sanvarn和Selulance通过实验证明了他们三人的理论是错误的。因此，一些人悲观地认为，启动延迟理论走到了尽头，即时更新理论将会是今后分析电路的唯一工具。

2015年9月，在中国，持不同意见的人对即时更新理论提出不同的看法，但无论启动延迟理论如何，即时更新理论所基于的实验事实足以证明它经受住了实践的考验，是延迟理论的又一个成员。

不过，Sancarn和Selulance在视频中也声明：“使用什么理论真的不重要，只要它管用而且对你来说易于理解”。而即时更新理论中，一些对于漏斗、命令方块等元件的修正，让人不得不怀疑，即时更新理论真的就是延迟规律的真面目吗？历史的经验告诉我们，真正的规律，还隐藏在即时更新理论背后。

### 启动延迟理论的修正

与外国的启动延迟理论不同，中国的启动延迟理论毕竟曾经受住了实践的考验，即使出现了漏洞，其中在漫长的时间下沉淀的精髓也并不是即时更新理论所能抹杀的。而且，在即时更新理论的规则中，人们看到了启动延迟理论的影子——即时更新理论列出了所有可能的信号输入方式，并判断他们是否具有同步性。这正是解决“什么情况下活塞没有启动延迟”的解决方法之一，将即时更新理论的同步性引入启动延迟理论，是一个大胆的假设！

在Gamepiaynmo的红石更新延迟理论下，借助时间轴，我们可以更好地定义游戏刻，启动延迟理论也因此变得更加完善。而且也可以证明，在宏观时序上，旧的启动延迟理论是能够解释延迟现象的。因此，可以将游戏刻作为应用启动延迟理论分析电路时的时间单位。

用现在的话描述，启动延迟理论可以表述为：

活塞拥有2gt的推出延迟。同步性的输入方式（如拉杆、压力板、活塞推方块激活等）会给活塞附加一个1gt的启动延迟，在启动延迟中，活塞不作任何响应，直到1gt启动延迟过去后，活塞才开始推出，非同步的输入方式（如中继器、比较器、活塞瞬推等）则不会附加这一启动延迟，活塞直接开始推出。

## 即时更新理论

### 即时更新理论的诞生

即时更新理论是Sancarn和Selulance提出的基于大量实验结果的理论。hiback搬运了Sancarn和Selulance的六节共2个视频（av2537345和av2547012）。
这种理论认为：电路的实际运行情况很大程度上取决于输入信号的性质，具体说来，是信号上下边沿的同步性。同步的输入信号会使非同步的元件减少1gt的延迟，而不会改变同步元件的延迟；非同步的输入方式则不会改变任何元件的延迟。

非同步的元件有：中继器、比较器、红石火把、命令方块、发射器和投掷器。

同步的元件有：活塞、红石线、玩家、实体。

这一理论体现了一个重要的思想：延迟的计算不仅仅和电路相关、甚至还和输入给电路的输入信号有关。

对于短脉冲，即时更新理论能给出很好的解释，尤其是短脉冲作用于活塞的行为在即时更新理论十分明了。Sancarn和Selulance用于检测脉冲长度的原理，是在1.8版本中，短脉冲瞬推方块对盔甲架这个实体的推动作用。可以说，即时更新理论很好的解决了短脉冲驱动活塞这一困扰启动延迟理论很久的问题。

### 即时更新理论的修正与不足

但即使更新理论也并非是由仅仅一条规则和一些数据组成的。Sancarn和Selulance证明了漏斗被检测是一个同步的输入方式。这一结论对大多数输入方式都成立，但却在少部分上失效了——漏斗的延迟在这些情况下消失了。因此，在分析含有漏斗的电路时，可以将漏斗视为同步的输入方式，但必须考虑这些修正项对漏斗的影响。Sancarn和Selulance还发现，使用命令方块时钟给活塞计时时，得到了与使用理论推测结果不符合的情况。Sancarn和Selulance仍然认为，在更微观的时序中，同步信号和非同步信号有着不仅有着是否减少非同步元件1gt延迟的区别，对元件的激活顺序也会有影响。至少对命令方块，它能改变命令方块间的激活顺序，从而造成了与理论推测不符的情况。因此在分析含有命令方块的电路时，必须加入信号对命令方块激活顺序的修正。此外，即使活塞是一个同步元件，Sancarn和Selulance仍然发现了活塞对两种不同信号后仍然有所区分，这会涉及到更加微观的时序。

从启动延迟理论和即时更新理论看待短脉冲，得到了截然不同的形态，颇有“横看成岭侧成峰，远近高低各不同”的味道。即时更新理论较为注重活塞这一元件，大量的使用了活塞作为研究对象。即使是短脉冲，也要观察短脉冲驱动活塞的结果。这在即时更新理论刚刚被传入中国时，难以被中国人接受的原因之一。

即时更新理论常用的时间单位是游戏刻，但在中国，游戏刻是启动延迟理论分析是所使用的时间单位。为了不引起不必要的误解，可以刻意地将即时更新理论中的游戏刻称为活塞刻。而在之后的统一过程中，可以看到活塞刻也有这它的实际意义。

## 红石更新延迟理论

### 红石更新延迟理论的诞生

启动延迟理论和即时更新理论的种种迹象表明，两者一定是某一机制的不同表现形式，侧重的方面不同使其拥有着截然不同的表述。2015年10月初，Gamepiaynmo在查阅游戏源码后，发表了红石更新延迟理论。

在红石更新延迟理论中，有着一些很重要的重要思想：

1. 从红石电路的意义上来说，并不存在真正的同时。两事件发生，一定有先后顺序。这表明，两电路延迟即使相同，也不可能做到同时，必定有一个谁先谁后的顺序，这种顺序取决于谁先被更新。也就是**对宏观上来说，延迟短的先激活；对微观上来说，先被更新的先激活**。
2. 游戏的内部时间是由自身不断重复的主循环构成的，每一游戏刻历时0.05s，而每一游戏刻内部，则是不同的事项。将所有事项重复一次，便是完成了一次循环，过去了一个游戏刻。正是这种游戏刻的不连续性，造成了启动延迟理论和即时更新理论的表述形态的不同。
3. 由于单个游戏刻内事件严格按照排序来进行，因此在一定程度上能够掌握这种红石更新顺序，这种更新顺序决定了一些特定现象。这也是人们常说的“中继器优先于比较器”的原因。但是有些过于随机的事项，非常容易受到外界变化的影响，乃至于这些事件随地理、游戏版本、Java版本可以是随机的。有可能某一机械在一台计算机上可以运行，在另一台计算机上就会出错，很有可能即使因为涉及到了过于随机的事项。不过即使如此，由于更新顺序相同，这些机械一定是随时间稳定的。
4. 单个游戏刻内的事件严格按照排序来进行，因此如果一些无法用启动延迟理论和即时更新理论解释的现象，却有着十分牢不可破的规律，背后很可能是由更新顺序决定的，由此可以探查这种现象背后的更新顺序。

红石更新延迟理论很好地解释了红石电路中的时序现象，而且达到了比启动延迟理论更精细的精度，甚至可以比较一个游戏刻内的延迟，这种延迟无法用刻来刻画，只能使用先后顺序来描述。

### 红石更新延迟理论的成就

红石更新延迟理论的思想核心就是时间的不连续性，正是这种思想引领着玩家在遇到延迟问题时思考更新时序问题。

红石更新延迟理论也成功解释了一些其他理论所不能解释的现象。

1.8版本中，存在红石中继器链的最后一个中继器无法响应短负脉冲的现象。这说明最后一个中继器和前面所有中继器的地位是不对等的，这个被人难以解释的现象被认为是bug。但在Gamepiaynmo的解释下，这是中继器的优先级不同，使更新顺序不同造成的。

漏斗在Tile Entity事件更新，而一些诡异的现象却无法被启动延迟理论和即时更新理论解释。有着红石更新延迟理论，认定一些可被重复的事必有内部的更新原理。xiaohane2解释了漏斗的更新理论，通过实验证实了这个理论。

可以看到，红石更新理论重在“更新”，这一点在即时更新理论中小有体会，但并没有出现在启动延迟理论中。将更新理论引入延迟理论，正是前二者的优越之处。这也证明了红石原理内部并非相互独立且互不影响，而是相互联系， 相互影响，共同为游戏功能实现而工作的。也正是如此，红石原理才能发展成一个大的复杂但是有序的有机整体。

### 启动延迟理论和即时更新理论的统一

红石更新延迟理论的另一个作用是，在启动延迟理论的大背景下，启动延迟理论和即时更新理论终于得以统一。在时间运行的时间轴上，通过不同事件作为节点，划分刻的概念，游戏刻和活塞刻不过是选取了不同的节点。这样，事件有1游戏刻未必有1活塞刻，有1活塞刻未必有1游戏刻，通过启动延迟理论和即时更新理论计算得到的结果在数值上不尽相同也就显得不足为怪了。

启动延迟理论将中继器、比较器延迟看做是不变的，是由于游戏刻节点的选取位于更新中继器和比较器的Next Tick Entry事件，那么自然大部分事件更新中继器时必然要跨过这个游戏刻节点，这就使得在大部分情况下中继器和比较器的延迟被发现是定值；而活塞的延迟是可变的，这是由于如果输入信号在Next Tick Entry事件和更新活塞的Block Event事件之间，活塞就会按2gt的延迟推出，如果在这一游戏刻的Block Event事件和下一游戏刻的Next Tick Entry事件之间，更新这一活塞就必须等到下一游戏刻的Block Event事件，活塞就被附加启动延迟了。

即使更新理论将活塞的延迟看作是不变的，是由于活塞刻节点的选取位于更新活塞的Block Event事件，那么大部分事件更新活塞时必然要跨过活塞刻节点，活塞的延迟就总为3pt，同理可以得到中继器和比较器的延迟可以变化的原因。

即使更新理论对漏斗的修正，是因为漏斗会在Tile Entity事件更新，如果将这一事件加入到时间轴上，一个游戏刻就被划分为三段，很自然地，如果不对一个事件在一个活塞刻中是在Tile Entity事件前还是之后更新进行修正，自然会得到错误的结论。玩家输入信号和实体输入信号是在不同位置更新的，且恰分立Tile Entity事件的两边，因此可以用漏斗对这两者进行区分。

1. ↑ 【红石】无延时电路元件的原理以及实现 —— defanive2
2. ↑ 【解说向，第二发】红石原理 —— 凤合草酸泥煤
3. ↑ 关于活塞延时的分析与探讨 —— 彭哥·一世
4. ↑ 【元件库】精密时序比较器——关于时序精密描述的实现 —— 正正正正正好
5. ↑ [理论分析] 红石更新延迟理论 —— Gamepiaynmo
6. ↑ 关于1.8中中继器组bug的源码解释 —— Gamepiaynmo
7. ↑ 【理论分析】漏斗中的时序现象 —— xiaohane2