Tick Guard
初期地点のように混み合った場所でも、プレイヤーを制限せず、群れの「考える処理」を減らして全員を快適に保つ。
同じ場所にいるプレイヤーは同じリージョンに入り、リージョンは 1 つの CPU コアで処理されます。そのため、初期地点にある 誰かのモブトラップや混み合った村人の交易所が 1 ティック分以上の時間を使うと、そこにいるだけの人まで重さを感じていました。
Tick Guard は、症状ではなく原因のほうを抑えます。リージョンが重くなりすぎたとき、群れの中で一番重い処理であるモブの 判断 を、群れがいる場所だけで減らします。そのためにリージョン内のプレイヤーが制限されることはありません。
仕組み#
- 各リージョンが、自分の処理時間を常に計測します。
- 1 秒ごとにチャンクごとのモブの数を数えます。
crowd-threshold(16)体以上いるチャンクを 密集 とみなします。 - リージョンの平均処理時間が
target-mspt(1 ティックに使える 50 ms のうち 40 ms)を超えると、密集チャンクのモブは 判断を 2 ティックに 1 回にします。それでも足りなければ 4 回に 1 回、8 回に 1 回と下げていきます(max-level)。 - リージョンに余裕が戻ると(目標の 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 か所の重さが、ほかのすべての場所の足を引っ張らないようにするためです。
プレイヤーごとの予算 と パフォーマンスと調整 もあわせて参照してください。