深度剖析Minecraft #0 緒論

前往?TIS?論壇獲得更好的markdown瀏覽體驗(yàn):
https://forum.tis.world/topic/269/深度剖析minecraft-0-緒論
0. 緒論
0.1 owo
嘛,填這個(gè)巨坑的目的,是想對(duì)啃了一段時(shí)間的源碼做一些總結(jié),并給出一些對(duì)現(xiàn)象的解釋,如果可能的話還會(huì)給出一些易于分析的模型
前人的理論雖已挺完善,已經(jīng)有了不少的分析文章,但他們或多或少的都存在一些無(wú)法解釋的現(xiàn)象,或者說(shuō)以為版本迭代而過(guò)時(shí)
強(qiáng)推 gp(Gamepiaynmo)的文章《[理論分析]紅石更新延遲理論》https://tieba.baidu.com/p/4078230299,雖然這個(gè)是 1.8 的,但絕大部分內(nèi)容在 1.13.2 仍實(shí)用
我的目標(biāo)是,造出不需要打補(bǔ)丁的大統(tǒng)一理論在不打補(bǔ)丁的情況下解釋出所有平常只會(huì)用一句“特性” / “毒性”帶過(guò)的表現(xiàn),以及所有“黑科技”的原理。因此可ken能ding會(huì)很咕

隨緣更新,催更無(wú)用
0.2 前置技能
對(duì)于代碼分析部分,你需要一定的 java 代碼的閱讀能力
對(duì)于理論模型部分,你可能需要掌握一些簡(jiǎn)單的算法與數(shù)據(jù)結(jié)構(gòu)的知識(shí)
對(duì)于實(shí)用模型部分,只要你足夠了解紅石,都沒(méi)問(wèn)題
0.3 代碼來(lái)源
本文若無(wú)特殊說(shuō)明,Minecraft 游戲版本為 Minecraft Java Edition 1.13.2,代碼來(lái)源為 gnenbom 的 1.13.2 的?carpet mod?內(nèi)的?projects/clean/src/
?部分。如有能力可自行按照 readme 構(gòu)建源碼
https://github.com/gnembon/carpetmod
直接公開(kāi) Minecraft 的代碼是不合法的行為,別私聊找我要了
0.4 一些名詞的定義
[元件] 的 [事件] 在 [階段] 發(fā)生
TILE TICK
TileTick 指的是各類具有延遲的紅石元件,如中繼器、紅石火把運(yùn)算的階段,在代碼層面指的是?ServerTickList.tick()
?[注1]中執(zhí)行的內(nèi)容
在 gp 的文章《[理論分析]紅石更新延遲理論》里, gp 將此階段命名為 NextTickEntry ,縮寫(xiě)為 NTE 。
為了與國(guó)外社區(qū)的游戲階段名詞接軌,在本文中此階段一律用 TileTick 表示
TILE ENTITY
TileEntity,簡(jiǎn)稱 TE ,指的是游戲內(nèi)有特殊功能的方塊上,附加的實(shí)體,這一類的方塊有熔爐、漏斗、移動(dòng)中的方塊、末地折躍門(mén)等方塊,而在正常游戲中這些方塊均會(huì)帶有一個(gè) Tile Entity 來(lái)運(yùn)算實(shí)現(xiàn)它們的特殊功能
在官方的反混淆中,TileEntity 被稱為 BlockEntity ,這也恰好對(duì)應(yīng)著它的中文翻譯:方塊實(shí)體。不過(guò),為了與前人所述銜接,在本文中仍用 TileEntity 一稱
BLOCK 36
Block 36,簡(jiǎn)稱 b36,指移動(dòng)中的方塊,也即?BlockPistonMoving
?這一個(gè)類所描述的方塊,亦或是游戲內(nèi)稱作?moving_piston
?的方塊。其中 36 指的是方塊 id 扁平化前的該方塊的 id,也算是沿用慣用用法。
在本文的分析中,b36 有時(shí)也可指 b36 TileEntity ,需根據(jù)文意進(jìn)行具體分析
階段、元件、容器
以方塊實(shí)體(Tile Entity)為例。與方塊實(shí)體相關(guān),可指代的對(duì)象有:
一個(gè)方塊實(shí)體本身
方塊實(shí)體運(yùn)算階段
存放方塊實(shí)體容器
如果在用簡(jiǎn)稱 TE 來(lái)描述它們時(shí),僅用 TE 一詞明顯會(huì)有歧義出現(xiàn)。因此,在使用簡(jiǎn)稱描述時(shí),如有需要,以上幾個(gè)對(duì)象分別對(duì)應(yīng):
TE 元件(TE 方塊、TE 實(shí)體)
TE 階段
TE 容器(TE 隊(duì)列、TE 表)
[注1]?net/minecraft/world/ServerTickList.java:46