Chunk Format

https://wiki.vg/Chunk_Format

概念

区块柱与区块段

你可能之前听说过“区块”这个术语。我的世界使用区块来存储和传输一个世界的数据。然而,实际上,在不同的语境下,这里有两个不同概念的区块:区块柱和区块段。

一个区块柱是16×256×16个方块的集合,这个是玩家在谈到区块这个术语时最先想到的。然而,它并不是游戏中最小的数据储存单元;一个区块柱实际上由16个区块部分垂直排列而成。

区块柱储存生物、方块实体、实体、滴答数据和区块部分数组。

一个区块段是16×16×16个方块的集合(区块段是一个立方体)。这是真正储存方块的地方,很多时候,Mojang通过“区块”这个词来代表它。将柱分成段并没有什么帮助,除非你并不想发送所有在区块柱中的区块段,如果段是空的,它就没必要被发送(下面会讲到)。

区块段储存着方块和光线数据(包括方块光照和天空光照)。另外它还和段调色盘有着密切的联系。一个区块段最多可以容纳4096(16×16×16,也就是2的12次方)个不同id的方块(通常情况下这样的段不会出现)。

区块柱和区块段只有当区块边界渲染激活时,才被显示(F3+G)。区块柱边界通过红色的垂直线指示,而区块段边界由蓝色线指示。

空段和主位掩码

上面提到,区块段可以是空的。储存没有用的数据的段将被当作空的段,它不会被发送到客户端,客户端能够推断出这些内容。平均来讲,这意味着一个世界中,百分之60的世界数据将不需要被发送,因为它们都是空气,这是很大一块节省。

值得注意的是,一个完全由空段组成的区块和一个空的区块住是不同的。当一个在空段中的方块改变时,这个段就被创建(当作全是空气),方块将被设定在这个空段中。当一个空区块中的方块改变时,它的动作是未定义的(但是通常来说,没事发生)。

主位掩码简单地决定哪一个段将被发送。最小的有意义位数是最低的段(y=0到y=15),只有16比特才能赋值给它(第16位控制着y=240到255的段);对于Notchian客户端来说,高于255的段将是无效的。为了检查一个段是否被包含,可以使用((mask & (1 << sectionY)) != 0)

全局与段调色板

我的世界还使用调色板。一个调色板将数字id映射到方块状态上。这个概念通常被用在带颜色的图像上;维基百科上的 color look-up tables, indexed colors, 和 palettes in general 词条或许对理解它会有一定的帮助。

游戏中使用的调色板有两种:全局调色板和段调色板。

全局调色板是id到方块状态的标准映射。方块状态id是根据分配顺序以线性方式创建的。一个方块状态id分配到每一个不同的方块状态或者方块;如果一个方块有多种属性,则分配的状态数是每个属性的值的乘积。注意全局调色板当前由每个条目14bit所表示。如果在全局调色板里找不到某个方块,那它就会被当成空气。数据生成系统可以被用来生成一个当前全局调色板的值的列表。

不要以为全局调色板都是这样的;将其保留在单独的功能中。作为flattening的一部分它的形式在1.13发生了改变,或许在不远的将来会有更深入的改变(虽然可能性不太大),现在1.13已经被制作完成了,同样的,不用对调色板的总尺寸进行硬编码,保持其不变。

段调色板通常被用于将方块id映射到全局id。

Notchain:The “Notchian” server is the server authored by Notch and distributed by Mojang as a companion to the Mojang-sponsored client.

最后更新于