光照、流体与方块更新
光照传播、方块化流体与三类刻——看不见的基础设施决定看得见的手感;连锁更新是一场隐式的图计算,卡顿与复制物品的漏洞都从它的规模里长出来。
本章命题:光照、流体、方块更新是世界的「看不见的基础设施」:玩家看得见的一切——亮暗、流水、塌方、卡顿——都是这三套系统在后台运算的表现;连锁更新本质是一场玩家可以随时触发的图计算,其规模是卡顿之源,其间隙是漏洞之窗。若把这三套系统全部换成「预设演出」(贴图式的光、动画式的水),游戏手感应当不变——观测到的相反结果即本命题的证伪。
1问题
三个每个玩家都经历过的瞬间。其一:你挖开屋顶,一束天光顺着洞口铺下来,洞里的黑暗退成了一圈影子。其二:你把一桶水倒进峡谷,水沿着地势铺开、分流、落成瀑布,几秒钟后一切安静下来。其三:你挖掉沙墙脚下的一块石头,整面墙的沙哗啦塌下。
三个瞬间对应三套后台系统:光照在重算波及范围,流体在按刻推进,方块更新在通知邻居。玩家看得见的是结果,看不见的是成本——而这三个成本,恰恰是「卡顿」这个词在 Minecraft 里的全部来源,也是这个游戏最著名的一类漏洞的产房。本章把三套系统逐个摊开,让爱好者能把自己的体感说成机制,让开发者能看清每一笔账的记法。
2光照:一次挖掘能波及多远
Minecraft 的光分两套:天空光(来自天上,照亮露天世界)与方块光(来自火把、萤石这些发光体)。两套都按 0 到 15 的等级计量(卷二第 1 章讲过这套整数语言的妙处),每传播一格衰减一级。
实现上的关键词是传播:光不是按「照不照得到」贴标签,而是从光源出发,像水波一样向四周逐格扩散、逐级减弱,直到等级耗尽。这套传播的数据结构是经典的广度优先搜索——从光源开始,一圈一圈向外问「你这格比我亮吗」,是就更新并继续扩散。它安静地工作的日常里没人注意它;但它的成本结构决定了两个玩家熟悉的体感:
其一,一次挖掘是一次光照波及。在地下挖开一格,天空光顺着新通道涌进来,通道两壁、深处、转角后的暗区全部要重算——一格的改动,光照更新的波及范围是三维空间里的一大片。大批量改变地形(比如用 TNT 炸山)时,光照重算的账单会集中到期,这就是「炸完一座山卡一下」的机制身份。
其二,光照引擎曾是主线程上最大的房东。历史上,光照计算与游戏逻辑挤在同一个线程里,重算账单一到,游戏就得等着——这是「卡顿」在 Minecraft 里的头号惯犯。1.14 官方重写了光照引擎,把重算搬进独立线程、优化了传播算法1;在那之前及之后,社区的性能模组一直在这条赛道上与官方互相印证——民间实现屡屡领先,官方重写吸收思路,这条「优化模组当先行军」的模式,本卷还会反复见到。
这套系统的玩家界面也值得一看:调试屏幕(F3 呼出的信息层)把脚下与头部的光照等级直接显示成数字。于是光照从「感觉」变成了「读数」——「这格 7 级,怪能刷」「火把隔多少格摆一根」这些口诀,全都是对着官方调试界面上的整数算出来的。卷二第 9 章讲过怪物刷新与光照的合同(亮度低于阈值的地方属于黑暗方),本章补上合同的对账工具:玩家用它把「防刷怪」从玄学做成了工程。一个内部调试功能最后成了全社区的建筑规范量尺,这是「隐形基础设施」最体面的命运。
3流体:设计与实现的一次深度耦合
Minecraft 的水不是流体模拟,是方块化的流体:水占据格子,按 0 到 7 的「深度等级」流动,每离源头一格降一级,流到尽头变成涓滴。岩浆同理但更慢。这套规则的每一处都同时是设计决定和实现决定——它是全书「设计与实现耦合」的最佳标本。
无限水是耦合的招牌案例:两个水源方块夹住的空格,会自己变成新的水源。这条规则在物理上毫无道理,在设计上却极其漂亮:它让「水」成为可再生资源,农田灌溉、水下工程、水道运输都因此可以被稳定规划。玩家把它用成了基建规则——无限水不在更新日志里,它长在两桶水的摆法上。
方块化流体的玩法产出也全部依赖它的「假」:刷石机(水遇岩浆生石头)依赖流体接触的确定性判定,水电梯依赖水流推动实体的规则,水道分拣依赖水流把掉落物送到指定格。假如换成真实的流体模拟(漩涡、压力、侵蚀),这些玩法——第 7 章红石工程的一半地基——全部作废。卷二第 15 章说「不真实是让利」,流体是让利清单上数额最大的一条:让掉的是物理的真实,换来的是一整个自动化玩法族群的确定性。
实现层的代价也要记:方块化流体每一刻都在「想事」——流动中的水每刻被重新评估,玩家倒一桶水,下游几十格水域跟着排队更新。它是「计划刻」最大的客户,下一节的日程表上,水占的栏位最多。
流体家族内部的节奏差异也是设计的一笔:水与岩浆的流动都按计划刻排班,但排班密度不同——水勤快,岩浆懒散(慢数倍),慢到玩家可以看着它的前沿一格一格地爬。这个差异被玩家读成了两种性格:水是伙伴(运输、灭火、水电梯),岩浆是重物(燃料、垃圾处理、防御屏障)。甚至连「岩浆遇水变石头」这条交互规则的节奏都被调过:先到者成型为黑曜石,后到者凝成石头——刷石机的全部工艺,就建立在这两行调度参数上。所谓游戏手感,在流体这里具体到刻表的排法。
4三类刻:模拟世界的日程表
世界每秒走二十刻(卷三第 5 章细讲这个契约本身),但「世界在动」的感觉,是三类不同的刻各自供给的。用日程表打比方,三类刻是三种不同的安排方式。
**计划刻(scheduled tick)是预约日历。**一个方块「预约」在未来某刻做某事:水预约下一刻继续流,沙子预约掉落,火焰预约蔓延与熄灭。预约一旦排上,到点必办、顺序执行。它的纪律性是自动化玩法的地基——红石与流体的一切「可预测」,根子在计划刻的守时。
**随机刻是抽查彩票。**世界每刻在每个区块段里随机抽几个方块「关照」一下:被抽中的庄稼可能长一格,被抽中的树叶可能腐烂,草可能蔓延一格。抽签概率有一个官方参数(随机刻速度),服务器玩家对它不陌生——调高它,就是让庄稼长得快2。世界的「生命感」(万物在慢慢生长)全部由这张彩票供给,而它的成本天然均匀——不像光照那样集中爆单。
**邻居更新是敲门。**一个方块被改动时,它周围的六个(间接更多)邻居会收到「我变了」的通知。收到敲门的方块检查自己的规则:脚下空了的沙该掉了,隔壁进了水的火把该灭了,红石线该重新算信号了。三类刻里它最不起眼,却最贵——下一节讲为什么。
5连锁更新:一场隐式的图计算
把三类刻合起来看世界运行的真实方式:方块世界是一张巨大的图,每个方块是一个节点,相邻关系是边;任何一格的改动,都在这张图上触发一轮局部重算——这就是连锁更新。
一个普通的连锁:你挖掉一格,邻居收到敲门;沙子邻居预约掉落(计划刻),水邻居预约流动,红石线重新计算信号(这本身就是一场沿线路的图遍历);它们各自的响应又改动新的方块,新的敲门声传出去……一格的编辑,波及的是以它为圆心、按规则半径画出的一个三维区域。绝大多数时候波及在几十格内收束,玩家毫无感觉;但在红石机器密集、水流纵横的地方(大型农场、工业基地),一轮连锁可以扫过数万格——这顿饭是主线程吃的,饭桌上还坐着你的帧率。卡顿的机制身份,到此完全清楚:它不是「东西太多」,是「一张图上被同时掀起的重算风暴」。
连锁更新还是这个游戏最著名一类漏洞的产房:物品复制(玩家称「杜普」)。复制漏洞的技术温床几乎都在连锁更新的间隙里——两个系统在同一个刻内交叉改动同一份物品数据,执行顺序的窗口被玩家精确把握后,一份东西就能变成两份。本节不提供任何细节,只给两个判断。第一,这些漏洞是图计算固有难度的影子:要执行的事情彼此依赖、又要在二十分之一秒内算完,顺序与并发的权衡必然留缝。第二,官方的修补史再次验证了卷二红石章那条定律——在玩家已经把行为当地基的世界里,修顺序就是改语义:堵一个复制漏洞的改动,常常顺带改变一批机器的行为,修补本身要当作「立法」来慎重对待。漏洞、卡顿、语义冻结,三件事共享同一个根:连锁更新的图,规模与复杂性都超出了任何人当初为它做的预算。
而这条链路的终局又一次走向收编:社区在找缝的过程中发明了「侦测更新」这门手艺(利用更新顺序的怪癖做开关),官方最终的回应不是堵死,而是把这门手艺正式入编——观察者方块(卷一第 4 章讲过的那次收编),一个「看见邻居变化就发信号」的零件,等于官方承认:**「方块更新」这件事本身就是玩法。**从漏洞的温床到信号的接口,连锁更新走完了与准连接性同款的路。
6这一章留下什么
- 爱好者:炸完山的那一卡、无限水的两桶摆法、庄稼的快慢可调——现在你知道它们各自是哪套系统在上班了。
- 开发者:能抄走的是「隐形基础设施」的预算意识——光照、流体、更新传播这三样的成本模型要在第一天进设计文档,而不是上线后再进事故报告;以及把「随机性」分层管理(预约的确定性、抽查的生命感、通知的即时性)的日程表模型。抄不走的是玩家对漏洞的产业级创造力——有图计算的地方就有找缝的人,这不是安全问题,是生态成本。
注释
-
Minecraft Wiki,《Lighting》(光照分天空光与方块光两套、0–15 级传播;1.14 对光照引擎做了多线程化重写),minecraft.wiki,检索于 2026-09-18;见 https://minecraft.wiki/w/Lighting ↩
-
Minecraft Wiki,《Tick》(随机刻在每个区块段每刻随机选取方块执行生长与衰变;随机刻速度默认为 3,可由 gamerule 调整),minecraft.wiki,检索于 2026-09-18;见 https://minecraft.wiki/w/Tick ↩