Minecraft 设计思想
卷三 · 技术实现模拟如何推进

游戏循环与刻

20 TPS 是世界的时间契约——掉 TPS 失去的不是帧率而是因果的及时性。刻的种类、红石的另一口钟、看门狗,以及为什么「时间」在多人世界是共享真实。

本章命题:TPS(每秒刻数)是多人世界的共享时钟契约:帧率属于你的眼睛,刻属于世界本身;服务器掉 TPS 时,画面依旧流畅,但世界的因果整体变慢——熔炉真的慢了,庄稼真的慢了,红石钟真的慢了。若存在一种实现能在掉 TPS 时保持因果及时(跳过或快进模拟)而玩家毫无察觉,本命题就是错的。

1问题

服务器卡的时候,老玩家会告诉你一件新手觉得不可思议的事:**熔炉真的变慢了。**不是「感觉慢了」,是烧炼进度条以肉眼可见的更慢速度爬。与此同时,你的画面帧率没有任何变化——视野照样丝滑,转动视角照样跟手。

一个画面流畅的世界里,熔炉在慢动作——这怎么可能?答案藏在 Minecraft 架构的第一性事实里(卷三导读的三句话之一):**你以为的单机,其实是客户端和一台服务端在互相通话;你看到的画面属于客户端,世界的时间属于服务端。**两者用的是两套独立的钟。本章把这两口钟拆开:20 TPS 是什么契约,一刻里世界要干完哪些活,刻为什么分好几种,红石为什么有自己的一口小钟,以及当世界彻底卡死时,最后值班的那道保险丝是什么。

2卡顿时「世界变慢」到底是什么

先把两套钟各归其位。

**帧率(FPS)**是客户端的钟:每秒把世界画多少张。它由你的显卡、分辨率、渲染设置决定——它是「你看世界的频率」。

TPS(ticks per second,每秒刻数)是服务端的钟:每秒把世界推进多少步。每一步(一个刻,tick)里,服务端要把全世界的活干一轮:庄稼长没长、水流到哪格、生物在想什么、你的熔炉烧到百分之几——全部按刻结算。它是「世界自己的时间」。

两套钟平时同步得让你察觉不到它们是两口钟。但它们的工作量来源完全不同:帧率的开销是「把世界画出来」(随视距、光影变化),TPS 的开销是「把世界算出来」(随实体数量、机器复杂度、红石规模变化)。服务器卡,卡的是「算」——一个刻的活超出了五十毫秒的预算(下一节讲这个数),这个刻就被拖长;刻被拖长,世界的时钟就变慢;世界的时钟变慢,挂在世界钟上的一切——熔炉、庄稼、生物、红石——同步变慢。而挂在你显卡上的那口钟照常走,所以画面不卡。

「世界变慢」这四个字,在这里不是修辞,是机制的字面描述。

掉 TPS 的体感有清晰的分级,值得给爱好者一张自诊表。轻度(刻略超预算):破坏方块的动作回音变慢,方块碎裂的动画拖拍——世界还基本跟手。中度:实体开始「赶账」——别的玩家的移动在你屏幕上跳格,生物的位置瞬移,因为服务器发来的快照间隔变长,插值无米下锅。重度:交互进入「排队制」——你挖了方块,服务器几秒后才承认,方块先消失又回来(客户端的预测被权威否决回滚),扔出的物品悬在半空。三层分级对应同一根指针:刻预算被侵占的比例。顺带一个常见误会可以澄清了:视距调低不直接提升 TPS——它减的是渲染与区块加载的账;只有当那些账挤占了模拟的预算(比如加载卡顿拖住主线程)时,调视距才会「顺便」缓解世界变慢。两本账,两种药。

20 TPS 契约与客户端的时间

20 TPS 意味着服务端的每个刻有五十毫秒的预算——二十分之一秒1。这五十毫秒里,服务器要跑完整个「可以感知的世界」的一轮模拟:所有已加载区块的计划刻、随机刻(卷三第 4 章的日程表)、每个实体的 AI 与物理、方块更新、红石信号。五十毫秒是预算上限,不是平均耗时——平时这轮活几十毫秒内轻松干完,余量用来应付玩家突发的大动作(炸一座山、几千个物品同时掉落)。余量耗尽的时刻,就是掉 TPS 的时刻。

这份契约的签约方比看上去多。对客户端,它承诺世界的节拍——客户端按 20 TPS 的节奏收服务器快照,在快照之间做插值(把两个状态间补上平滑过渡),你看到的流畅动画,是渲染帧对离散刻的润滑。对玩家,它定义了时间单位——游戏里的一天是二十分钟,因为 24000 刻除以 20 TPS 恰好一千二百秒;玩家嘴里的「一秒」是二十刻,红石的「一拍」也是它(卷二第 7 章)。对玩法,它承诺因果的纪律——同一刻内的事件顺序固定、可复现,红石机器敢用「隔三拍」做设计,是因为契约保证「拍」的均等。

顺带回答一个重写卷才会正面处理的问题:为什么偏偏是 20,而不是流畅党想要的 60?2009 年的答案是务实的——Notch 的一台家用机器要把整个世界的模拟每秒跑二十轮已属可支撑,20 是「模拟得过来」与「看起来不迟钝」之间的妥协点。但妥协一旦被玩法投资,就成了标准:十五年的红石时序、服务器预算、社区黑话全部长在 20 上,如今动它的代价早已不是技术问题。一个当年顺手拍下的数字,长成了这个世界的物理常数之一——技术债与设计资产的相互变形,这里是全书最干净的一个样本。

客户端一侧也有自己的循环,但它的刻不是世界的刻:客户端每帧做预测(你按 W 就先走)、渲染、输入采样,再把「我做了什么」发给服务器听候裁决。卷三第 10 章会算这笔预测与裁决的账;本章只需要记住分野:**客户端的时间用于观看和预判,服务器的时间用于裁决和记账。**两钟并行,单机时同住一台电脑,多人时隔着一个网络——但契约不变。

4刻的种类:一口钟,多本账

「刻」这个字在社区语境里至少有四五种用法,本章做个总账(各细则在对应章节展开):

游戏刻是总账,20 TPS 的那一口大钟,所有其他「刻」的度量基准。

区块刻是生效范围——只对「模拟距离内」的已加载区块跑的模拟(卷三第 3 章讲过模拟距离与渲染距离的分家)。远处的世界不是不存在,是「暂停」。

计划刻与随机刻是世界内部的两种日程(第 4 章的预约日历与抽查彩票),从属于游戏刻。

实体刻是每个实体的私账:每只生物的 AI 决策、物理移动、生命恢复按各自周期结算。它是 TPS 预算里最肥的一栏——卷三第 6 章整章讲「实体才是税」。

红石刻是社区的黑话而非官方的钟——红石玩家习惯把「一次信号传播周期」叫一拍,而它实际计量的是游戏刻(红石中继器的延迟档位是 2、4、6、8 个游戏刻,对半有个历史误会,卷三第 8 章细讲)。这里只需立起意识:一个世界,多本账;社区语言里的「刻」,先问是哪一本。

5红石与刻的错位:一拍不等于一刻

红石值得单独一小节,因为它是 TPS 契约最苛刻的客户。红石设计全部建立在「整数刻延迟」上:中继器加两拍,活塞伸出一拍——玩家据此搭出时序机器。契约兑现时,这些机器像钟表一样准;契约失守(掉 TPS)时,红石不会「乱」,只会「慢」——所有延迟等比例拉长,机器的因果顺序分毫不变。这是 20 TPS 契约最了不起的性质:**慢,但不乱。**因果的次序刻在世界里,不挂在实际耗时上——掉 TPS 的世界是一出全体慢动作的戏,而不是一场演员各抢各戏的混乱。

「错位」指的是语言层面:社区说的「红石刻」与官方的游戏刻在历史上有过半拍的换算误会,加上「刻」还背着一个更新顺序的别义(第 4 章的邻居更新),初学者极易在三口小钟之间迷路。规范用法本书已统一:时间基准一律叫游戏刻,红石语境的「拍」默认指游戏刻,更新通知不叫刻。第 8 章的工程细节展开时,读者手里已经有这把尺子。

6看门狗与玩家可感知的时间

最后是契约的暴力条款。服务器若在某个刻里彻底卡死——某个模组死循环、某个 bug 把主线程锁住——世界连「慢」都做不到了,它停了。此时上场的机制叫看门狗:服务端的一道保险丝,检测到主线程超时无响应,会判定服务器进入不可恢复状态,强制保存并关闭(或重启),并在玩家屏幕上留下一份「服务器崩溃报告」2。名字起得诚实:这条机制存在的意义,就是防止世界在没人看表的时候悄悄烂掉。

玩家对时间的感知,恰好是这套架构的现象学总结。单人掉 TPS,你看到的是「世界慢动作」——没有网络掩盖,因果延迟直接摆在脸上;多人掉 TPS,你看到的是双重异常——既晚到(网络与服务器排队的叠加),又慢放(世界钟拉长),方块半天碎不掉、自己的动作半天没回音。对比一下射击游戏对延迟的处理(各种补偿让「开枪」即时生效),Minecraft 几乎不做这类补偿——因为它负担不起:因果是它的玩法本体,补偿因果等于伪造世界。时间是多人世界的共享真实——这句话在卷三导读里出现过,本章是它的证明:世界可以慢,不可以假;一旦时间的裁决权交给任何一方客户端,共享真实就破产了。

7这一章留下什么

  • 爱好者:服务器卡顿时你抱怨的「卡」,其实是两个部件的两种病——画面卡是显卡的事,世界慢是 CPU 的事;下次报障,先说清是哪一个。
  • 开发者:能抄走的是双钟分离——渲染时间与模拟时间脱钩,模拟掉速时保因果次序、牺牲即时性,玩法才可复现;以及看门狗这类「承认会卡死」的诚实保险。抄不走的是五十毫秒的从容:这个预算是二十年内容复杂度自律换来的——每加一个「每刻都要跑」的系统,都在花同一笔钱。

注释

  1. Minecraft Wiki,《Tick》(Java 版游戏刻为每秒 20 刻、每刻预算 50 毫秒;游戏内一天为 24000 刻即 20 分钟),minecraft.wiki,检索于 2026-09-18;见 https://minecraft.wiki/w/Tick ↩

  2. Minecraft Wiki,《Server.properties》(服务端内置看门狗:主线程超时无响应时判定崩溃,强制保存并关闭服务器),minecraft.wiki,检索于 2026-09-18;见 https://minecraft.wiki/w/Server.properties ↩

On this page