
ViewDistanceTweaks
Плагин ViewDistanceTweaks для Майнкрафт автоматически подстраивает дистанцию просмотра и симуляции под нагрузку сервера. Больше расстояния, когда есть запас, меньше - до того, как игроки заметят лаги.
ViewDistanceTweaks
Твой сервер. Твоя производительность.
Автоматически выставляет дистанцию просмотра и симуляции для каждого мира, исходя из того, что сервер реально может вытянуть в данный момент.
Ставишь дистанцию в server.properties - и она применяется к самому худшему моменту, который только может случиться. Десять игроков онлайн в 3 ночи - ты раздаёшь чанки, которые никому не нужны. Шестьдесят человек на ивенте - и та же цифра роняет TPS в пол.
Этот плагин двигает число за тебя. Он следит за MSPT и тем, сколько чанков реально грузят игроки, отдаёт дистанцию, когда есть запас, и убирает её до того, как кто-то заметит лаги. У каждого мира свой минимум и максимум, так что Незер может сидеть на 6, пока основной мир бегает на 16.
Ничего подключать не надо. Кинул джарник, перезапустил - дефолты уже делают что-то разумное.
Требования
| Paper 1.21.x / 26.x | обязательно, papermc.io |
| Folia | поддерживается, дистанции работают через регионализированный планировщик |
| PlaceholderAPI | опционально, только для плейсхолдеров, Modrinth |
| EssentialsX | опционально, только для чтения AFK-статуса, если включено AFK-ограничение, Modrinth |
Как это работает
MSPT замеряется каждый тик. Каждые ticks-per-check (по умолчанию 30 секунд) каждый мир проверяется один раз, и решение - увеличить, уменьшить или оставить как есть.
Три режима. proactive работает от бюджета чанков: ты говоришь, сколько тикающих и нетикающих чанков сервер должен тянуть в сумме, а плагин решает, какая дистанция влезает. reactive игнорирует количество чанков и смотрит только на MSPT относительно двух порогов. mixed запускает оба и берёт более пессимистичный результат - это правильный ответ на большинстве серверов.
Он не повторяет ошибок. Линейная регрессия по последним 30 минутам пар "количество чанков - MSPT" предсказывает, сколько будет стоить следующий шаг вверх. Если прогноз оказывается выше порога уменьшения - увеличение просто не происходит. Именно это ломает цикл "поднял - лаганул - сбросил - поднял снова".
Средние значения врут, поэтому смотрят на разброс. Сервер может держать комфортные 30 мс в среднем, пока отдельные тики прыгают от 8 до 55 - и играть на нём никто не хочет. Стандартное отклонение по последним 100 тикам Paper ловит это. Если оно выше variance-threshold, а среднее достаточно высокое, чтобы число имело смысл - сервер считается перегруженным, даже если среднее выглядело нормально.
Уменьшать можно быстрее, чем увеличивать. max-increase-step и max-decrease-step - это отдельные значения. Частая пара: 1 и 4: поднимаемся по одному шагу, падаем сразу на все. Сверху revert-increase-if-overloaded перепроверяет сразу после увеличения и откатывает его обратно, если стало хуже - вместо того чтобы ползти вниз следующие десять циклов.
Сначала симуляция, потом просмотр. С включённым prioritize-simulation-distance дистанция просмотра не трогается, пока дистанция симуляции не достигнет минимума мира. Симуляция - это то, что жрёт TPS. Просмотр - то, что видят игроки. Трать дешёвое в первую очередь.
Системы безопасности
MSPT - не единственное, на что стоит реагировать, поэтому несколько подсистем следят за другими сигналами. Всё, кроме защиты памяти, выключено по умолчанию.
| Защита памяти | Свободная куча ниже min-free-percent блокирует любое увеличение независимо от MSPT. Сервер может простаивать на 20 мс и всё равно быть в одном кольце чанков от того, чтобы провести весь тик в GC - а к моменту, когда MSPT это покажет, будет уже поздно. Включено по умолчанию на 15%. |
| Защита генерации чанков | Считает чанки, которые реально генерируются, а не просто читаются с диска. Если скорость генерации превышает порог - останавливает увеличение и может принудительно снизить дистанцию просмотра, пока генерация не успокоится. Это тот случай, когда кто-то летит на элитрах по свежему миру. |
| AFK-ограничение | Игроку у спавна не нужно 16 чанков. Их личная дистанция падает до AFK-значений, а освободившееся идёт обратно в общий бюджет. Использует AFK-статус EssentialsX, если он установлен (так /afk срабатывает сразу), иначе таймер бездействия Paper. |
| Масштабирование плотности | Двадцать игроков на одной ферме грузят почти одни и те же чанки. Формула proactive предполагает двадцать отдельных колец и голодает мир ни за что. Когда достаточно игроков сидят близко друг к другу - мир получает бонусную дистанцию пропорционально тому, сколько его населения находится в этом кластере. |
| Взвешивание сложности | Океанский чанк - бесплатно, чанк с сортировщиком на 500 воронок может сам по себе съесть тик, а (2d+1)² считает оба как один. Эта система семплирует ограниченное количество чанков вокруг игроков каждый цикл и выводит средний множитель - так редстоун-тяжёлый мир получает меньший бюджет, чем мир полный воды. |
| Экстренная помощь | Последнее средство. Мир уже на минимуме симуляции и просмотра, MSPT всё ещё за порогом, отнимать больше нечего из дистанций. Тогда сбрасываются грозы и дневной цикл. Всё возвращается обратно, когда MSPT восстанавливается, по /vdt disable и при выключении - оригинальная погода и геймрулы запоминаются на входе. |
| Стартовая льгота | Держит низкую фиксированную дистанцию первые несколько минут после запуска, пока обычный цикл не вступит в силу. Не даёт холодному серверу получить максимальную дистанцию, пока он ещё разгоняется. |
Индивидуальные дистанции игроков
Два семейства разрешений устанавливают дистанцию для одного игрока без изменения мира:
viewdistancetweaks.fixed.<n> дистанция просмотра для этого игрока
viewdistancetweaks.simfixed.<n> дистанция симуляции для этого игрока
Значения от 2 до 32 - если у игрока несколько разрешений, побеждает самое высокое. Снятие разрешения возвращает их к мировой дистанции без перезахода. Обе функции нужно включить в конфиге отдельно - у них разные префиксы разрешений, чтобы один узел не устанавливал оба значения сразу.
Дистанция просмотра клиентская и не стоит серверу ничего лишнего. Дистанция симуляции реально жрёт ресурсы - так что оставь её для администрации, а не продавай как донатную плюшку.
/vdt status --fixed показывает, у кого что сейчас стоит и пришло ли значение из разрешения или от AFK-ограничения.
Пресеты и профили
Две разные вещи с раздражающе похожими названиями.
/vdt preset <small-server|large-network|performance-first> записывает настройки в твой config.yml. Это отправная точка для тех, кто не хочет крутить сорок значений руками - не финальный ответ.
/vdt profile <name> накладывает временное поверх того, что настроено (определяется в profiles: конфига). Ничего не пишется на диск - normal возвращает всё обратно. Нужен для того чтобы переключиться на ивентные настройки на два часа без правки конфига посреди события. max-view-distance-cap и max-simulation-distance-cap - это жёсткие потолки после всех остальных правил: лимит 8 действительно означает 8, и never-reduce-below-players не сможет его обойти.
Настройка
Всё живёт в одном комментированном config.yml. Дефолты разумные - кинул джарник и он уже делает правильные вещи. Значения, которые стоит знать:
| Параметр | Что делает | По умолчанию |
|---|---|---|
mode | proactive (бюджет чанков), reactive (только MSPT) или mixed (оба, пессимист побеждает) | mixed |
ticks-per-check | Как часто оценивается каждый мир | 600 (30 с) |
decrease-mspt-threshold | Выше этого MSPT дистанция снижается | 40.0 |
increase-mspt-threshold | Ниже этого MSPT дистанция может расти | 25.0 |
max-increase-step / max-decrease-step | Шагов за цикл в каждом направлении: 1 / 4 поднимается медленно и вылетает быстро | 1 / 1 |
prioritize-simulation-distance | Сначала резать симуляцию, просмотр только на минимуме мира | false |
global-ticking-chunk-count-target | Бюджет чанков для режима proactive | 5780 |
revert-increase-if-overloaded | Откатить увеличение сразу же если стало хуже | true |
У каждого мира свой минимум и максимум - всё что не указано наследует default:
worlds:
default:
simulation-distance:
min-simulation-distance: 4
max-simulation-distance: 12
view-distance:
min-view-distance: 6
max-view-distance: 16
world_the_end:
chunk-weight: 0.5 # почти пустые чанки, считаются за меньшее
world:
priority-world: true # получает на 50% больше бюджета
У каждой системы безопасности выше есть свой блок - memory-safeguard, chunk-generation-safeguard, afk-throttling, density-scaling, complexity-weighting, emergency-relief, startup-grace - а в profiles: хранятся наложения для /vdt profile.
Полный комментированный config.yml записывается в папку данных плагина при первом запуске - каждая опция объяснена прямо там.
Команды
| Команда | Что делает |
|---|---|
/vdt status [--weight] [--fixed] | Текущее состояние по мирам: дистанции, количество чанков, MSPT, разброс плюс строка для каждой включённой подсистемы. --weight добавляет вес чанков и множитель сложности, --fixed показывает индивидуальные переопределения игроков |
/vdt simulate [world] | Сухой прогон: показывает что решит следующая проверка и причину без изменения чего-либо |
/vdt history | Последние 20 применённых изменений с причиной каждого. Отвечает на вопрос "почему сейчас дистанция 6" постфактум |
/vdt mspt [debug] | MSPT, TPS и стандартное отклонение. debug добавляет сырые семплы тиков Paper |
/vdt viewdistance <n> [world] [--duration <min>] | Ручное переопределение: без --duration держится до следующей перезагрузки |
/vdt simulationdistance <n> [world] [--duration <min>] | То же самое для дистанции симуляции |
/vdt profile [name] | Переключить временный профиль или показать какой активен |
/vdt preset <name> | Записать один из встроенных пресетов в config.yml |
/vdt enable / /vdt disable | Главный выключатель без правки конфига |
/vdt reload | Перечитать config.yml и messages.yml сбросить ручные переопределения |
/vdt update | Спросить Modrinth нет ли новой версии |
Разрешения
Всё ниже по умолчанию выдаётся только операторам кроме двух числовых семейств которые никогда не выдаются по умолчанию.
| Узел | Даёт доступ к |
|---|---|
viewdistancetweaks.command.vdt | /vdt вообще и /vdt mspt |
viewdistancetweaks.vdt.command.status | /vdt status и /vdt history |
viewdistancetweaks.vdt.command.simulate | /vdt simulate |
viewdistancetweaks.vdt.command.viewdistance | /vdt viewdistance |
viewdistancetweaks.vdt.command.simulationdistance | /vdt simulationdistance |
viewdistancetweaks.vdt.command.preset | /vdt preset и /vdt profile |
viewdistancetweaks.vdt.command.reload | /vdt reload, enable, disable, update |
viewdistancetweaks.notify | Получать сообщение в чат при изменении дистанции |
viewdistancetweaks.fixed.<n> | Фиксированная дистанция просмотра для этого игрока |
viewdistancetweaks.simfixed.<n> | Фиксированная дистанция симуляции для этого игрока |
Плейсхолдеры
Нужен PlaceholderAPI. Все имеют префикс %viewdistancetweaks_.
По всему серверу
| Плейсхолдер | Значение |
|---|---|
mspt% | Текущий средний MSPT |
tps% | Текущий TPS |
mspt_stddev% | Стандартное отклонение тик-к-тику в мс |
mspt_color% | &a / &e / &c относительно двух порогов MSPT |
tps_color% | &a / &e / &c относительно 19 и 15 TPS |
mspt_stddev_color% | &a / &e / &c относительно variance-threshold'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а'а' |
