基础部分
进阶部分
一般情况下,方块总是以先 NC 更新、后 PP 更新的顺序发出更新。要深入理解更新理论,必须清楚一个概念:更新不是一个单一的事件,而是一段 “过程”。
示意图如下:
例如,当方块 A 发出 NC 更新后,更新到方块 B,此时 B 改变状态,又发出 NC 更新。更新过程如下:
一般讨论的NC 更新顺序指的是发出 NC 更新的先后次序,PP 更新顺序同理,也是发出 PP 更新的顺序。从上文中的示意和例子我们可以看出,在较为复杂的更新中,PP 更新顺序也可以近似认为是方块 NC 更新过程结束的先后次序。
我们将通过一些生动形象的简单例子,让你循序渐进地理解更新这一复杂过程是如何发生的。
例如下面这串 bud 铁轨为例,更新其中的 A1 会怎样发生什么样的事情呢
想要理解更新,我们就需要先抛开更新不谈
想象一下,你是一个强迫症,此时此刻你正拿着许多火把在一个矿洞。
由于你是强迫症,你将完全遵循以下规则:
按照上面的规则,我们来看一下下面这个矿洞你会如何探索
这个探索矿洞的过程就是更新的过程,其中“插火把”是发出 NC 更新(入栈),收火把是发出 PP 更新(出栈)。至于这个 “栈” 是什么意思,你可以参阅附录 - 专有名词解释→栈与调用栈,而这种更新方法就是深度优先搜索(DFS)
推荐搭配 BiliBili-tanh_Heng:NC 更新 × 深度优先搜索.exe 食用
让我们用一种更加形象的方式理解例子中的更新过程。我们可以将 NC 更新的入栈看作 “逐步深入”,NC 更新的出栈,也就是 PP 更新看作 “逐步返回”。那么,让我们将上文中的图画得更加形象一些,并且再多加入一些节点:
图中为 A1 发出更新后的更新链。上方为北侧。
从图中就能够很好地看出:
NC 更新顺序:A1->B1->C1->D1->C2->B3->C3->B4
PP 更新顺序:D1->C1->C2->B1->C3->B3->B4->A1
将更新行为想象为一个点,这个点从 A1 出发,按照一定的更新顺序移动,并且 “不撞南墙不回头”。那么,这个点的移动路径就构成了图示的箭头。逐步深入的过程就是入栈或 NC 更新,“回头” 的过程就是出栈或 PP 更新。
需要注意的是,这里的分析将 PP 更新简化了。因为通常情况下,PP 更新并不会导致连续的方块更新1。要分析 PP 更新,方法和 NC 更新是类似的,从栈的角度分析即可。
让我们以一个实例来尝试分析更新顺序
已知铁轨在状态改变时,先发出 NC 更新,后发出 PP 更新。图中是一串处于 BUD 状态的铁轨链,1-5 铁轨位于东西走向。问:音符盒按下后,铁轨熄灭的 NC 更新和 PP 更新顺序分别是?
当音符盒按下后,发出 NC 更新。毗邻的 1 号铁轨受到 NC 更新,改变自身状态,发出 NC 更新,更新到 2 号、再到 3 和 4。在 4 号铁轨处,4 号铁轨先对东西侧的 5 号铁轨更新。5 号铁轨受到更新后改变自身状态,发出 NC 更新,不再有后续 NC 更新,于是 5 号铁轨此时发出 PP 更新。退回到 4 号铁轨,4 号铁轨再更新南北侧 6、7 号铁轨。深入到 6 号铁轨,6 号铁轨发出 NC 更新;再深入到 7 号铁轨,7 号铁轨发出 NC 更新。7 号铁轨更新结束,发出 PP 更新。退回到 6 号铁轨,6 号铁轨发出 PP 更新。退回到 4 号铁轨,4 号铁轨发出 PP 更新。再退回到 3、2、1 号铁轨,3、2、1 号铁轨发出 PP 更新。
所以,
NC 更新顺序为:
PP 更新顺序为:
此部分并不常用,读者可选择性跳过。
图中铁轨链方向如标注所示,铁轨链为南北向。我们以最北端的铁轨为例分析其不同方向的 NC 更新顺序。
NC 更新按照西东下上北南的方向顺序发出。当最北侧铁轨熄灭时,它先发出西侧、东侧更新,无事发生;再发出下侧、上侧更新,无事发生;然后发出北侧更新,无事发生;最后发出南侧更新,更新到南侧铁轨,后续更新即可按上文中的方法分析。
假如我们在该铁轨北侧制作一个 BUD 装置,那么这个 BUD 装置会先被更新,然后南侧铁轨再进行连续的 NC 更新。
而如果我们考虑对六个方向的 NC 更新中,对上侧方块的 NC 更新的顺序,那么它就是自北向南,即由近到远。
让我们再考虑到 2.3.1 中的例子
音符盒为 1-5 铁轨链的最西侧,仅考虑 1-5 铁轨链的 NC 更新。
当音符盒按下后,1 号铁轨受到更新而熄灭,先发出西侧更新,无事发生;再发出东侧更新,更新到 2 号铁轨,2 号铁轨开始更新…… 等到 2、3、4…… 铁轨更新结束后,1 号铁轨的东侧 NC 更新完成,1 号铁轨继续更新下侧、上侧、北侧、南侧。
此时如果我们考虑对上侧方块的 NC 更新的顺序,它就变成了 5、4、3、2、1,也就是由远到近。
那么读者可能就会想问:既然 NC 更新的顺序还要考虑方向性,我们学习 2.3.3 的发出 NC 更新顺序又有什么用呢?
用处有二:
上文中的第二个例子我们并没有考虑 6、7 号铁轨。读者可尝试分析考虑 6、7 号铁轨时,整个 BUD 铁轨链对对上侧方块的 NC 更新的顺序。
答案:
墙、栅栏等元件在受到 PP 更新后改变状态,并发出 PP 更新,这类方块可能会触发由 PP 更新导致的连续的方块更新。但这不在通常需要分析的情况内。 ↩