深度剖析Minecraft #0 绪论

0 绪论

0.1 owo

嘛,填这个巨坑的目的,是想对啃了一段时间的源码做一些总结,并给出一些对现象的解释,如果可能的话还会给出一些易于分析的模型

前人的理论虽已挺完善,已经有了不少的分析文章,但他们或多或少的都存在一些无法解释的现象,或者说以为版本迭代而过时

强推 gp(Gamepiaynmo)的文章《[理论分析]红石更新延迟理论》,虽然这个是 1.8 的,但绝大部分内容在 1.13.2 仍适用

我的目标是,造出不需要打补丁的大统一理论在不打补丁的情况下解释出所有平常只会用一句“特性” / “毒性”带过的表现,以及所有“黑科技”的原理。因此可ken能ding会很咕

请善用文档导航XD

0.2 前置技能

  • 对于代码分析部分,你需要一定的 java 代码的阅读能力
  • 对于理论模型部分,你可能需要掌握一些简单的算法与数据结构的知识
  • 对于实用模型部分,只要你足够了解红石,都没问题

0.3 代码来源

本文若无特殊说明,Minecraft 游戏版本为 Minecraft Java Edition 1.13.2,代码来源为 gnenbom 的 1.13.2 的 carpet mod 内的 projects/clean/src/ 部分。如有能力可自行按照 readme 构建源码

0.4 一些名词的定义

[元件] 的 [事件] 在 [阶段] 发生

Tile Tick

TileTick 指的是各类具有延迟的红石元件,如中继器、红石火把运算的阶段,在代码层面指的是 ServerTickList.tick() [1]中执行的内容

在 gp 的文章《[理论分析]红石更新延迟理论》里,gp 将此阶段命名为 NextTickEntry ,缩写为 NTE 。

为了与国外社区的游戏阶段名词接轨,在本文中此阶段一律用 TileTick 表示

Tile Entity

TileEntity,简称 TE ,指的是游戏内有特殊功能的方块上,附加的实体,这一类的方块有熔炉、漏斗、移动中的方块、末地折跃门等方块,而在正常游戏中这些方块均会带有一个 Tile Entity 来运算实现它们的特殊功能

在官方的反混淆中,TileEntity 被称为 BlockEntity ,这也恰好对应着它的中文翻译:方块实体。不过,为了与前人所述衔接,在本文中仍用 TileEntity 一称

Block 36

Block 36,简称 b36,指移动中的方块,也即 BlockPistonMoving 这一个类所描述的方块,亦或是游戏内称作 moving_piston 的方块。其中 36 指的是方块 id 扁平化前的该方块的 id,也算是沿用惯用用法。

在本文的分析中,b36 有时也可指 b36 TileEntity ,需根据文意进行具体分析

阶段、元件、容器

以方块实体(Tile Entity)为例。与方块实体相关,可指代的对象有:

  • 一个方块实体本身
  • 方块实体运算阶段
  • 存放方块实体容器

如果在用简称 TE 来描述它们时,仅用 TE 一词明显会有歧义出现。因此,在使用简称描述时,如有需要,以上几个对象分别对应:

  • TE 元件(TE 方块、TE 实体)
  • TE 阶段
  • TE 容器(TE 队列、TE 表)

banner


  1. net/minecraft/world/ServerTickList.java:46 ↩︎