测试版公告 欢迎来到 NexusMC 社区!当前站点正在公测中,遇到站点问题请及时前往 “论坛 - 建议反馈” 板块反馈您遇到的问题! 查看公告
Folia

Folia的多核技术小科普:Minecraft 终于开始“真正并行”了吗?

作者:virgil698 发布于 2026/6/13 更新于 2026/6/13 158 浏览 2 回复

一、背景:Minecraft 传统服务端的执行模型

在传统的 Minecraft 服务端(Spigot / Paper)中,游戏逻辑的执行方式长期保持一种非常稳定但也非常受限的结构:单线程 Tick 循环模型

在这个模型下,世界中的绝大多数行为都必须依赖同一个主线程进行处理,包括但不限于:

  • 玩家输入与移动更新

  • 实体 AI 行为

  • 方块更新与红石逻辑

  • 区块加载与卸载

  • 插件事件分发

这些逻辑全部在一个 Tick Loop 中顺序执行。

从执行结构上来看,它更接近于:

单线程顺序调度的全局世界模拟器

当服务器规模较小或逻辑较简单时,这种模型是稳定且易于维护的。但当玩家数量、区块数量或红石复杂度提升时,主线程成为唯一瓶颈点。


二、问题:单线程模型的性能上限

单线程 Tick 模型的核心问题在于:

所有计算压力集中在同一个执行线程中

因此会出现以下典型现象:

  • TPS 随玩家数量增长线性下降

  • 红石或实体密集区域影响全局性能

  • 区块生成或加载造成全局卡顿

  • 插件逻辑竞争主线程时间片

换句话说,服务器的性能上限被单一线程严格限制,而不是被硬件整体性能限制。

即使服务器拥有多核 CPU,大部分核心也无法被有效利用。


三、传统模型的执行方式(单区域统一调度)

0f8b26177c07ed903e56c54daecbd69b_720.png

该模型可以理解为:

  • 整个世界作为一个统一执行域

  • 所有区块共享同一个 Tick Loop

  • 所有逻辑排队执行

从结构上看:

CSS
World
 └── Main Thread Tick Loop
      ├── Player Updates
      ├── Entity Updates
      ├── Block Updates
      └── Plugin Events

这种结构的特点是:

  • 实现简单

  • 线程安全容易保证

  • 但扩展性极差

本质上,它是一种“单车道执行模型”。


四、Folia 的设计思路:Region-based 并行调度

Folia 的核心变化并不是“优化 Tick”,而是直接改变了世界的执行模型。

它引入了一个关键概念:

Region(区域调度单元)

在 Folia 中,世界不再被视为一个整体执行空间,而是被拆分为多个相互独立的 Region。

2ae225893c98754909453860120daab9_720.png


五、Folia 的执行结构

在 Region 模型下,执行方式变为:

  • 世界被划分为多个空间区域

  • 每个 Region 拥有独立 Tick 调度

  • 不同 Region 可以由不同线程并行执行

结构类似:

Java
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 世界,转变为基于空间划分的多线程并行模拟系统

这种设计带来的不是“更快的单点性能”,而是:

  • 更高的整体吞吐能力

  • 更好的多核利用率

  • 更复杂的开发约束

#优化#Folia#Blog

回复列表

结构模式:按父子关系分组显示,更适合追踪分支讨论。