
本文作为方向性位置性系列专栏的前置知识,为后续每个结构的具体分析做铺垫(如果每讲一个结构都要讲一遍就太麻烦了)本文主要是涉及红石方向性/位置性的核心成因和瞬时与dfs.对于两个交叉地狱门的点燃,矿车侧向冲入一条轨道后的移动方向这类问题不做讨论.
需要的前置知识:
1.基本了解红石元件用法
2.知晓更新机制
方向性的根源很简单,基本就是更新的方向性.
NC更新(方块更新)的顺序为:西东下上北南,NC更新不带有方向标签
PP更新(状态更新)的顺序为:西东北南下上, PP更新带有方向标签
PP更新通常围绕发出的更新方块,以该方块为中心向周围6格发出.顺序遵从西东北南下上。例如侦测器的工作条件就是受到方向与输出方向相同的PP更新.也有部分方块无视方向,受到PP更新就准备工作,例如浮空沙.
NC更新通常围绕NC更新核,NC更新核有两种.
1.一种是不更新更新核所在格,更新周围6格方块,例如红石粉/红石火把的7个更新核都是如此.顺序遵从西东下上北南
2.一种是不更新方块所在格,更新更新核所在格以及周围5格,例如侦测器/比较器/中继器等的NC更新核.顺序遵从更新核本格西东下上北南
位置性的成因一般有两种,一种是因为红石粉,而另一种是因为活塞.后者极其少见.
红石粉具有7个更新核,本体一个,周围6个.但这7个更新核的顺序是位置性随机的.
每个更新核之间的执行顺序由哈希算法决定,将每个更新核的XYZ坐标输入哈希算法(粉的7个更新核的bucketIndex = ([(y + z 31) 31 + x ]^([(y + z 31) 31 + x)>>16])&15.这会得到一个0~15的数字.遍历他们时,bucketIndex从小到大被遍历.如果bucketIndex相同,先添加的先被遍历(下上北南西东)---ryan 100c).
由此推出更新核的执行顺序.每个更新核自身的1阶毗邻更新顺序还是按照NC更新方向顺序(西>东>下>上>北>南)执行.没看懂没关系,只需要知道红石粉的更新顺序是位置性近似随机的就行了(并不是完完全全随机,因为算法问题,更新顺序是有某种规律的.想要了解红石粉可见tanh的专栏红石粉更新研究报告【MC刨根问底#1】 - 哔哩哔哩).
在分析时,如果两个受更新方块都只被红石粉的一个更新核更新,那最多就是方向性.
先看看活塞的工作
创建推动列表
摧毁方块(摧毁一推即掉推掉的方块,如树叶/甘蔗/花)
按推动列表创建B36方块(可以看做是为未来方块到位占位的方块)这个过程每创建一个B36会覆盖原位置的方块并且会逐个发出PP更新(状态更新)
删除方块,上一步会把一部分原方块替换为B36,但也还有剩余的原方块,这步是为了删除剩余的原方块.全部删除完成后按顺序发出PP更新(这步删除顺序是位置性随机的)
发出更新,原方块位置按推动顺序发出NC更新(方块更新)
活塞本体状态改变,发出NC更新和PP更新
在第4步,删除方块是位置性随机的
(对于移动方块后留下的“空位”,以位置的哈希码大小排序从小到大将它们设置为空气,此过程不产生NC更新和PP更新。设置完成后,再按照这个顺序遍历一次这些方块产生PP更新。其中,位置的哈希码计算公式为x+31y+961z,取最后32位有符号整数作为这个位置的哈希码。---minecraft WIKI)
Lintex的60w8GT大云杉树场就是因为活塞产生的位置性,后修复.因为活塞产生的位置性实际上相当少见,因为它要求比较高.
如果仅仅是一个元件的方向性分析就非常简单,但如果经过瞬时元件就会变得复杂.
因为瞬时元件有很特殊的特性.它们没有延迟,一旦需要工作就会直接工作.更新也是瞬时的.更新会被放到栈里执行,如果多个瞬时元件相互影响,那就会产生类似DFS(深度优先搜索)的效果.
这一定程度上涉及到微时序,不过不懂微时序没关系,并不深入.
在MC里最小的时间单位-1Game Tick(简称1GT)里,划分了许许多多的阶段,我们称为微时序阶段,主要的阶段有(按顺序)
WTU(世界时间更新)
NTE/TT(计划刻)
CT(区块刻)
BE(方块事件)
EU(实体)
TE(方块实体)
NU/AT(玩家操作/异步处理)
在游戏里部分工作只能在特定的阶段里执行,例如活塞开始推出只能在BE阶段,红石火把亮起只能在NTE/TT阶段,玩家放置/挖掘方块只能在NU/AT阶段.这就产生了许许多多的限制。但是有一些操作是无视微时序阶段的,无论处于什么阶段,这些操作只要被触发就会执行.例如:
1.大部分附着类方块失去附着掉落
2.红石粉/铁轨/音符盒等瞬时元件工作等
这些操作无视微时序阶段.非常自由,正因为它们很自由所以是我们控制微时序主要利用的工具之一。如果想要了解微时序可以观看视频TIS_TrinityUnion发布的[从活塞到游戏机制] 01-游戏刻与微时序(目前为止最好的微时序入门视频
)
常见的瞬时元件有:
1.红石粉
2.音符盒
3.铁轨
4.TNT等
一个瞬时元件要求它的主要工作是瞬时的,例如音符盒的改变状态与发出更新瞬时的,但它发出声音却被限定在BE阶段.我们称音符盒是瞬时元件而不是方块事件元件,因为音符盒对我们而言它的主要工作是改变状态后更新而非发出声音。
活塞的主要工作在BE阶段,所以我们称它为方块事件元件。
红石火把失去附着掉落也是瞬时的,但它的主要工作是改变亮灭状态,这个行为被限定在NTE/TT阶段执行.它的主要工作不是掉落,所以红石火把是计划刻元件
栈是个数据结构,其特点是先进后出,后进先出.也就是最后添加的任务最先执行,最先添加的任务最后执行.
没听懂的话举个例子:
你先后将语文试卷、数学试卷、英语试卷放到了桌面上,按顺序英语试卷在最上方,开始写英语试卷.英语试卷写完后又被递来一张生物试卷.这时候生物试卷在最上方,所以开始写生物试卷.写完后按顺序再写数学/语文试卷.
总结执行顺序 英语-生物-数学-语文。虽然语文是最早拿出来(即最早添加)的,但它是最晚执行的,这就是先进后出,后进先出.
在瞬时里同样如此,每个更新都是一张试卷,按顺序放入栈内,依次执行。如果一次更新触发了新的更新,新的更新会压在它们上面,从新的更新开始向下执行。新的更新执行完了再执行旧更新.
DFS中文名为深度优先搜索,是一种算法.读者可以自行搜索DFS的走迷宫动画演示观看.
因为瞬时与栈,多个瞬时工作的表现就是DFS.下面是bud铁轨的熄灭工作动画:

这就是DFS算法的表现,分析前几个铁轨
1.首先,敲击音符盒,一共NC+PP12个更新压入栈内,向上出栈,顺序是
音符盒向西NC
音符盒向东NC
音符盒向下NC
音符盒向上NC
音符盒向北NC
音符盒向南NC 为了方便,上面这部分后面会简称为音符盒的一系列NC更新
音符盒向西PP
音符盒向东PP
音符盒向北PP
音符盒向南PP
音符盒向下PP
音符盒向上PP 为了方便,上面这部分后面会简称为音符盒的一系列PP更新
2.音符盒开始依次执行(向西NC、向东NC、向下NC、向上NC、向北NC)向北NC触发了1铁轨的熄灭,1铁轨的更新压入栈,此时的栈内是(铁轨有两个更新核,有一个在本体,一个在本体下一格,为了方便分析不计下方更新核)
1铁轨向西NC
1铁轨向东NC
1铁轨向下NC
1铁轨向上NC
1铁轨向北NC
1铁轨向南NC 为了方便,上面这部分后面会简称为铁轨的一系列NC更新
1铁轨向西PP
1铁轨向东PP
1铁轨向北PP
1铁轨向南PP
1铁轨向下PP
1铁轨向上PP 为了方便,上面这部分后面会简称为铁轨的一系列PP更新
音符盒的一系列NC更新(南)
音符盒的一系列PP更新(西、东、北、南、下、上)
3.1铁轨开始依次执行(向西NC、向东NC、向下NC、向上NC、向北NC)向北NC触发了2铁轨的熄灭,2铁轨的更新压入栈。以此类推再熄灭4个铁轨会到最下面的侦测器面前,此时栈内应该是
4铁轨的一系列NC更新(西、东、下、上、北、南)
4铁轨的一系列PP更新(西、东、北、南、下、上)
3铁轨的一系列NC更新(下、上、北、南)
3铁轨的一系列PP更新(西、东、北、南、下、上)
2铁轨的一系列NC更新(下、上、北、南)
2铁轨的一系列PP更新(西、东、北、南、下、上)
1铁轨的一系列NC更新(南)
1铁轨的一系列PP更新(西、东、北、南、下、上)
音符盒的一系列NC更新(南)
音符盒的一系列PP更新(西、东、北、南、下、上)
4.再依次执行,4铁轨的一系列NC更新执行完成,执行4铁轨向东PP更新时侦测器添加计划刻准备工作.
一直从上到下执行到2铁轨向北更新,再触发2铁轨右边的5铁轨工作。一直这样工作直到最后的铁轨熄灭,所有更新依次执行(音符盒的更新是最后发出完成的)
如果认为自己完全理解了DFS这段的工作,那么就试试自己推测这几个侦测器的工作顺序吧。答案是白红紫蓝。需要注意的是例子这里的侦测器都位于分叉末端,在铁轨更新递归回去时一定会PP更新侦测器才到其他的铁轨工作。如果侦测器不在分叉末端,那侦测器不一定会在前方铁轨熄灭后就添加计划刻准备工作,一定要等到前方铁轨发出PP更新才可以。
本文没有直接讲实际结构里的位置性,因为本文是一个前置,它可以很好的帮助你们理解我的其他方向性位置性专栏,我也不用在其他专栏再讲一遍这些知识
.如果有发现错误欢迎指出,有不理解的地方欢迎提问.