Folia的多核技术小科普:Minecraft 终于开始“真正并行”了吗?
一、背景:Minecraft 传统服务端的执行模型
在传统的 Minecraft 服务端(Spigot / Paper)中,游戏逻辑的执行方式长期保持一种非常稳定但也非常受限的结构:单线程 Tick 循环模型。
在这个模型下,世界中的绝大多数行为都必须依赖同一个主线程进行处理,包括但不限于:
玩家输入与移动更新
实体 AI 行为
方块更新与红石逻辑
区块加载与卸载
插件事件分发
这些逻辑全部在一个 Tick Loop 中顺序执行。
从执行结构上来看,它更接近于:
单线程顺序调度的全局世界模拟器
当服务器规模较小或逻辑较简单时,这种模型是稳定且易于维护的。但当玩家数量、区块数量或红石复杂度提升时,主线程成为唯一瓶颈点。
二、问题:单线程模型的性能上限
单线程 Tick 模型的核心问题在于:
所有计算压力集中在同一个执行线程中
因此会出现以下典型现象:
TPS 随玩家数量增长线性下降
红石或实体密集区域影响全局性能
区块生成或加载造成全局卡顿
插件逻辑竞争主线程时间片
换句话说,服务器的性能上限被单一线程严格限制,而不是被硬件整体性能限制。
即使服务器拥有多核 CPU,大部分核心也无法被有效利用。
三、传统模型的执行方式(单区域统一调度)

该模型可以理解为:
整个世界作为一个统一执行域
所有区块共享同一个 Tick Loop
所有逻辑排队执行
从结构上看:
World
└── Main Thread Tick Loop
├── Player Updates
├── Entity Updates
├── Block Updates
└── Plugin Events
这种结构的特点是:
实现简单
线程安全容易保证
但扩展性极差
本质上,它是一种“单车道执行模型”。
四、Folia 的设计思路:Region-based 并行调度
Folia 的核心变化并不是“优化 Tick”,而是直接改变了世界的执行模型。
它引入了一个关键概念:
Region(区域调度单元)
在 Folia 中,世界不再被视为一个整体执行空间,而是被拆分为多个相互独立的 Region。

五、Folia 的执行结构
在 Region 模型下,执行方式变为:
世界被划分为多个空间区域
每个 Region 拥有独立 Tick 调度
不同 Region 可以由不同线程并行执行
结构类似:
World
├── Region A (Thread 1)
│ ├── Players
│ ├── Entities
│ └── Blocks
│
├── Region B (Thread 2)
│ ├── Players
│ ├── Entities
│ └── Blocks
│
└── Region C (Thread 3)
├── Players
├── Entities
└── Blocks
因此,多线程不再作用于“任务层”,而是直接作用于“世界空间层”。
六、两种不同的执行模型
通过上文,我们总结了两种不同的执行模型:
单区域模型
所有玩家与行为集中在同一个执行域内。
特点:
逻辑统一
执行串行
容易产生瓶颈
多区域模型(Folia)
世界被拆分为多个独立执行单元。
特点:
区域独立 Tick
线程并行执行
负载按空间分散
本质变化是:
从“时间片并发”转变为“空间并发”
七、Folia 的性能提升来源
需要明确一点:Folia 的性能提升并不是“单点加速”,而是来源于负载分散。
其优势主要体现在:
多玩家分布在不同 Region 时可并行处理
区块生成与实体更新负载被拆分
CPU 多核心利用率显著提高
但同时也有明确限制:
单个 Region 内仍然是单线程执行
高密度集中区域仍然存在瓶颈
插件必须适配 Region 线程模型
八、开发模型的变化
Folia 的关键影响不在性能,而在开发范式变化:
在传统 Bukkit/Paper 中:
插件默认运行在主线程
可以自由访问世界状态
异步逻辑需要手动控制
在 Folia 中:
所有操作必须绑定 Region Scheduler
世界访问必须考虑线程归属
错误的跨 Region 调用可能导致异常或数据竞争
因此 Folia 更接近:
“强约束的并行世界模型”
九、总结
Folia 并不是对 Paper 的简单优化版本,而是一次执行模型层面的重构。
它的本质变化可以概括为:
从单线程 Tick 世界,转变为基于空间划分的多线程并行模拟系统
这种设计带来的不是“更快的单点性能”,而是:
更高的整体吞吐能力
更好的多核利用率
更复杂的开发约束