Donut SMPも使ってる!?Foliaサーバーの仕組みを解説

投稿日 最終更新 (21日前)
サーバー運営
Donut SMPも使ってる!?Foliaサーバーの仕組みを解説
Minecraftサーバーのパフォーマンス問題は、長い間「メインスレッド1本」という設計に縛られてきました。
プレイヤーが増えたり、大規模な装置が動いたりするとTPSが落ちるのは、サーバーのほとんどの処理が1つのスレッドで行われるためです。

この問題を根本から解決するために開発されたのが Folia です。

FoliaはPaperMCチームが開発しているサーバーソフトで、Minecraftサーバーに「リージョン単位のマルチスレッド処理」を導入しています。つまりワールドを複数の独立した領域に分割し、それぞれを別スレッドで同時に処理できるようにしたサーバーです。

この記事では、Foliaの基本的な仕組みだけでなく、公式ドキュメントで説明されている リージョンロジック についてもわかりやすく解説します。

Foliaの基本構造


Foliaでは、読み込まれているチャンクをグループ化して 「リージョン」 と呼ばれる単位を作ります。このリージョンが、サーバー処理の基本単位になります。



通常のMinecraftサーバーでは、すべてのチャンクやエンティティの更新がメインスレッドで順番に処理されます。しかしFoliaでは、リージョンごとに独立したTickループがあり、それぞれがスレッドプール上で並列実行されます。

つまり、プレイヤーが遠く離れた場所で活動している場合、それぞれのエリアが同時に処理されるため、CPUの複数コアを効率よく使えるようになります。

リージョンは独立した世界のように動く


Foliaのリージョンは、単なるチャンクの集合ではありません。
それぞれが独立した処理単位として設計されています。

リージョンは自分が所有するチャンクを持っており、そのチャンクは必ず 1つのリージョンだけに所属します。つまり、同じチャンクが複数のリージョンに属することはありません。

この仕組みによって、複数のスレッドが同じデータを同時に変更してしまう「競合」が起きないようにしています。

さらに重要なのは、リージョンがTickしている間に、そのリージョンが所有するチャンクの範囲が広がらないようになっている点です。
もしTick中にリージョンの範囲が変わると、他のリージョンとの競合が起きてしまう可能性があるためです。

リージョンを管理する「Regionizer」


Foliaでは、リージョンの生成や分割を管理する仕組みとして Regionizer(リージョナイザー) というシステムが使われています。

これは ThreadedRegionizer という内部クラスによって実装されており、主に次のような役割を持っています。

  • チャンクの追加や削除に応じてリージョンを作成する
  • 近いリージョン同士を統合する
  • 条件に応じてリージョンを分割する

つまり、プレイヤーの行動によってワールドの負荷分布が変わると、それに合わせてリージョン構造も動的に変化します。

この仕組みによって、Foliaは固定サイズの領域ではなく 動的なリージョン構造 を持つサーバーになっています。

リージョンが独立するためのルール


Foliaでは、リージョンが安全に並列処理できるようにするため、いくつかの重要なルールが定められています。

まず、Tickしているリージョンは他のリージョンと隣接してはいけません。もし隣接してしまうと、互いに影響を与える可能性があるからです。

また、Tick中のリージョンは自分の範囲を拡張することができません。これは処理中に新しいチャンクを取り込んでしまうと、他のリージョンとの競合が起きる可能性があるためです。

さらに、近くに存在するリージョンは最終的に統合される仕組みになっています。これにより、複数のリージョンが境界で衝突するような状態を防いでいます。

こうしたルールがあることで、Foliaは安全にマルチスレッド処理を実現しています。

リージョンは動的に分裂・結合する


Foliaのリージョンは固定サイズではありません。
プレイヤーの位置やチャンクの読み込み状況によって、リージョンは 分裂したり結合したり します。

例えば、プレイヤーが離れた場所に移動すると、1つの大きなリージョンが複数の小さなリージョンに分裂します。逆にプレイヤーが近づくと、リージョン同士が結合して1つになります。

この動的な構造のおかげで、サーバーは常に最適な並列処理を行えるようになっています。

リージョンTickの仕組み


Foliaでは、各リージョンが独自のTick処理を持っています。
MinecraftのTickは通常1秒に20回ですが、このTick処理はリージョンごとに独立して実行されます。

そのため、あるリージョンで重い処理が発生しても、別のリージョンのTickには影響しません。これは従来のMinecraftサーバーにはなかった大きな特徴です。

ただし、ワールド全体に関係する情報は別の場所で管理されます。
例えばワールド時間や天候などは グローバルリージョン という特別な領域で管理されます。

Foliaはどんなサーバーに向いている?


Foliaは革新的な仕組みを持つサーバーですが、すべてのサーバーに向いているわけではありません。

特に効果が出やすいのは、プレイヤーが広い範囲に分散するタイプのサーバーです。例えばSkyBlockやSMPのようなゲームモードでは、プレイヤーが別々の場所で活動するため、リージョンの並列処理がうまく働きます。

逆に、すべてのプレイヤーが同じ場所に集まるサーバーでは、リージョンがほぼ1つになってしまうため、従来のPaperと大きな差が出ない場合もあります。

まとめ


Foliaは、Minecraftサーバーのシングルスレッド問題を解決するために設計された次世代サーバーです。

ワールドをリージョン単位に分割し、それぞれを独立したスレッドで処理することで、CPUの複数コアを効率よく活用できるようになっています。さらに、Regionizerという仕組みによってリージョンは動的に分割・統合され、常に安全な並列処理が行われるよう設計されています。

まだ発展途上のプロジェクトではありますが、Minecraftサーバーの将来を考える上で非常に興味深い技術です。特に大規模サーバーでは、今後重要な選択肢のひとつになっていくかもしれません。