パフォーマンスと調整

Storia の物理演算とワールド生成の最適化、その検証方法、調整する価値のある設定。

Storia の最適化には 1 つのルールがあります。結果はバニラとまったく同じでなければならない。 どの最適化も元のコードと照合していて、 レッドストーンには一切触れていません。

エンティティの押し合い#

モブやアイテムが大量に密集すると、ティックの大半は 押し合い の計算に使われます。各エンティティが重なっている相手を探し、押し返す処理です。 Storia は、バニラがエンティティごとに繰り返している無駄を省いた、より速い方法で相手を探します。それでも次の点は変わりません。

  • 同じエンティティ を、同じ順番 で、同じ強さで押します。
  • 窒息ダメージ(maxEntityCramming)も、その乱数も同じです。
密集したニワトリ 2,000 + 散らばった 2,000 + アイテム 2,000、1 リージョン MSPT
Folia 750
Storia 252

-Dstoria.verifyPush=true を付けると、すべての押し合いをバニラの方法でも計算して照合します。窒息ダメージのオン・オフ両方で 50 万回照合し、差異は 0 件でした。

ワールド生成#

地形生成の時間の大半は、ノイズの計算とブロックの数え上げです。Storia は次の部分を速くしています。

  • パーリンノイズ: 整数の順列テーブルと、あらかじめ計算した勾配テーブル。サンプルごとの割り算を減らしています。
  • オクターブノイズ: 振幅をあらかじめ計算し、割り算を掛け算に置き換えています。
  • チャンクセクションのブロック数え: ブロックの状態を 1 つずつ取り出さず、パレットの番号でまとめて数えます。

同じシードなら地形は バニラと完全に同じ です。ノイズの出力 1,800 万件を、元のコードとビット単位で照合しました。 既存のワールドやシードマップはそのまま使えます。

群れ#

以前は、混み合った場所(モブトラップや村人の交易所)があると、同じリージョンにいる全員が重くなっていました。今は Tick Guard が、 リージョンが重すぎる間だけ群れの AI を間引きます。ブロックやレッドストーンには触れません。

レッドストーン#

Storia はレッドストーン、ピストン、ホッパー、ブロック更新を 変更していません。プレイヤーごとの予算 も、設定しない限りシミュレーション距離を下げません。 Folia と Storia で装置の動きが違う場合は、Issue を作成 してください。

なお Folia 自体は、いくつかの点でシングルスレッドの Paper と動きが異なります(たとえば 2 つのリージョンにまたがる装置は、それぞれ独立して処理されます)。 詳しくは Folia の README を参照してください。

調整する価値のある設定#

距離#

server.properties で:

view-distance=12
simulation-distance=8

シミュレーション距離は、描画距離よりはるかに多くの CPU を使います。2 つの間に差をつけておくと、プレイヤーごとの予算 が働く余地もできます。

チャンク生成スレッド#

/storia pregen は自動で生成スレッドを増やしますが、普段のプレイ中の Folia は、チャンクの生成と読み込みに CPU コアの 4 分の 1 ほどしか使いません。 プレイヤーがよく探索し、CPU に余っているコアがあるなら、config/paper-global.yml で増やせます。

chunk-system:
  worker-threads: 4

リージョンのスレッド#

Folia のリージョン処理のスレッド数は、config/paper-global.yml の threaded-regions.threads です。-1 ならコア数から自動で決めます。 ティックスレッドとチャンク生成スレッドは同じコアを取り合うので、両方にすべてのコアを割り当てないようにしましょう。

Java のオプション#

Aikar's flags は Storia でもよく効きます。ヒープが 12 GB 以上なら ZGC も検討してください。

java -Xms16G -Xmx16G -XX:+UseZGC -jar storia-26.2.jar nogui

計測する#

コマンド 見られるもの
/storia region 負荷の高いリージョン:スレッド使用率、MSPT、TPS、プレイヤー、チャンク。
/storia budget プレイヤーごとのティックスレッドの負荷。
/tps、/mspt Folia のリージョンごとの値。
spark CPU のプロファイル(Folia 対応版を使ってください)。