区块(Chunk)是Minecraft世界里一个大小为16×256×16的部分。
生成
区块宽16格,长16格,高256格,共有65536格。当玩家第一次出现在世界时会在其周围生成区块,而随着玩家对世界的探索,相邻的区块也会被生成。
区块是通过地图种子进行生成的,这也意味着如果每次使用的地图种子相同的话,所生成的区块也会相同,前提是Minecraft和世界生成器的版本要一致。
区块加载
由于一个世界极大并且包含极多区块,因此游戏仅加载部分区块以使游戏可玩,游戏不会运算已卸载的区块。
Java版
加载标签
每个区块的加载都来源于一个“加载标签”。
每个加载标签具有3个属性:加载等级,标签类型和存活时间(可选属性)。
加载等级
加载等级用于决定了这个区块中哪些游戏内容能够被运算。
加载等级的范围是22-44。只会在22-33的范围里有常规的游戏运算。理论上小于22的加载等级是可能的(不过在原版中不可行)。加载等级44以上是不可能的。
一个区块如果获得多个加载等级,只有最小的加载等级是有效的。加载等级越小,游戏会运算更多内容。
加载等级可以分为以下有四种加载等级类型:
类型 | 等级 | 属性 |
---|---|---|
强加载 | 31及以下 | 所有游戏内容都能够被运算。 |
弱加载 | 32 | 除了区块刻以及实体不会运算(例如不会移动),所有的游戏内容都正常运行, |
加载边界 | 33 | 只有少部分游戏内容会正常运行(红石元件和命令方块等都不能运行)。 |
不可访问 | 34及以上 | 各种游戏内容都不会运算,但世界生成会在这些区块中运行。 |
等级传播
带有加载标签的区块,会相邻(8个)的区块传播加载等级。对于每张“标签”使用“flood fills”算法从“标签”的位置传播,每向外传播一次就加载等级增加一,直到达到上限44。
34 | 34 | 34 | 34 | 34 | 34 | 34 |
34 | 33 | 33 | 33 | 33 | 33 | 34 |
34 | 33 | 32 | 32 | 32 | 33 | 34 |
34 | 33 | 32 | 31 | 32 | 33 | 34 |
34 | 33 | 32 | 32 | 32 | 33 | 34 |
34 | 33 | 33 | 33 | 33 | 33 | 34 |
34 | 34 | 34 | 34 | 34 | 34 | 34 |
IN | IN | IN | IN | IN | IN | IN |
IN | BO | BO | BO | BO | BO | IN |
IN | BO | TI | TI | TI | BO | IN |
IN | BO | TI | ET | TI | BO | IN |
IN | BO | TI | TI | TI | BO | IN |
IN | BO | BO | BO | BO | BO | IN |
IN | IN | IN | IN | IN | IN | IN |
标签类型
不同来源的标签有不同的类型,用于确定不同加载等级。
玩家
由玩家加载的标签。“玩家”标签的加载等级为31。玩家的加载范围内的区块都会获得“玩家”标签。
- 玩家的加载范围:
- 玩家的加载范围是一个以玩家为中心正方形。
- 单人游戏中,正方形的边长取决于选项中的“渲染距离”:边长 = 渲染距离 × 2 + 1.
- 多人游戏中,正方形的边长取决于server.properties里的“view-distance”:边长 = view-distance × 2 + 1.
- 例如,当“渲染距离”为5个区块时,强加载区块有11×11,外边围一圈弱加载区块,再围一圈加载边界。
强制
使用/forceload
命令可以让区块获得“强制”类型的加载标签。加载等级为31。
“强制”类型的加载标签在游戏重启后依然有效。
出生点
世界出生点所在的区块会获得“出生点”加载标签。使用/setworldspawn
改变世界出生点时,加载标签会同时改变。加载等级为22,是游戏中最小的加载等级。
传送门
当实体通过下界传送门传送时,在即将到达的下界传送门所在的区块会获得传送门标签,加载等级为30。
“传送门”加载标签本身没有“存活时间”,不过如果传送门300gt(不卡顿则300gt=15秒)内没有使用过,传送门系统会移除这个的加载标签。
末影龙
“末影龙”加载类型的加载等级为24。在开始攻击末影龙时,在末地的(0,0)区块创建,并在停止或结束后移除。
瞬移后
实体瞬移后在瞬移到的区块创建的加载标签,包括使用/tp
命令、/spreadplayers
命令,通过末地传送门。对于/tp
命令,加载等级为32,而/spreadplayers
命令和末地传送门的加载等级为33。
具有“存活时间”属性,为5gt,也就是说它在5个游戏刻后失效。
临时 [需要更多信息]
在任意游戏代码调用“getChunk”方法时创建的标签。如果游戏认为这个区块应该被加载,它就会把这个“临时”标签赋给那个区块(可能在创建它之后)。
加载等级与区块是否已经完成世界生成有关。它的等级至少会是33,但在许多情况下会大于33。
例如:生物游荡AI执行时,它将会检查某个方块是否有完整上表面。作为检查的一部分,这个区块会获得等级为33的“临时”类型的加载标签。
它的“存活时间”为1游戏刻。
光 [需要更多信息]
未知,可能与世界生成有关。
局限性
- 闲置超时
- 在加载区块中并不是所有游戏内容永远会运算,因为它们可能还有其他条件,其中包括:
特殊情况
一个区块中的事件可能会影响外部的区块。如果外部的区块处于非活动状态,则在大多数情况下会立即暂停。特别地,
- 弱加载区块边缘的方块发生变化,可以将方块更新传播到弱加载区块外部的方块,并使它们做出适当的响应。更新可以一个方块接一个方块地传播,直到传播到加载边界之外,这时它会创建一个“临时”加载标签并且继续传播。
- 加载等级为33的区块中的方块可以请求一个计划刻,但是直到该区块获得32及以下的等级时才进行处理。
- 流动的水或熔岩可以扩散到弱加载区块之外的第一个相邻方块,但流动会暂停,直到外部区块获得更高的等级。
- 火可以传播到弱加载区块外的第一个相邻的可燃方块。像水和熔岩那样,也会暂停;直到外部区块获得33及以下的等级。
- 草和菌丝可以传播到弱加载区块外的第一个相邻方块。
- 在强加载区块边缘生长的南瓜和西瓜茎可将其果实放置在外面区块的相邻方块上。
- 尝试移动到弱加载区块的实体(例如生物、矿车和箭)在离开强加载区块后会即刻停止所有活动。当这个弱加载区块获得更高的加载等级时,实体会继续移动。
- 强加载区块中的点燃的TNT会摧毁弱加载区块内的方块。
基岩版
在已加载区块里,所有游戏内容都能够被运算。在未加载的区块里几乎各种游戏内容都不会运算。
种类
- 玩家加载
- 近似圆形
[需要更多信息]。 - 在玩家模拟距离内的区块会被加载。
- 近似圆形
- 命令加载
- 使用
/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]
历史
你可以帮助我们扩充关于该主题的更多信息。
原因:section
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 | 区块的高度增加到了256。 | ||||
1.14 | 改变了区块加载的方法。 |
你知道吗
- 一个世界可生成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)