重新认识方块更新
在MinecraftWiki以及各种TMC视频,社群间的口头描述中,为了便于直观理解“方块更新”,我们将更新行为描述为从某个“核心”向外“传播、发出”。 这种描述的确易于上手,却容易造成误解。本文将详细明确 PP 更新与 NC 更新相关的可能误区。
”传播”的本质
我们最常用来形容方块更新的方式是“从更新核开始传播”,除此之外,“PP 更新载有朝向”,“NC 更新持有来源方块的类型” 等说法也会经常出现。在这里需要注意的是,这种描述容易构建错误的理解。
当一个方块发出更新时,它就变成了一个“源头”,向周围的网格“发射”出某种“更新”的实例,这些实例载有 “朝向,来源” 等信息,击中周围的其他方块时更新它们。 然而,在游戏中,并不存在任何一种叫做“更新”的实在空间中游走。
所谓方块更新的传播,其本质是一连串方法调用。 当坐标 A 的方块发生改变时,它所触发的并不是“某种更新实例的散播”,而是相关管理类(常被简化描述为'系统') 主动抓取了坐标 A 周围邻居的引用,并直接调用了这些邻居方块的对应的方块更新方法。
所谓的“传播”,不过是这一系列方法调用在时间和空间顺序上的递进表现。在使用“传播”描述更新前,一定要理解这一点。
PP 与 NC 更新的区别
前文的描述里将PP, NC 更新统称为“方块更新”。但实际上,两种更新的逻辑是有区别的,它们承载着完全不同的设计职责。
1. PP 更新的逻辑
PP 更新本质上是一次“向目标方块请求适当的 BlockState(方块状态) 并覆盖放置”的过程。
它是一种询问:当方块 A 改变时,“世界”对它周围的邻居挨个提问:“你的邻居现在状态变成 A 了。基于这个新状态,你觉得你现在应该变成什么样?”
随后,接到PP 更新的方块进行计算,最终返回一个新的 方块状态。世界拿到这个新状态后,如果新状态和旧状态不同,就将新状态覆盖放置到原位置。
2. NC 更新的逻辑
与 PP 更新的“形态问询”不同,NC 更新是纯粹的“消息通知”。
当方块 A 发生改变,“世界”找到邻居方块,它不关心它的外形,也不向其要任何返回值。
“你的邻居 A 变了,把这个事实告诉你。至于你要做什么,你自己看着办。”
“世界”不对此后的任何行为主动负责,接下来的处理全部由方块自己决定。
更新核
我們常说更新有一个“更新核”,有一阶更新核,二阶更新核,等等。 这里容易造成的误解不少。
更新核的类型
我们把“按照 西、东、下、上、北、南 依次向周围发出的一组更新”称为“一阶更新核”
但更新核并非游戏中的实体概念,它只是我们在面对“多次更新调用的共同坐标邻居”时,为了简化语言而发明的一种标记
实际上,如果我们从“方法调用”的视角审视,会发现 NC 更新 与 PP 更新 的调用花样繁多。
NC更新有:
- 单格 NC 更新 (仅对单个方块调用更新方法)
- 比较器 更新 (围绕一个中心坐标,向其 水平方向的,1-2格内符合条件的比较器调用更新方法)
- 五向 NC 更新 (围绕一个更新核对其周围,某个方向以外的方块调用更新方法)
- 一阶 NC 更新 (围绕一个更新核对其周围方块调用更新方法)
- 二阶 NC 更新 (围绕一个“二阶更新核”发出“六向 NC 更新”)
PP更新有:
- 单格 PP 更新 (仅对单个方块调用更新方法)
- 一阶 PP 更新 (围绕一个更新核对其周围方块调用更新方法)
- 二阶 PP 更新 (围绕一个中心坐标,对二阶毗邻位置的红石粉调用更新方法)
可见,方块更新并不是与“更新核”这个概念绑定的。
