区块(Chunk)是Minecraft世界里一个大小为16×16的区域。
生成[]
区块宽16格,长16格,内部包含许多方块。在主世界中,区块高384格;在下界和末地中,区块高256格。当新建世界时会在出生点附近生成区块,在Java版中,世界中最初会生成43×43个区块,其过程显示在世界加载屏幕。随着玩家对世界的探索,相邻的区块也会被生成。
区块是通过种子进行生成的,这意味着在相同的版本下,使用相同的种子,生成的区块也会基本相同。
区块加载[]
由于一个世界极大并且包含极多区块,因此游戏仅加载部分区块以使游戏可玩,游戏不会运算已卸载的区块。
Java版[]
- 加载等级
加载等级用于决定了这个区块是否能被加载和区块生成的程度,取决于渲染距离。加载等级的范围是0-45,加载等级大于44的区块会被立刻卸载。
加载等级可以分为以下有四种加载等级类型:
类型 | 等级 | 属性 |
---|---|---|
实体计算(Entity Ticking) | ≤31 | 实体、方块实体和计划刻可能被计算,方块修改可以被追踪。 |
方块计算(Block Ticking) | 32 | 实体不可以被计算,但可能被追踪,方块实体和计划刻可能被计算,方块修改可以被追踪。 |
完全加载(Full) | 33 | 实体不可以被计算,但可能被追踪,方块实体和计划刻不可以被计算,方块修改不可以被追踪。 |
不可访问(Inaccessible) | ≥34 | 实体和方块修改都不可以被追踪,方块实体和计划刻不可以被计算,但世界生成会在这些区块中运行。 |
不可访问的区块根据加载等级决定本区块应该进行生成到什么程度。如果当前区块生成已经到达或超过了加载等级对应的生成程度,则不进行继续生成。
等级 | 区块状态 |
---|---|
34 | 初始化光照计算(Initialize Light) |
35 | 地形雕刻(Carvers) |
36 | 填充生物群系(Biomes) |
37-44 | 生成结构范围(Structure Starts) |
- 计算等级
类似于加载等级,计算等级决定了这个区块应该计算什么内容,取决于模拟距离,它的范围是0-33。
计算等级和加载等级一起决定了区块能否计算实体和方块等内容。如果一个区块加载等级为实体计算加载等级(小于等于31)且计算等级也小于等于31,则区块内的实体、方块实体和计划刻每游戏刻都进行各种计算,这种类型的区块通常被称为强加载区块(Entity Processing Chunk);如果一个区块加载等级为实体计算加载等级或方块计算加载等级(小于等于32)且计算等级等于32,则区块内的方块实体和计划刻会被计算,实体会被追踪和记录,但无法参加每游戏刻的计算,这种类型的区块通常被称为弱加载区块(Lazy Processing Chunk)。如果一个区块加载等级是完全加载等级(33)且计算等级等于32,则区块内实体会被追踪和记录,但计划刻和方块实体无法参加每游戏刻的计算,这种类型的区块通常被称为加载边界区块(Loading Border Chunk)。计算等级等于33或加载等级大于33代表区块内实体、方块实体和计划刻不会被计算。
当实体和方块事件穿过不同加载行为的区块时,会产生多种特殊情况:
- 尝试移动到弱加载或加载边界区块的实体在离开强加载区块后会即刻停止所有活动。当这个区块变为强加载区块时,实体会按照进入时的位置和速度继续移动。
- 加载边界区块中的方块可以请求一个计划刻,但是直到该区块变为强加载或弱加载区块时才进行处理。
- 强加载区块中的点燃的TNT可以摧毁弱加载和加载边界区块内的方块。
- 流动的水、熔岩和火可以扩散到加载边界区块的第一个相邻方块,但流动会暂停,直到外部区块变为强加载或弱加载区块。
- 在强加载区块边缘生长的南瓜和西瓜茎可将其果实放置在外面区块的相邻方块上。
标签[]
区块的加载等级和计算等级是由本身或附近的区块所带有的标签(Ticket)产生的。每个加载标签或计算标签都有三项属性:标签类型、基础等级和存活时间。游戏内共有8种标签类型,分别用于不同的加载情况。
- 出生点标签
世界出生点所在的区块会获得基础等级为22的加载标签和计算标签。使用/setworldspawn
改变世界出生点时,出生点标签会同时改变。
- 末影龙标签
当有玩家参加末影龙战斗时,系统自动在末地的(0,0)区块放置基础等级为24的加载标签和计算标签。当所有玩家都退出末影龙战斗或末影龙战斗结束,此标签自动释放。
- 玩家标签
每个玩家都会在以自身所在区块放置一个基础等级为的计算标签,其中s是模拟距离。
同时,每个玩家以自身区块为中心的一个正方形范围内放置基础等级为31的加载标签。放置加载标签的范围只与客户端或服务器的渲染距离有关:在单人游戏中,正方形的边长为,其中d是客户端的渲染距离;在多人游戏中,正方形边长的公式不变,但d为server.properties中的view-distance
的值。
当渲染距离发生变化时,玩家加载标签的范围也会随之改变;当模拟距离发生变化时,玩家计算标签的等级也会随之改变。
- 强制加载标签
使用/forceload
可使得区块获得基础等级为31的加载标签和计算标签。与出生点加载标签类似,它只取决于当前世界的数据,在游戏重启后这些标签依旧有效。
- 光照标签
光照标签只用于世界生成,区块会获得基础等级为33的加载标签,而不会添加计算标签。当一个区块的生成阶段即将进入计算初始光照(Light)时,系统自动给这个区块放置光照标签,保证在计算区块光照的过程中它的加载等级能一直保持在可访问的等级。当光照计算结束后,此标签自动释放。
- 传送门标签
实体穿过下界传送门后,在目标维度的目标区块放置基础等级为30的加载标签和计算标签,存活时间为300游戏刻(15秒)。传送门加载标签是为了实体穿过传送门后能在目标位置上可以继续被计算,而存活时间保证了在穿过传送门后目标位置不会一直被加载。
- 传送后标签
玩家使用/tp
、/spreadplayers
或在旁观模式下传送到另一玩家时,传送的目标区块会获得基础加载等级为32的加载标签和计算标签,存活时间为5游戏刻(0.25秒)。当实体穿过末地折跃门时,传送的目标区块也会获得基础加载等级为33的加载标签和计算标签,存活时间为5游戏刻(0.25秒)。这种类型的标签是为了实体传送后的区块能保证处于生成完毕的状态。
- 未知标签
当系统需要立刻使用区块的数据,而区块还没有创建或生成到指定阶段时,系统自动给这个区块放置加载标签而不放置计算标签,它的存活时间为1游戏刻(0.05秒)。未知加载标签的基础等级不固定,但都大于32,它的加载等级代表了它要求区块生成到什么阶段。这种情况会发生于各种游戏计算中,例如生物AI计算,生物生成等。
等级传播[]
带有加载标签的区块会向相邻的区块传播等级。对于每个标签,等级从带标签的区块位置开始传播,每向外传播一次就等级增加1。对于加载标签,等级只会传播到45,更大等级的区块不在内存中;对于计算标签,如果已经传播到33级,再向外传播就不会继续增长,维持在33级。假设带有标签的区块位置为s,基础等级为l,需要计算等级的区块位置为d,则这个区块的等级为(不考虑已达到最大等级的状况),即本区块的等级等于标签的基础等级与本区块到标签区块的切比雪夫距离之和。
如果一个区块传播获得了不同的等级,则最小的等级作为本区块的等级。如果一个带有标签的区块的基础等级大于其他区块传播而来的等级,那么等效于这个标签没有起到任何作用。
闲置超时[]
如果一个维度长时间内没有玩家或实体出入,则没有必要长时间计算维度内的一些内容,这就是闲置超时的作用。闲置超时每刻增加1,当维度内存在任何玩家或有使用/forceload
强制加载的区块时,闲置超时被禁用且被重置为0;当有实体进入或离开维度时,闲置超时也被重置为0。当值超过300时(15秒),这个维度就不会计算末影龙战斗、实体和方块实体,但仍然会计算计划刻、世界边界、天气、袭击和普通方块事件,生成也会被计算,但由于维度内不存在玩家所以会失败。
基岩版[]
在已加载区块里,所有游戏内容都能够被运算。在未加载的区块里几乎各种游戏内容都不会运算。
区块的加载范围由模拟距离n决定,控制实体、方块更新的最大范围,其最大的加载范围距离玩家曼哈顿距离n+1个区块,且与玩家所在区块的X和Z坐标相同的最外侧4个区块不加载。在右图中,红色和绿色区域表示模拟距离内加载的区块。
种类[]
- 玩家加载
- 近似圆形
[需要更多信息]。 - 在玩家模拟距离内的区块会被加载。
- 近似圆形
- 命令加载
- 使用
/tickingarea
命令加载的区块。
- 使用
局限性 [需要更多信息][]
- 实体
- 生物生成遵循相同的规则。
特殊情况[]
一个区块中的事件可能会影响外部的区块。如果外部的区块处于非活动状态,则在大多数情况下会立即暂停。但下面情况是一些例外:
- 已加载区块边缘的方块发生变化,可以将方块更新传播到未加载区块内的方块,并使它们做出适当的响应。
- 流动的水或熔岩可以扩散到外部区块中的第一个相邻方块,但流动会暂停,直到外部区块被加载。
- 火可以传播到加载区块外的第一个相邻的易燃方块。像水和熔岩那样,也会暂停;虽然是可见的,但动画不会被播放并且在区块活跃前不再继续传播。
- 草和菌丝体可以传播到外部区域的第一个相邻方块,但受影响的方块在其区块变为活跃之前不会真正改变其外观,之后会即刻改变。
- 在加载区块边缘生长的南瓜和茎可将其果实放置在外面区块的相邻方块上。
- 尝试移动到外部区块的实体(例如生物、矿车和箭)在离开加载区块后会即刻停止所有活动。它仍然可见但会一动不动。当外部区块被加载时,实体会继续移动。
- 点燃的TNT会摧毁未加载区块内的方块,并且不像其他事件那样,其效果不限于相邻的方块。在外部区块的第二效果会暂停直到外部区块变得活跃。例如,如果爆炸破坏了支撑沙子或沙砾的方块,则沙子或沙砾不会立即掉落。附着在被摧毁的方块上的物品也会发生同样的事情,例如物品展示框和红石火把,它们在区块加载前不会掉落。
- 点燃的TNT被发射到未加载的区块时会暂停在外部空中的第一个方块。直到外部区块变为加载状态,它才将恢复其飞行和倒计时。
寻找区块边界[]
X或Z坐标能被16整除时即为区块之间的边界。例如:(96,-32)即为一个四区块的交点,X坐标在80到96区间内并且Z坐标在-48到-32区间内的方块即为一个区块,X坐标在96到112区间内并且Z坐标在-48到-32区间内的方块即为另一个区块,以此类推。当X和Z坐标为16的倍数时,此时玩家会穿越一个区块。
本质上,当X和Z坐标可被16除尽时,玩家位于区块的西北角。
此外,玩家可根据此公式知道他们所处的区块:
区块的X坐标:Floor( X坐标 / 16 )
区块的Z坐标:Floor( Z坐标 / 16 )
Floor是获取小于等于指定数字的最大整数,如Floor( 27.9561 )是27。
换句话来说,如果X是27,Z是-15,区块将会是( Floor( 27 / 16 ), Floor( -15 / 16 ) )区块,这意味着玩家在区块(1,-1)。
同时,玩家可以通过这个公式知道他距离西北角的距离:
( X或Z坐标 ) AND 15
在Java版中,F3 + G键可用来显示区块边界,或者按下F3键可打开调试屏幕以显示玩家的X、Y和Z坐标以及“chunk”变量的值。玩家可以通过“chunk”变量得知他们所处的区块。
在基岩版中,当切换高品质的图像品质时,世界会重新渲染,只加载玩家所处的区块一瞬间。这个方法对寻找区块边界会很有用,因为在那一瞬间会显示清晰的区块边界。
史莱姆区块[]
史莱姆区块指的是一些在Y=40以下能够忽略亮度生成史莱姆的区块。这些区块在其他方面与所有其他区块相同。
Java版[]
史莱姆区块在世界各地都存在(蘑菇岛除外)。有十分之一的区块都是史莱姆区块。这些史莱姆区块是通过将它们的区块坐标与世界的种子相结合,通过伪随机算法确定的:
Random rnd = new Random(
seed +
(int) (xPosition * xPosition * 0x4c1906) +
(int) (xPosition * 0x5ac0db) +
(int) (zPosition * zPosition) * 0x4307a7L +
(int) (zPosition * 0x5f24f) ^ 0x3ad8025f
);
return rnd.nextInt(10) == 0;
也就是说,使用区块坐标和世界种子来生成介于0和9之间(含0和9)的随机整数,如果该数字为0,则该区块是史莱姆区块。请注意,xPosition
和zPosition
是32位整数(INT)。
基岩版[]
基岩版中的史莱姆区块算法与Java版中的算法不同。该算法不依赖于世界种子,因此,每个世界中的史莱姆区块位置是相同的。[1][2]
历史[]
此段落仍需完善。你可以帮助我们扩充关于该主题的更多信息。
Java版pre-Classic | |||||
---|---|---|---|---|---|
Pre-classic(早期版本) | 加入了区块。 | ||||
现在区块的大小是16×16。 | |||||
rd-132151 | 将区块从16×16缩小为8×8。 | ||||
现在靠近玩家的区块被优先加载。 | |||||
Java版Classic | |||||
? | 区块大小又是16×16了。 | ||||
Java版Infdev | |||||
20100227 | 不再能自定义区块高度。区块高度更改为128。 | ||||
Java版 | |||||
1.2.1 | 12w07a | 区块的高度增加到了256。 | |||
1.10 | 16w20a | 现在可以按下F3 + G来显示区块的边界。 | |||
1.14 | ? | 改变了区块加载的方法。 | |||
1.17 | 20w49a | 现在可以自定义区块的高度。 | |||
21w06a | 将主世界区块的高度增加至384。 | ||||
21w15a | 暂时将主世界区块的高度恢复至256。 | ||||
1.18 | exp1 | 主世界区块的高度再次更改为384。 | |||
21w37a | 视距所决定的区块渲染范围的形状由原先的方形改为圆柱形。 | ||||
21w38a | 现在可以自定义模拟距离。 |
你知道吗[]
- 一个世界可生成14万亿(14,062,500,000,000)个真区块。区块共有7.46×10244,700种可能的区块,不包括实体。
- 如果玩家位于未生成的区块里,世界会立即隐藏,直到玩家位于一个有效区块里。如果玩家的Y坐标在区块边界外时,这就不会被触发。
- 在基岩版中,如果区块中有一个区段里面没有任何方块,则在其中放置方块会显示与区块加载相同的动画。该漏洞使玩家在放置的方块时,视野变成天空的颜色大约1秒钟,并逐渐消失,变为正常的画面。如果时间是日出或日落,并且玩家在其中放置了一个方块,那么如果玩家不断上下摆动头部,它实际上会持续更改颜色1秒钟。
参见[]
参考[]
- ↑ @protolambda和@ jocopa3进行过基岩版史莱姆区块算法的反向工程,可以在GitHub上找到:[1][2]
- ↑ Blocktopograph中的算法:SlimeChunkRenderer->isSlimeChunk(int chunkX, int chunkY)
语言