Minecraft 设计思想
卷三 · 技术实现世界如何存在

世界生成管线

从噪声到结构,一条流水线如何兑现「可探索」的设计合同;区块生命周期与多线程;结构与地形的冲突靠修补假装没发生;种子的确定性是有边界的合同。

本章命题:种子的确定性是一份有边界的合同——生成器承诺「同版本 + 同种子 = 同世界」,且只对已生成的区块兑现;版本一旦更迭,未探索的区域将被新的算法重新解释。玩家感受到的「旧存档长出新地形」,不是 bug,是这份合同的边界条款在生效。若某次版本更新后旧存档的未探索区域与更新前完全一致地继续生成,本命题就是错的。

1问题

老玩家都遇到过:把一个几年前的存档搬进今天的版本,走到从未去过的方向——新长出来的地形和当年那种「味道」完全不同:洞更深,山更陡,美得刺眼。种子没变,世界却「换了个生成器」。

理解这件事,需要把世界生成当成一条流水线来看:玩家的「一个世界」在机器里不是一次成型的,而是按区块、按阶段,像流水线产品一样被一道道工序生产出来。种子决定每一道工序的随机数,而工序本身的写法——生产世界的「配方」——随版本改写。本章沿流水线走一遍:设计合同如何变成实现义务,区块的一生经过哪些站,结构(村庄、要塞)为什么总是和地形闹别扭,以及确定性的边界究竟划在哪里。

2生成是设计合同的实现

卷二第 6 章给世界生成定过设计合同:生产「合格差异」,不生产内容。落到实现层,这份合同变成三条工程义务,每一条都反过来塑造了流水线的形状。

**第一条:任意坐标可求值(局部性)。**玩家可能朝任何方向走,所以任何一块地方的地形必须能不依赖「先算完整个世界」就独立算出来。这直接排除了任何全局性的方案(比如先跑一遍全世界的物理),逼出了「以区块为单位、各自独立成产」的基本格局。

**第二条:结果确定(可复现)。**同一种子、同一坐标,任何时间算出的结果必须一致——否则种子分享、地图工具、速通验证全部失效。这逼出了「随机数全部由种子派生」的设计:机器里没有真正的骰子,只有从种子出发、按坐标取模的确定性哈希(可以理解为:用种子当原料、按位置配方,产出的伪随机数)。

**第三条:按需增量(懒加载)。**世界无限,内存有限,所以只能生成被需要的部分——玩家附近的先生成,远处的永远停留在「尚未存在」。这逼出了区块的生命周期管理,下一节细讲。

三条义务合起来,流水线的大形就定了:**按区块切块、每块独立生产、生产过程可分阶段并行、随机数全部可溯源到种子。**第 6 章那些诗意的设计语言——「无限的修辞」「合格差异」——在这三条义务面前,都换算成了具体的工程形状。

3管线阶段:一道工序一个世界概念

把一块区块从无到有,拆成主流水线上的几道工序(细节各版本有差异,这里取共同的骨架):

噪声求值基准地形 地形塑造洞穴与峡谷 表层与群系地表方块与着色 特征树木花草矿脉 结构村庄要塞遗迹 光照计算 可游玩的区块

噪声求值:流水线的第一道工序。以坐标为输入,通过多层噪声函数(可以理解为几层不同粗细的「起伏波」叠加)算出这一列的基准高度与密度——山的走向、谷的深浅在这里定型。这一步产出的是「生地形」,还没有材质、没有生命。

地形塑造:在地形上开凿。洞穴、峡谷、湖泊在这一步被「挖」或「填」出来。这一步最考验设计合同的「合格差异」条款——挖得太规则像迷宫,挖得太随机像烂疮。

表层与群系:给地形穿上衣服。生物群系在此决定地表用什么方块:草、沙、雪;气候与高度的分布规则也在这层生效。卷二第 6 章说的「语义层」就住在这里。

特征(features):小件装饰的批量安装——树、花草、矿脉、湖。它们的放置用确定性随机:同一种子下,这棵树长在这里是「算出来的」,不是「存的」。

结构(structures):大件安装——村庄、要塞、沉船、遗迹。它们是流水线上最特殊的一道,特殊到下一节要单独开一节讲:因为一个村庄可以横跨四个区块,而流水线是按区块独立运转的。

光照:最后一声哨响。天空光与方块光在方块世界里传播一遍,此前的地形只是「黑的」,这一步之后才「亮」。光照是玩家最直观的工程质量显示器——它是卷二第 1 章「光照可以计算」这句话的实现现场。

值得停下来欣赏的是这条流水线的语义分工:几何(噪声)、雕刻(塑造)、语义(群系)、细节(特征)、叙事(结构)、可读性(光照)——卷二第 6 章那份设计分工,在实现层被原封不动地翻译成了工序表。设计合同的每一个名词,在管线里都有一个工位。

4区块的一生:生命周期与多线程

流水线是按订单生产的,订单就是玩家的位置。一块区块的一生是一条状态机:

不存在 → 生成中 → 装饰中 → 已加载 → 可见 → 可交互,以及反向的卸载。玩家移动,前方的新区块按视距进入队列开工;身后的区块保存后卸载,从内存退回硬盘。两个不同的距离参数控制这条流水线的两段:渲染距离决定多远的区块会被画出来,模拟距离决定多远的区块会真正运转(庄稼生长、生物活动)1——1.18 前后两者被拆开,就是为了让「看得远」不再连带「算得远」的昂贵账单。

多线程是这条流水线的现代形态。生成是纯计算(不碰玩家正在改的世界),适合丢给后台线程并行开工;主线程只负责把成品接进来、跑游戏逻辑。玩家熟悉的两种卡顿,正对应流水线的两个瓶颈:进入新地形时的顿挫,是「订单暴增、生产线满载」;长期游戏里的间歇卡顿,常是「装饰与结构阶段在主线程排队」。「卡在区块边界」这句玩家俗语,技术上精确成立——你正跨进一块尚未完成生产的土地。

5结构与地形:一场被假装没发生的冲突

流水线上最别扭的工位是结构。别扭的根源是一个鸡与蛋问题:**区块按 16×16 独立生产,而村庄动辄横跨数个区块。**生成村庄的那个区块,需要知道隔壁区块上「自己」的另一半长什么样——但隔壁此刻可能还不存在。

工程上的解法是一套精巧的预约制:每个区块开工前先「查表」——用种子算出这一带有没有结构、结构占哪些区块——需要被结构占用的区块先为它留位。这套机制运作得足够好,好到玩家几乎感觉不到它的存在;但它的裂缝也是玩家熟悉的:**结构与地形的冲突。**村庄生成在断崖上,屋子悬在半空底下垫着临时平台;要塞被洞穴拦腰切断;林地府邸周围的地形像被强行熨过。这些都是「预约制」打不完的补丁:结构放置与地形塑形是流水线上的两道独立工序,它们之间的协调,靠的是生成后的一次「适应」——结构把自己的地基垫高、平台铺平,假装周围的地形本来就配合。

卷二第 6 章把结构称为「生成器讲的叙事」,本章补上实现层的实话:**这段叙事是被缝合进世界的。**缝合线你在游戏里亲眼见过——那些悬空的村庄就是线头。为什么不去彻底解决?因为彻底解决意味着地形与结构耦合成一个整体生成步骤,那会牺牲独立性与性能,还可能毁掉既有种子的可复现性。带着补丁活下去,是这条流水线所有务实决定里最典型的一个。

6确定性的边界:种子合同的免责条款

现在可以回答开头的问题了。种子合同有一条玩家很少细读的免责条款:**确定性只对「同一配方」生效。**同种子 + 同版本 = 同世界,天经地义;但版本更迭改写的正是配方本身——噪声换了层,洞穴换了挖法,群系换了分布。于是旧存档里:

已经生成过的区块(你走过、改过的地)以保存下来的数据为准——它们是世界文件的一部分,配方改了也动不了它们;从未生成的区块(你没去过的方向)将用新配方重新生产——种子还是那个种子,长出来的却是新算法的世界。

新旧两种地貌在你的存档里以接缝相接:一条你探险时无意间划下的、「版本冻结线」。老玩家管这种存档叫「两个世界缝合的存档」,遥感它的位置很简单——地貌风格突变的直线附近,就是你当年回头的地方。

这不是设计缺陷,是无限世界的必要代价:不可能为一个玩家的旧存档永远维护旧版生成器(那是无底洞的兼容负担,卷三第 2 章与卷四第 9 章都会算这笔账)。合同的真实条款因此是:**世界由两部分组成——被记住的过去(已保存区块),和被重新解释的未来(未生成区块)。**种子给你确定性,版本给你演进,两者相加,就是 Minecraft 玩家最熟悉的那种复杂乡愁:旧地图上永远有你没见过的、不属于你记忆的新大陆。

值得一提的是,这条边界近年正在被官方主动开放:实验性的世界生成数据包允许玩家替换流水线的配方本身(自定义群系、自定义地形)2。合同第一次允许签约方改写配方表——卷二第 8 章「数据驱动是温和模组」的判断,在生成层拿到了最新的证词。

7这一章留下什么

  • 爱好者:你的存档里那条「新旧地形的接缝」,是一条版本历史的断层线——它在的地方,就是你当年放下游戏的地方。
  • 开发者:能抄走的是合同先行的方法——先写清「随机性对谁承诺什么」(局部可求值、可复现、按需增量),管线结构会从义务里自己长出来;以及预约制解决跨单元结构的思路与它的代价意识。抄不走的是补丁的耐受度:结构与地形的缝缝补补一补十几年,靠的是用户把补丁当风景的文化——这种事,公关部门学不来。

注释

  1. Minecraft Wiki,《Simulation distance》(渲染距离与模拟距离分离,模拟距离决定方块实体、随机刻与生物运转的范围),minecraft.wiki,检索于 2026-09-18;见 https://minecraft.wiki/w/Simulation_distance ↩

  2. Minecraft Wiki,《World generation》(数据包可自定义生物群系、地形与结构;实验性世界生成自 1.16.2 起逐步开放),minecraft.wiki,检索于 2026-09-18;见 https://minecraft.wiki/w/World_generation ↩

On this page