看起来同步,实际上..作为一个程序,所有的代码运行都有先后次序。你可以要求程序同时计算1+2和2+3,程序会同时告诉你结果,但在中间你所看不到的步骤,这两个加法一定有一个是先执行的。
在mc的世界里,亦然。
在接受了上面描述过的main loop(主循环)也就是tick的运行机理之后,你会明白为什么你对游戏的影响看起来是在同一个1/20s上发生的;但同时你也要明白,这些看似同时发生的事情,实际上也有着自己的先后次序。
假设一个红石块的放置的位置能激活两个cb,这两个cb对命令的执行也存在先后次序。想想看1.8时代的fill高频,就是通过这两个cb之间的执行次序防止红石块反复激活cb,来实现高频激活整个系统的。
判断操作的执行顺序本身就是一门学问。这里有一个基于源码的更新顺序介绍帖子:
http://tieba.baidu.com/p/4126971513,如果能看懂的话你会觉得发现了新大陆..很多以前觉得特别特性的东西都能通过这套更新理论得到解答:比如为什么rcb被命令关闭后还会产生一次输出?因为这个时候他已经默默把自己加入到NTE了..果然是work as intended..
通过这套理论解释1.9以后的cb执行顺序是很便捷的,因为实际执行次序就是被加入NTE的次序。但是显然这么说并不好理解..所以这里给出一个更便于理解的解释:
[
每条cb链的开头方块都会试图将其后满足激活条件的ccb依次执行。cb链间的执行次序由开头cb的执行次序决定,cb链内的次序由cb链次序决定。rcb执行次序取决于最后一次激活的次序(跨tick,每次更新激活状态均会影响这个次序);icb执行次序取决于tick内激活次序。每次重进游戏会重新加载区块,此时rcb执行次序将无视之前次序,新次序为区块加载次序。]
tick内激活次序,就像之前已经提到过了的1.8时代fill高频的模式一样。红石块对周围cb的激活次序是不同的——严格地遵循xyz从小到大的次序,即先比较x值大小并由小到大执行;x值相等时比较y值;y值相等时比较z值。例如在(3,3,3)处放置一个红石块,(2,3,3)处的cb将在(3,2,3)处的cb之前执行。
除cb执行顺序和操作更新顺序之外,很多依旧是看着“这肯定是同时执行的东西”之间之间同样有着自己的一套次序,甚至实际上这些次序被提及的次数并不比cb间执行顺序少..
比如fill里方块的放置也是按照xyz小到大的次序来放置方块;
比如execute嵌套里不同层次execute对对象检索的递归关系;
比如实体选择器是先选择后执行,还是变执行边选下一个目标...
玩家们几乎就是在不断的试错之下逐渐拨清迷雾理顺关系,唔,或是翻源码..
我自己也很难整理出一张明确的表单来描述所有的时序关系,cb目前的时序还算简单明了,但这些基于游戏本身设定的时序设定只能靠多尝试,多积累。不管如何,当自己的系统发生故障时,不妨问问自己,是不是时序出问题了?