RE:NODE

Minecraft14 мин чтения

Лаги от жителей и мобоферм в Minecraft

Почему жители и мобофермы съедают время тика, как их посчитать, какие настройки Paper и Spigot их усмиряют и какие правила для ферм игроки действительно примут.

0 прочтений

На большинстве survival-серверов, проработавших несколько месяцев, самая большая строка в профайлере - не плагин. Это жители: две сотни в торговом зале, размножитель, который никто не выключил, и железная ферма на каждой второй базе, а сразу за ними - мобофермы, построенные под всем этим. Житель обходится за тик гораздо дороже зомби или коровы, потому что у него работает полноценный «мозг»: поиск рабочего места, поиск кровати, сплетни, проверки на панику и призыв голема. Решение не в том, чтобы запретить жителей. Нужно их посчитать, держать каждого в ячейке, откуда он никуда не может проложить путь, ограничить размножители, подстроить три-четыре настройки Paper и Spigot и опубликовать правила для ферм до того, как люди начнут строить, а не после.

Это руководство предполагает Paper или его форк. Общие настройки дистанций и спавна разобраны в статье Оптимизация Paper; здесь мы глубже разберём две группы сущностей, которые создают больше всего проблем на зрелых серверах, и правила, которые не дают проблеме вырасти снова.

Почему житель дороже любого другого моба#

После переработки деревень в 1.14 каждый житель работает на той же системе ИИ, что и новые мобы: набор сенсоров, которые смотрят на мир, память, где хранится найденное, и поведения, которые действуют на основе этой памяти. У большинства мобов их по несколько штук. У жителей - десятки, и некоторые из них дорогие.

  • Поиск точек интереса (POI). Безработный житель или житель, потерявший рабочее место, раз за разом сканирует окрестности в поисках свободного верстака, кровати или колокола. Эти поиски обходят хранилище POI соседних чанков. Один такой житель - ерунда; зал из пятидесяти безработных, которые делают это каждые несколько секунд, - уже заметная доля тика.
  • Поиск пути. Каждый раз, когда житель решает пойти на работу, в кровать или к колоколу, он вычисляет путь. В открытой комнате пути длинные и часто пересчитываются. В ячейке размером в один блок путь - это один шаг или он невозможен, что гораздо дешевле.
  • Сплетни и логика големов. Жители обмениваются данными о репутации и проверяют, не пора ли призвать железного голема. На железной ферме именно это вам и нужно, и это постоянная работа.
  • Распорядок дня. Жители меняют занятие в течение дня, и каждая смена запускает новые решения.

Корова, для сравнения, бродит, ест траву и иногда размножается. В профиле тысяча коров в загоне выглядит плохо в основном из-за коллизий; несколько сотен жителей выглядят плохо из-за своих мозгов. Это ключевое различие для всего, что идёт дальше: жители дорогие, потому что думают, а большинство других фермерских мобов дорогие, потому что их слишком много.

Посчитайте, прежде чем что-то менять#

Гадать, какая база виновата, - верный способ удалить не ту ферму и потерять игрока. Сначала измерьте.

code
/paper entity list/paper entity list minecraft:villager/execute if entity @e[type=minecraft:villager]/mspt

/paper entity list выводит количество сущностей по типам в загруженных чанках, а если указать тип, перечисляет чанки, где их больше всего, с координатами. Это самая полезная команда для всей этой темы: она сообщает, что 140 из ваших 310 жителей находятся в одном чанке на x: 1840, z: -620, и вы можете пойти и посмотреть. Вариант с /execute if entity возвращает количество средствами ванильной игры и работает на любом сервере. /mspt показывает, важно ли всё это уже сейчас: если медиана 15 мс, у вас есть запас, и длинный список жителей - не повод для паники.

Помните, что эти команды видят только загруженные чанки. Торговый зал на базе, владелец которой не в сети, не тикает и не отображается. Проверьте ещё раз, когда сервер загружен или после того, как владелец зайдёт, прежде чем признать базу невиновной.

Затем снимите профиль. Метод описан в статье Как читать отчёт spark; искать нужно поведения и сенсоры жителей (названия вроде получения POI, вторичного сенсора POI, сенсора ближайшей кровати), а также общие записи тика сущностей и поиска пути. Если работа мозгов жителей занимает несколько процентов тика, оставьте настройки в покое и займитесь тем, что стоит на вершине отчёта.

Что показывает профильВероятная причинаПервое исправление
Высокие получение POI и сенсорыБезработные или бродячие жителиДайте каждому жителю рабочее место, посадите в ячейки
Высокий поиск путиЖители в открытых комнатах или размножителяхЯчейки в один блок, размножители поменьше
Высокие коллизии сущностейМобы набиты в загон или фермуКамера убийства, меньше зависимости от maxEntityCramming
Высокий спавн мобовПопытки спавна вокруг множества игроковticks-per.monster-spawns, радиус спавна
Высокий тик предметовВыход фермы некуда деватьВоронки для сбора, радиус слияния

Торговые залы и размножители без лишних затрат#

Самый дешёвый житель - тот, у которого есть работа, который заперт в ячейке один на один с верстаком в пределах досягаемости и не видит кровати, к которой мог бы захотеть пойти. Хорошо построенный торговый зал - не проблема для производительности. Плохо построенный - классическая проблема.

Что делает зал дешёвым:

  1. Один блок на жителя, сплошной пол и стены, верстак вплотную. Житель добирается до работы, никуда не прокладывая путь.
  2. У каждого жителя есть работа. Житель, потерявший верстак (потому что кто-то сломал его ради новых сделок и забыл поставить обратно), постоянно его ищет. Безработных и простаков в ячейках нужно отправлять в размножитель или убирать.
  3. Никаких кроватей рядом с залом, если конструкция их не требует. Кровати дают жителям ещё один объект для поиска и похода.
  4. Никакого открытого пространства над ячейками или рядом с ними. Зазоры позволяют жителям вычислять пути, ведущие в никуда.

Размножители опаснее, потому что производят жителей бесконечно. Автоматический размножитель с запасом еды и кроватями работает, пока владелец в сети, и всё, что он производит и что никто не забирает, стоит в зоне ожидания - без дела и в постоянном поиске. Размножитель должен либо подавать жителей прямо в зал с фиксированным числом ячеек, либо выключаться, когда зал заполнен. Попросите строителей предусмотреть выключатель - обычно это удаление еды или кроватей - и пользоваться им.

Лечение зомби-жителей ради скидок - ещё один источник оборота жителей. Само по себе это нормально; проблема возникает, когда блок ячеек с недолеченными жителями оставляют с зомби внутри, потому что зомби в загруженном чанке продолжают прокладывать путь к жителям, до которых не могут дотянуться.

Настройки Paper и Spigot для жителей#

Paper добавляет набор настроек для жителей поверх радиусов активации Spigot. Значения ниже - то, что генерируют свежие сборки; ключи переезжают между версиями, поэтому перед правкой поищите их в своих файлах.

spigot.yml (world-settings.default)
entity-activation-range:  villagers: 32  tick-inactive-villagers: true  villagers-active-for-panic: true  villagers-work-immunity-after: 100  villagers-work-immunity-for: 20  wake-up-inactive:    villagers-every: 600    villagers-for: 100    villagers-max-per-tick: 4

Что делает каждая из них и чем грозит её изменение:

НастройкаПо умолчаниюЭффект изменения
villagers32Радиус активации в блоках. Меньше - и дальние жители перестают тикать
tick-inactive-villagerstruefalse полностью останавливает тик неактивных жителей. Большая экономия, сделки обновляются только рядом с игроками
villagers-active-for-panictrueДержит паникующих жителей активными. Нужно для железных ферм, где жителей пугают
villagers-work-immunity-after / -for100 / 20Как долго житель остаётся активным после работы
Значения wake-up-inactive для жителей600 / 100 / 4Как часто будить неактивных жителей, на сколько и сколько за тик

tick-inactive-villagers: false - самая сильная из них. С ней житель вне радиуса активации всех игроков не делает вообще ничего: ни поиска POI, ни призыва големов, ни обновления сделок. Видимый эффект - торговые залы и железные фермы работают только тогда, когда кто-то стоит рядом, а большинство игроков так ими и пользуется. Невидимый эффект - зал из двухсот жителей на почти заброшенной базе, чанки которой держит загруженными сосед, перестаёт стоить что-либо.

В собственном конфиге миров Paper есть две частоты тика для жителей:

config/paper-world-defaults.yml
tick-rates:  behavior:    villager:      validatenearbypoi: -1  sensor:    villager:      secondarypoisensor: 40

Частота сенсора задаётся в тиках; если поднять secondarypoisensor до 80 или 100, стоимость сенсора, ищущего вторичные точки интереса вроде компостеров для фермеров, упадёт вдвое и больше. validatenearbypoi со значением -1 означает ванильное поведение; положительное значение заставляет проверку выполняться реже. Оба параметра замедляют реакцию жителей на изменения вокруг - фермер чуть дольше находит только что поставленный компостер, - и ни один не ломает торговлю.

Если у вас Purpur, в purpur.yml есть опция «лоботомии» жителей, которая отключает ИИ у жителей, неспособных двигаться, - это ровно случай ячейки в один блок. Она эффективна и меняет поведение так, что на это полагаются некоторые торговые залы (в некоторых версиях лоботомированные жители иначе обновляют сделки), поэтому прочитайте актуальную документацию Purpur и проверьте на копии. Стоит ли вообще переходить на другой форк, разобрано в статье Purpur и Pufferfish. Для обычного Paper существуют плагины, делающие то же самое; это грубые инструменты, а настройки выше обычно дают большую часть результата.

Мобофермы и лимит мобов#

Мобофермы стоят иначе. Ферма враждебных мобов работает так: мобы спавнятся в тёмной зоне, пока всё остальное пространство вокруг освещено или непригодно для спавна, а затем перемещаются к точке убийства. Затраты за тик складываются из трёх частей: попытки спавна, ИИ и движение мобов до смерти, а также предметы и опыт, которые они роняют.

Лимит мобов - то, что связывает ферму одного игрока со всеми остальными. С включённым в Paper per-player-mob-spawns (по умолчанию включено) у каждого игрока свой бюджет - по умолчанию monsters: 70 в bukkit.yml, - и мобы рядом с ним учитываются в этом бюджете. Из этого следуют три вещи:

  • Фермы работают быстрее, когда лимит не заполнен в другом месте. Игрок у фермы, чей лимит заполнен мобами в соседних пещерах, получает меньше спавнов на ферме. Игроки учатся освещать пещеры, и это нормально.
  • Именованные и постоянные мобы занимают лимит. Загон зомби с бирками или коллекция постоянных мобов навсегда заполняет лимит и убивает ферму. К тому же они тратят тики впустую.
  • Снижение лимита пропорционально снижает выход ферм. Уменьшить monsters до 50 на загруженном сервере - законный компромисс, и он сокращает выход каждой фермы враждебных мобов примерно на одну и ту же долю. Объявите об этом.

Сами попытки спавна по умолчанию выполняются каждый тик. ticks-per.monster-spawns: 2 в bukkit.yml вдвое сокращает число попыток, и в игре это сложно заметить. У спавнеров в Paper отдельная частота - tick-rates.mob-spawner: 1 в paper-world-defaults.yml; если поднять её до 2, стоимость каждого гриндера на спавнере упадёт вдвое, а сами они пропорционально замедлятся.

nerf-spawner-mobs: true в spigot.yml лишает мобов из спавнеров ИИ. Они по-прежнему падают и сносятся водой - так их перемещает большинство гриндеров на спавнерах, - поэтому многие конструкции продолжают работать. Конструкции, где мобы должны идти или прокладывать путь к цели, перестают. Это решение для правил ферм, а не тихая подстройка.

Загоны с животными, давка и мобы, которые никогда не исчезают#

Мирные животные - вторая половина проблемы, и в одном отношении они хуже: выращенные животные никогда не исчезают. Коровья ферма, которая размножает животных каждые пять минут и никогда их не забивает, растёт, пока её что-нибудь не остановит.

code
/gamerule maxEntityCramming

maxEntityCramming по умолчанию равен 24: когда в одном блоке оказывается больше мобов, они получают урон от удушья. Это ванильный предохранительный клапан, и некоторые фермы специально используют его как механизм убийства. Поднимать его, чтобы ферма перестала убивать животных, - плохая идея: проверки коллизий плохо масштабируются, когда сущности скапливаются, именно поэтому коллизии сущностей так заметны в профилях с большими загонами.

collisions.max-entity-collisions в paper-world-defaults.yml (по умолчанию 8) ограничивает, сколько коллизий одна сущность обрабатывает за тик, и это уже смягчает худший случай. Но запретить игроку держать 600 куриц эта настройка не может. Работающие правила - социальные:

  • Лимит животных на базу - многие серверы используют что-то вроде 50 особей каждого вида в одной зоне, - при этом поощряются конструкции с автоматическим забоем.
  • Куриные фермы должны убивать взрослых особей или использовать конструкции с жаркой, а не копить кур.
  • Разводить можно; держать сотни особей на племя - нельзя.

Для принудительного ограничения есть chunks.entity-per-chunk-save-limit в paper-world-defaults.yml, который ограничивает, сколько сущностей данного типа сохраняется в одном чанке. Он задуман как защита от чанков, которые не могут загрузиться, а не как лимит для ферм, и при сохранении чанка молча удаляет излишек. Используйте его с щедрыми значениями для снарядов и сфер опыта; не применяйте его для контроля коров, если не предупредили всех.

Железные, рейдовые и золотые фермы#

Эти три стоит выделить отдельно: именно их обвиняют чаще всего, и они не всегда виноваты.

Железным фермам нужны жители, которые паникуют или посплетничали и давно не видели голема. Современные конструкции используют небольшое число жителей - часто трёх - и зомби, чтобы их пугать. Одна хорошо построенная железная ферма стоит дёшево. Двадцать железных ферм на одном сервере, каждая со своими жителями и зомби, умножают затраты на двадцать, а големы, которых они производят, превращаются в выпавшие предметы, которые нужно собирать. Если железа в избытке, спросите, нужна ли каждой базе своя ферма.

Рейдовые фермы дорогие, пока работают: рейды спавнят волны разбойников, которые прокладывают пути на большие расстояния, поэтому entity-activation-range.raiders выше, чем у других мобов (по умолчанию 48), и снижать его не стоит. Рейдовая ферма, на которой часами стоят в AFK, производит тотемы и изумруды быстрее, чем их способна переварить любая экономика, и непрерывно гоняет ИИ рейдов. Временное окно или правило, запрещающее AFK на рейдовых фермах ночью, вполне разумно.

Золотые фермы на крыше Нижнего мира или на порталах производят огромное количество зомбифицированных пиглинов и золотых самородков. По отдельности мобы дешёвые; проблема в дропе. Золотая ферма без полного сбора предметов засыпает землю самородками и гнилой плотью, а это уже проблема числа сущностей, разобранная в статье Очистка сущностей и ClearLag.

Общая нить - AFK. Ферма дешёвая, когда один игрок пользуется ею двадцать минут; она дорогая, когда работает восемь часов за ночь, потому что владелец уснул за пультом. Если на вашем сервере разрешён AFK, подумайте, разрешён ли AFK именно на фермах.

Правила для ферм, которые игроки примут#

Конфигурация решает не всё. На серверах, где не ругаются из-за лагов, правила записаны до постройки первой фермы, а администраторы применяют их ко всем одинаково.

  1. Укажите дистанцию симуляции и радиусы активации. Строители проектируют, исходя из чисел. Если они знают, что фермы работают только в пределах шести чанков, а мобы просыпаются только в радиусе 24 блоков, они будут строить с учётом этого и не станут сообщать о результате как о баге.
  2. Устанавливайте лимиты на базу, а не на игрока. Число жителей в зале, животных в загоне, количество гриндеров на спавнерах.
  3. Требуйте сбора. Каждая ферма должна сдавать добычу в хранилище или систему «убить и собрать». Никаких предметов на земле.
  4. Требуйте выключатель для размножителей, рейдовых ферм и всего, что работает на таймере.
  5. Опубликуйте, что происходит с фермой, нарушающей правила. Сначала сообщение, потом отключение фермы, потом удаление. Никогда не удаляйте молча.
  6. Проверяйте новые мегапостройки до того, как они заработают, а не после скачка лагов.

Дополните правила инструментами, которые позволяют персоналу действовать без догадок: /paper entity list для подсчёта, spark для доказательств и плагин логирования гриферства, чтобы видеть, кто поставил трёхсотую кровать. Человеческая сторона разобрана в статье Правила, модерация и персонал, а логирование - в статье Защита от гриферства и античит.

На RE:NODE консоль показывает вывод /mspt и /paper entity list без фильтров, а рядом - графики CPU и памяти относительно реальных лимитов вашего тарифа, так что можно включить ферму и сразу увидеть, сколько она стоит. CPU жёстко ограничивается купленной долей: сервер, упёршийся в 100%, работает медленно, но не сломан, и за это его никогда не приостанавливают. Но если одна база способна загрузить его до предела, это проблема правил раньше, чем проблема тарифа. Почему здесь не поможет больше памяти, объясняет статья CPU или RAM для игровых серверов.

FAQ#

Сколько жителей - это слишком много для сервера?

Фиксированного числа нет; всё зависит от того, как их содержат. Несколько сотен жителей с работой в ячейках по одному блоку стоят меньше, чем пятьдесят, свободно бродящих по деревне. Следите за /mspt, пока загружен самый большой зал, и решайте по нему, а не по количеству.

Ломает ли tick-inactive-villagers: false торговые залы?

Нет. Торговля работает всегда, когда игрок достаточно близко, чтобы торговать, потому что он находится внутри радиуса активации. Прекращается активность, когда рядом никого нет: обновление сделок, размножение и спавн големов вдали от игроков. Для большинства залов это незаметно.

Почему наша мобоферма стала медленнее, когда сервер вырос?

Обычно потому, что лимит мобов распределяется иначе или его понизили. При спавне на игрока мобы рядом с вами учитываются в вашем бюджете; больше игроков поблизости, освещённые пещеры и постоянные мобы - всё это меняет скорость. Проверьте bukkit.yml и спросите, нет ли у кого-нибудь мобов с бирками рядом с фермой.

Стоит ли убить всех жителей вне торговых залов?

Не без предупреждения. Бродячие жители в естественных деревнях дешёвые, когда рядом никого нет, потому что находятся вне радиуса активации. Целиться нужно в безработных жителей в зонах ожидания и в переполненные размножители, и владельца нужно предупредить заранее.

Поможет ли повышение maxEntityCramming, если животные гибнут в загонах?

Животные перестанут гибнуть, а сервер станет медленнее. Сущности, сваленные в одно место, - именно то, что делает проверки коллизий дорогими. Дайте животным больше места или держите их меньше.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000