Minecraft 设计思想
卷三 · 技术实现平台、兼容与长期演化

Minecraft 的技术遗产

卷三结语。从体素到 Tick,从扩展面到 Mod 生态,从兼容成本到两套实现,理解 Minecraft 技术实现的核心特征与长期影响。

从空气也占格子开始,卷三走过了 Minecraft 的完整技术栈:体素数据模型、世界生成、Tick 循环、方块更新、实体与碰撞、物品与库存、红石、客户端渲染、网络同步、区块流送、性能分析、数据包与资源包、Mod 架构、插件与服务器、Java 运行时、Bedrock 实现、兼容与技术债。

19 章技术细节背后,有几个贯穿始终的核心特征。这些特征不是"优点"或"缺点",而是 Minecraft 技术实现的基本形状——它们塑造了这款游戏能做什么、不能做什么,以及为什么会演化成今天的样子。

本章是卷三的结语,不评判、不开药方,只是整理:理解这些技术实现后,对 Minecraft 的认识有什么改变。

1核心特征一:可修改的体素世界

Minecraft 的第一个核心特征是:世界由离散的、可寻址的、可修改的体素组成,在确定性的时间步进中运行。

1.1体素 + Chunk:代价单位

世界不是"连续的 3D 空间",而是"离散的方块网格"。每个方块有明确的坐标 (x, y, z),有明确的状态(Block State),甚至空气也占一个格子(impl/01)。

这个选择带来了什么:

可精确操作:玩家可以指着某个方块说"就是这个",挖掉它、放置它、指向它。连续空间做不到这么精确。

可对账:方块、物品、实体都有明确的状态,客户端和服务器可以"对账"——你说你挖了,服务器检查你的权限、距离、工具,然后决定是否真的挖掉(impl/10)。

代价单位是 Chunk:世界不是"一个方块一个方块"加载,而是"16×16×16 一个 Chunk"加载。Chunk 是存储单位、加载单位、Tick 单位(impl/02、impl/11)。这让无限世界成为可能,但也限制了某些设计(如跨 Chunk 的大型结构需要特殊处理)。

1.2Tick:因果的单位

Minecraft 不是"实时物理",而是"离散时间步进":每秒 20 Tick,每 Tick 50ms。熔炉、活塞、农作物、实体移动都按 Tick 计数(impl/04)。

掉 Tick ≠ 掉帧:

  • 掉帧:画面卡顿,但世界仍在运行;
  • 掉 Tick:世界变慢,熔炉停止、红石出错、怪物冻结。

这是 Minecraft 与大多数 3D 游戏的根本区别:Tick 是因果的单位,不只是渲染的单位。

确定性:

相同的世界、相同的输入、相同的 Tick 序列 → 相同的结果。这让红石机器可以设计、测试、教学;这让技术玩家可以计算"刷怪塔每小时产出"。

代价:

20 TPS 是硬约束。所有逻辑必须在 50ms 内完成,否则掉 Tick。实体数量、红石复杂度、世界生成速度都受这个限制。大型服务器必须用 Paper 等工具优化,甚至接受"低于 20 TPS"(impl/15)。

1.3权威服务器:从单人开始

即使单人游戏,Minecraft 也是"本地服务器 + 客户端"架构(impl/10)。客户端负责渲染和输入,服务器负责世界状态和规则。

为什么单人也要分客户端/服务器:

  • 多人游戏不是"加出来的功能",而是"从一开始就准备好的架构";
  • 客户端可以"说谎"(预测挖掘、预测移动),让手感流畅,但服务器是权威,可以拉回错误的预测;
  • 暂停(Esc)只在"连接数为 1"时有意义;多人服务器没有暂停,因为世界是共享的。

对 Mod 和插件的影响:

  • 客户端 Mod 改渲染、UI、手感;
  • 服务端插件改规则、权限、法律;
  • 两者可以独立存在,也可以配合。

1.4这个特征的长期影响

可修改的体素世界 + 确定性 Tick + 权威服务器,三者结合,让 Minecraft 成为:

  1. 可长期居住的世界:你今天建的房子,明天还在,明年还在;
  2. 可预测的系统:红石机器可以设计、教学、复现;
  3. 可共享的空间:多人游戏不是"各玩各的副本",而是"同一个世界"。

但也带来了约束:

  • Chunk 是最小加载单位,跨 Chunk 的设计需要特殊处理;
  • 20 TPS 是性能瓶颈,大规模内容必须优化;
  • 单线程主循环限制了并行化(Folia 尝试打破这个限制,但会改变玩法)。

2核心特征二:多层扩展面与 Mod 生态

Minecraft 的第二个核心特征是:官方实现只是"基础层",完整的产品包括多层扩展面,以及建立在这些扩展面上的社区生态。

2.1三层扩展面

Minecraft 的扩展能力不是"一个 Mod API",而是三个层次的扩展面:

数据层:官方支持,不需要编程

  • 资源包(Resource Pack):改材质、模型、音效、语言;
  • 数据包(Data Pack):改配方、战利品表、进度、世界生成、部分规则。

数据层的边界是"内容":可以加新的方块材质、新的配方、新的生物群系,但不能加"新的动词"(如"飞行""攀爬")。

插件层:服务端规则,不改客户端

  • Bukkit / Spigot / Paper 插件;
  • 监听事件(玩家加入、方块破坏、实体受伤);
  • 修改规则(权限、领地、经济、小游戏)。

插件的边界是"法律":可以改服务器规则,但不能加原版客户端不认识的方块、物品、实体。

Mod 层:深入引擎,可以改一切

  • Forge / Fabric / NeoForge;
  • 字节码注入(Mixin);
  • 加新方块、新实体、新维度、新机制。

Mod 的边界是"技术可行性":理论上可以改任何东西,但每次大版本更新都要重新适配。

2.2为什么 Mod 是 Minecraft 的核心特征

Mod 不是"可选的周边",而是完整产品的一部分。证据:

工业 Mod 世界:许多玩家玩的不是"原版生存",而是"加了 200 个 Mod 的工业世界"。没有 Forge/Fabric,这些世界根本不存在。

大型服务器:Hypixel、2b2t 等服务器依赖 Paper、插件、Proxy。没有这些工具,单个 server.jar 无法支撑千人在线。

优化 Mod:Sodium、Lithium、Iris 让低配电脑也能流畅运行;Paper、Folia 让服务器 TPS 保持在 20。官方实现的性能不足,由社区工具填补。

跨版本兼容:ViaVersion 让不同版本的客户端连接同一个服务器;Mojang 从未提供官方的跨版本支持。

拿掉这些工具会怎样:

  • Minecraft 仍然可以玩;
  • 但会失去"长期居住"的深度;
  • 会失去"千人服务器"的规模;
  • 会失去"工业 Mod 包"的复杂度。

2.3Java 的偶然选择 → Mod 生态的繁荣

Mod 生态能繁荣,部分因为 Java 的技术特性:

字节码可修改:

  • Java 编译成字节码(.class 文件),Mixin 可以在运行时修改字节码;
  • 对比:C++ 编译成机器码(二进制),几乎无法在运行时修改(impl/16)。

可反编译:

  • 字节码可以反编译回接近源码的形式;
  • 社区可以研究 Minecraft 的内部实现,写出 Forge/Fabric 的映射(Mapping)。

Bedrock 的对照:

Bedrock 用 C++ 重写后,Mod 生态几乎消失(impl/17):

  • C++ 二进制难以修改;
  • 应用商店(App Store、Google Play)禁止动态代码加载;
  • 官方只提供 Add-On(数据层 + 部分脚本),无法深入引擎。

Bedrock 的 Marketplace 有审核、有付费,但创作者的能力被限制在"内容"层,无法像 Java 版的 Mod 那样"加新机制"。

2.4为什么 Mojang 不提供官方 Mod API?

这是一个经常被问的问题。答案是:官方 API 会冻结内部实现。

如果 Mojang 承诺"Mod API 向后兼容":

  • 内部实现无法重构(会破坏 API);
  • 性能优化无法进行(会改变 API 行为);
  • 1.13 的 Flattening、1.20.5 的物品组件化都无法完成。

社区的"非官方 API"(Forge/Fabric)反而更灵活:

  • Mojang 不承诺兼容,可以自由重构;
  • Forge/Fabric 承担"适配新版本"的成本;
  • Mod 作者承担"每次大版本重写"的成本。

代价由谁承担:

  • 官方:可以快速迭代,不被历史 API 拖累;
  • Forge/Fabric:每次大版本都要更新映射、重写核心;
  • Mod 作者:每次大版本都要重新适配(impl/18)。

这不是"Mojang 懒",而是权衡:速度 vs 稳定。Minecraft 选择了速度,把稳定的成本交给社区。

2.5Mod 生态的长期影响

Minecraft 能活 15 年,部分因为 Mod:

  • 原版内容有限,但 Mod 提供了无限可能;
  • 每个玩家可以"定制自己的 Minecraft";
  • 社区创作的内容远超官方。

但 Mod 也带来了兼容地狱:

  • 每次大版本更新,Mod 作者要重新适配;
  • 某些大型 Mod(如工业 Mod)会"冻结在某个版本";
  • "整合包发布夜"(impl/18):新版本发布后,等待 Mod 更新的漫长时期。

Bedrock 的教训:

Bedrock 没有 Mod 生态,社区活力明显弱于 Java 版。Marketplace 有付费内容,但创作者被限制在"数据层",无法像 Mod 那样"重新发明游戏"。

结论:

Mod 不是"Minecraft 的一个功能",而是"Minecraft 是什么"的一部分。完整的 Minecraft = 官方客户端/服务器 + Mod Loader + 社区工具 + Wiki。

3核心特征三:兼容高于创新

Minecraft 的第三个核心特征是:当"向后兼容"与"修复错误"冲突时,通常选择兼容。

3.1为什么不能"推倒重来"

技术债在大多数软件项目中是"应该偿还的东西"。但在 Minecraft,某些"债"是资产,偿还会破坏生态(impl/18)。

存档兼容:

  • 玩家的世界可能建造了几年、几千小时;
  • 如果新版本无法打开旧存档,等于"宣布玩家的时间作废";
  • 所以每次存档格式升级,都必须提供迁移工具(DataFixerUpper)。

协议兼容:

  • 官方不保证协议向后兼容,每个版本的 Packet 可能不同;
  • 社区工具(ViaVersion)填补了这个空缺;
  • 代价:每次协议更新,ViaVersion 都要重新适配。

Mod 兼容:

  • 每次大版本更新,内部实现变化,Mod 需要重写;
  • 1.13 Flattening、1.20.5 物品组件化,都是"必要的重构",但让所有 Mod 失效。

玩法兼容:

  • Quasi-Connectivity(活塞的"准连接")本是 Bug,但已成为红石核心特性;
  • 修复 QC 会破坏成千上万的红石机器、教程、Wiki;
  • 所以 Mojang 把它标记为 WAI(Working As Intended),永久保留。

3.2兼容的三种结局

可偿还的债:通过"重构窗口"偿还

  • 1.13 Flattening:数字 ID → 命名空间标识符;
  • 1.20.5 物品组件化:非结构化 NBT → 结构化组件;
  • 条件:旧设计成为瓶颈 + 社区准备好承受兼容成本。

必须保留的债:已成为"特性"

  • Quasi-Connectivity;
  • 某些 Redstone 更新顺序;
  • 实体碰撞的历史行为。

修复这些"Bug"会破坏玩法,所以永久保留。

社区承担的债:由社区工具缓解

  • 客户端性能:Sodium / Lithium;
  • 服务器性能:Paper / Folia;
  • 跨版本兼容:ViaVersion。

官方不承诺优化或兼容,社区工具填补空缺。

3.3哪些"债"其实是"资产"

可切开的字节码(Java):

  • 让 Mod 生态成为可能;
  • 代价:每次大版本 Mod 都要重写。

未签名的协议:

  • Mojang 可以快速迭代;
  • 代价:跨版本兼容由社区承担(ViaVersion)。

历史行为(如 QC):

  • 让红石成为 Turing-complete 的"可误用系统";
  • 代价:内部实现无法优化,Bedrock 无法兼容。

判断标准:

偿还这个债,会不会失去某个已经成立的"作者席"(Mod、Plugin、玩法)? 如果会,就先别偿还。

4两套实现的对照

Java Edition 和 Bedrock Edition 是"同一个游戏"的两套实现,但它们的技术选择和生态已经分叉(impl/17)。

维度Java EditionBedrock Edition
语言JavaC++
性能启动慢、内存占用高、GC 停顿启动快、内存占用低、无 GC
跨平台Windows / macOS / LinuxWindows / macOS / iOS / Android / Xbox / PS / Switch
Mod 生态Forge / Fabric,深入引擎Add-On(数据层 + 脚本),无法深入引擎
扩展审核社区自治,无审核Marketplace 审核,官方管理
协议未签名,社区工具跨版本统一协议,官方支持跨平台联机
红石Quasi-Connectivity 存在无 QC,更"正确"但不兼容
存档格式Anvil (Region + NBT)LevelDB (键值数据库)

两套实现说明了什么:

  1. 语言可以换,但会影响 Mod 生态、性能特性、跨平台能力;
  2. 扩展模型塑造社区文化:Java 是"自由 Mod",Bedrock 是"审核 Marketplace";
  3. 兼容成本阻止统一:Java 和 Bedrock 的存档、协议、玩法已经分叉,无法合并;
  4. Parity(功能对等)只能在内容层面对齐:方块、生物、生物群系可以对齐,但红石、战斗、扩展模型已经无法统一。

Bedrock 不是"Java 的优化版",而是为了不同平台和商业模式的另一套实现。两者各有优劣,不存在"谁更好",只有"选择带来什么"。

5这一章留下什么

卷三从体素数据模型走到兼容成本,揭示了 Minecraft 技术实现的三个核心特征:可修改的体素世界(离散格子 + 确定性 Tick + 权威服务器),多层扩展面与 Mod 生态(数据层 + 插件层 + Mod 层,社区工具是完整产品的一部分),兼容高于创新(某些"债"是资产,偿还会失去生态)。

对爱好者来说,理解技术实现后,对 Minecraft 的认识有三个改变。TPS 不是帧率,掉 Tick 掉的是因果——熔炉会停、红石会错、怪物会冻结,不只是"画面有点卡";服务器 TPS 低于 20 意味着整个世界变慢。Mod 和插件不是"周边",而是完整产品的一部分;没有 Forge/Fabric,工业 Mod 世界不存在;没有 Paper/Spigot,千人服务器无法运行;没有 Sodium/Lithium,低配电脑无法流畅游戏;完整的 Minecraft = 官方客户端/服务器 + Mod Loader + 社区工具 + Wiki。"Bug"可以是"特性",Quasi-Connectivity 本是活塞的历史 Bug,但已成为红石核心,修复会破坏成千上万的机器和教程;这不是"Mojang 不修 Bug",而是"兼容高于正确"的权衡。

对开发者来说,能抄走的技术思路是这些。体素 + Chunk + Tick,离散的、可寻址的体素让世界可修改、可对账;Chunk 是代价单位,让无限世界成为可能;确定性 Tick 让因果可预测、可复现。权威服务器从单人开始,即使单人游戏也是 Client-Server 架构,多人不是"加出来的功能";客户端可以预测,但服务器是权威。分层扩展面,数据层(资源包、数据包)改内容,插件层改服务端规则,Mod 层深入引擎;三层各有门槛和能力边界。兼容是核心承诺,存档必须能在新版本打开,这是对玩家的承诺;迁移工具(DataFixerUpper)是必要成本;某些"Bug"成为特性后,修复 = 破坏。社区工具的角色,官方不必包揽一切,某些职责可以由社区承担(优化、跨版本兼容、深度扩展);但要认识到:社区工具不是"可选增强",而是"完整产品的一部分"。不能照抄的是 Minecraft 的具体实现,20 TPS 的具体数值、Anvil 存档格式、Quasi-Connectivity 的具体行为、Java 字节码注入、Paper 的优化补丁——这些是历史选择和具体约束,不是"沙盒世界"的必然形状。真正值得继承的是设计原则,可修改的世界需要离散体素和代价单位;可预测的世界需要确定性 Tick;可共享的世界需要权威服务器;可长期居住需要存档兼容承诺;可深度扩展需要多层扩展面;可误用系统需要允许"Bug 成为特性"。

卷三到此结束。技术实现不是"实现细节",而是设计的具体形状。某些看似"应该改进"的地方,可能改进后会破坏其他部分。某些看似"历史包袱"的东西,可能是生态繁荣的前提。理解这些,才能理解 Minecraft 为什么是今天的样子。

On this page