Tick Guard

初期地点のように混み合った場所でも、プレイヤーを制限せず、群れの「考える処理」を減らして全員を快適に保つ。

同じ場所にいるプレイヤーは同じリージョンに入り、リージョンは 1 つの CPU コアで処理されます。そのため、初期地点にある 誰かのモブトラップや混み合った村人の交易所が 1 ティック分以上の時間を使うと、そこにいるだけの人まで重さを感じていました。

Tick Guard は、症状ではなく原因のほうを抑えます。リージョンが重くなりすぎたとき、群れの中で一番重い処理であるモブの 判断 を、群れがいる場所だけで減らします。そのためにリージョン内のプレイヤーが制限されることはありません。

仕組み#

  1. 各リージョンが、自分の処理時間を常に計測します。
  2. 1 秒ごとにチャンクごとのモブの数を数えます。crowd-threshold(16)体以上いるチャンクを 密集 とみなします。
  3. リージョンの平均処理時間が target-mspt(1 ティックに使える 50 ms のうち 40 ms)を超えると、密集チャンクのモブは 判断を 2 ティックに 1 回にします。それでも足りなければ 4 回に 1 回、8 回に 1 回と下げていきます(max-level)。
  4. リージョンに余裕が戻ると(目標の 60% を下回ると)、段階的に元に戻します。

判断を休むティックでも、密集しているモブはすでに決めた行動を続けます。

毎ティック(変わらない) 判断するティックだけ
移動、重力、水流、当たり判定、押し合い 周囲の知覚(誰が見えるか)
今の経路に沿った移動 標的や目標の選び直し
向き、ジャンプ、すでに始めた行動 脳の更新(村人、ピグリンなど)

ブロックには一切触れません。レッドストーン、ピストン、ホッパー、作物、ブロックエンティティは今までどおりに動きます。

間引かれないモブ#

  • どのプレイヤーからも player-radius(8)ブロック以内にいるモブ。戦闘の感覚は変わりません。
  • プレイヤーを狙っているモブ。
  • ペットなど飼い主のいる動物と、リードでつないだモブ。
  • エンダードラゴンとウィザー。

変わること(正直に)#

リージョンが重すぎるときの、密集チャンクの中だけの話です。

  • 密集しているモブの反応が少し遅れます。ぎゅうぎゅうの囲いのゾンビが新しい標的に気づくのが、数ティック遅れるなどです。
  • モブの判断に頼るトラップ(村人の繁殖、アイアンゴーレムトラップなど)は、重い 間だけ 効率が少し下がります。 物理で動くトラップ(水流、落下、圧殺)には影響しません。

リージョンが重すぎないときは、何も変わりません。

計測結果#

重い初期地点:囲いの中にゾンビ 600 体、村人 300 体、牛 500 体。近くに立っているプレイヤーが 2 人、遠くに 1 人。

初期地点のリージョン TPS 近くに立っているプレイヤー
Tick Guard なし 1 ティック 50〜55 ms 18 以前の予算機能で描画距離が 6 に下げられた
Tick Guard あり 1 ティック 32〜35 ms 20.0 制限なし

遠くのプレイヤーは、どちらの場合も影響を受けませんでした(1 ティック約 1 ms)。

原因を探す#

/storia region
2 region(s), busiest first (last 5s):
 world -329, 71: 66% thread, 32.8 MSPT, 20.0 TPS, 2 player(s), 766 chunks
   tick guard: crowded mobs re-plan every 8 ticks (23993 AI updates skipped/s)
   crowd at 8, 8: 572 mobs, mostly zombie
   crowd at 8, 24: 460 mobs, mostly cow
   crowd at 24, 8: 300 mobs, mostly villager

crowd at の数字はチャンクの中心のブロック座標です。そこへ行けば、何があるのかを確認できます。

設定#

tick-guard:
  enabled: true
  target-mspt: 40.0      # リージョンをこの値より下に保つ(1 ティックは 50 ms)
  crowd-threshold: 16    # この数以上のモブがいるチャンクを密集とみなす
  player-radius: 8.0     # プレイヤーからこの距離以内のモブは毎ティック判断する
  max-level: 3           # 1/2^max-level まで間引く(3 なら 8 ティックに 1 回)

サーバーのティックスレッドが満杯で、あるリージョンがプレイヤーの人数分の取り分より多く使っているときは、そのリージョンの 目標を 60% に下げます。1 か所の重さが、ほかのすべての場所の足を引っ張らないようにするためです。

プレイヤーごとの予算 と パフォーマンスと調整 もあわせて参照してください。