Два решения ограничивают, сколько земли серверу Minecraft когда-либо придётся строить: граница мира и один прогон предварительной генерации внутри неё. /worldborder set 10000 ограничивает и работу, и диск. Затем Chunky обходит каждый чанк внутри этой границы один раз, в три часа ночи, так что потом дойти до края карты - это распаковка и разбор данных с NVMe, а не расчёт местности посреди тика. Подвисания, в которых обычно винят хостера, чаще всего прекращаются.
Вот и вся идея. Остальная часть поста - это цифры за ней: сколько стоит чанк, каким на самом деле должен быть размер границы, точные команды и что делать с миром, который уже слишком велик.
Почему генерация чанка - самая дорогая часть#
Чанк не приходит готовым. Он проходит конвейер стадий, и каждая из них должна ждать соседей: определяются биомы, затем шум, задающий форму земли, затем поверхностный слой, затем карверы вырезают пещеры и ущелья, затем размещаются элементы - деревья, жилы руды, структуры, украшения - и наконец считается освещение. Только после этого чанк можно отдать игроку.
Чтение уже существующего чанка - совершенно другая работа. Сервер находит его внутри файла региона, распаковывает несколько килобайт, разбирает данные блоков и блок-сущностей и передаёт дальше. Генерация нового чанка - это десятки миллисекунд работы CPU; загрузка существующего дешевле на один-два порядка. Эта разница и есть весь довод в пользу предварительной генерации.
Теперь арифметика, которая делает вопрос срочным. При view-distance=10 по умолчанию одному игроку нужен квадрат чанков 21 на 21 вокруг него - 441 чанк. Сделайте шаг на один чанк на восток, и немедленно требуется 21 новый столбец чанков. Спринтующий игрок пересекает чанк примерно раз в секунду; игрок на элитрах с фейерверками - примерно два чанка в секунду, а это около 40 новых чанков в секунду, требуемых от одного человека. На сгенерированной земле это работа с диском. На свежей земле это самое дорогое, что сервер умеет делать, и происходит это, пока двадцать других ждут своего тика.
Современные сборки Paper переносят немалую часть генерации в рабочие потоки, и это помогает, но эти потоки работают на той же доле CPU, за которую вы платите, а последняя передача чанка в живой мир по-прежнему выполняется в главном потоке. Вне главного потока не значит бесплатно. Поэтому сервер может весь вечер держать идеальные 20 TPS, а потом упасть до 12, стоит кому-то решить найти грибной остров.
Что на самом деле даёт граница#
Граница мира - это не столько ограничение, сколько бюджет. Она ограничивает сразу пять вещей, и очевидна только первая:
- Диск. Мир никогда не может стать больше своей границы. Без неё предел - 60 миллионов блоков в стороне квадрата и дисковая квота вашего тарифа, смотря что вы достигнете первым.
- Работа по генерации. Когда внутренняя часть сгенерирована, описанная выше дорогая операция просто перестаёт происходить.
- Размер backup и время восстановления. Backup делаются из папки мира. Мир, растущий без предела, означает backup, который каждую неделю занимает больше времени, а весь смысл backup, которые действительно восстанавливаются, в том, что один из них можно восстановить в спешке.
- Стоимость отрисовки карты. Dynmap, BlueMap и squaremap отрисовывают тайлы для сгенерированных чанков. Неограниченный мир означает неограниченный каталог тайлов, который обычно больше самого мира. См. веб-карты с Dynmap и BlueMap.
- Модерация и уборка. Конечная карта - это карта, по которой можно искать, откатывать изменения и рассуждать.
Скажем неудобную часть вслух: 10 000 блоков в стороне - это огромный мир. Это 100 миллионов квадратных блоков поверхности. Большая база выживания занимает, может быть, 200 на 200. Десять тысяч в стороне дают каждому участнику сообщества из двадцати человек примерно по 5 миллионов квадратных блоков, и большую часть никто никогда не увидит. Сообщества, которые ставят 4000 или 5000 на сезон, находят, что карта кажется оживлённее и общительнее, а не меньше, потому что люди действительно сталкиваются друг с другом.
Размеры границы, число чанков и диск#
/worldborder set принимает диаметр в блоках, а не радиус. Граница 10 000 означает 5000 блоков в каждую сторону от центра. В таблице ниже предполагается, что центр находится на спавне.
| Граница | Чанки | Файлы региона | Примерный размер Верхнего мира |
|---|---|---|---|
| 2,000 | 15,600 | 16 | 0.2-0.5 GB |
| 5,000 | 98,000 | 100 | 0.6-1.5 GB |
| 10,000 | 391,000 | 400 | 2-5 GB |
| 20,000 | 1,563,000 | 1,600 | 9-20 GB |
Столбец с файлами региона - это то, откуда берутся эти размеры. Файл региона - region/r.0.0.mca и соседние - содержит блок чанков 32 на 32, то есть 512 на 512 блоков мира. Поскольку в 1.18 диапазон строительства расширили до от -64 до 320, полностью сгенерированный файл региона Верхнего мира обычно получается размером от 4 до 12 МБ в сжатом виде, то есть несколько килобайт на чанк. Умножьте, и получится таблица. У вас числа будут отличаться в зависимости от версии, набора биомов и того, сколько люди построили, так что измерьте папку своего мира после прогона, а не доверяйте таблице, включая эту.
Другие измерения важны меньше, чем принято думать. Незер имеет масштаб в одну восьмую, так что границе Верхнего мира 10 000 соответствует 1250 в Незере, если вы хотите, чтобы связь порталов работала так, как предполагают игроки. Энд стоит генерировать заранее только на несколько тысяч блоков, если только ваше сообщество не занимается разрушением Энда всерьёз, а внешние острова - в любом случае дешёвая местность.
Задаём границу в vanilla#
Граница - это функция vanilla, и плагин ей не нужен. Каждая команда выполняется из консоли панели без ведущего слеша или в игре со слешем.
worldborder center 0 0worldborder set 5000worldborder warning distance 32worldborder warning time 10worldborder damage amount 0.2worldborder damage buffer 5worldborder get| Команда | По умолчанию | Что делает |
|---|---|---|
worldborder set <size> [seconds] | 59,999,968 | Диаметр в блоках; за указанное время, если оно задано |
worldborder add <size> [seconds] | - | Увеличивает или уменьшает на относительную величину |
worldborder center <x> <z> | 0 0 | Где находится центр квадрата |
worldborder damage amount <n> | 0.2 | Сердец в секунду за каждый блок за пределами буфера |
worldborder damage buffer <n> | 5 | Блоков запаса за стеной |
worldborder warning distance <n> | 5 | Красная виньетка начинается на таком расстоянии |
worldborder warning time <n> | 15 | Секунд предупреждения для сужающейся границы |
Две детали ловят людей. Граница своя в каждом измерении: команда, выполненная в Верхнем мире, Незера не затрагивает. Задайте каждую явно, а затем проверьте:
execute in minecraft:the_nether run worldborder set 625execute in minecraft:the_end run worldborder set 5000execute in minecraft:the_nether run worldborder getА max-world-size в server.properties - это потолок, до которого можно задать границу, а не сама граница. По умолчанию он равен 29 999 984. Его снижение - это перестраховка на случай, если кто-то с правами оператора наберёт очень большое число; само по себе оно ничего не генерирует и не удаляет. Остальные ключи этого файла разобраны в статье server.properties простыми словами.
Граница vanilla всегда квадратная, она блокирует движение и установку блоков, а поскольку игроки не могут пройти за неё, обычная игра ничего за ней не генерирует. Она не убирает задним числом землю, сгенерированную до её появления. Если вам нужен круг или нужно, чтобы граница рисовалась на веб-карте, плагин-компаньон ChunkyBorder обеспечивает те же формы, которые умеет генерировать Chunky.
Предварительная генерация с Chunky#
Chunky - стандартный инструмент, он существует для Paper, Fabric, Forge и NeoForge. Положите jar в plugins/ (или mods/), перезапустите, и он зарегистрирует /chunky. Всё ниже работает и из консоли панели.
chunky world minecraft_overworldchunky center 0 0chunky shape squarechunky radius 2500chunky startОбратите внимание: radius в Chunky - это радиус, а worldborder set в vanilla - диаметр. radius 2500 соответствует worldborder set 5000. Перепутать это и сгенерировать площадь в четыре раза больше задуманной - самая частая ошибка с Chunky.
| Команда | Что делает |
|---|---|
chunky world <name> | К какому миру относится следующая задача |
chunky center <x> <z> | Центр выделенной области |
chunky radius <r> | Радиус в блоках или два значения для прямоугольника |
chunky shape <shape> | square, circle, rectangle, oval, diamond, star и другие |
chunky start | Начинает генерацию выделенной области |
chunky pause / chunky continue | Останавливает и возобновляет, сохраняя прогресс |
chunky cancel | Отбрасывает задачу |
chunky progress | Процент, скорость и оценка времени |
chunky quiet <seconds> | Как часто печатается прогресс |
chunky trim | Удаляет чанки вне выделенной области, с подтверждением |
Chunky записывает свой прогресс, так что перезапуск посреди прогона переживаем: chunky continue подхватывает работу, а не начинает заново. Скорость, которую он показывает, - это число, за которым нужно следить. На общем контейнере ожидайте от 10 до 60 чанков в секунду в зависимости от версии, доли CPU и того, сколько структур попадается на пути. При 30 чанках в секунду 391 000 чанков границы 10 000 - это около трёх с половиной часов. Граница 20 000 при той же скорости - четырнадцать часов, а это решение другого рода.
Память - это то, в чём люди ошибаются. Предварительная генерация держит в работе множество чанков одновременно, и сервер на 2 ГБ, вполне довольный пятью игроками, упрётся в потолок heap во время прогона. Оставьте запас, следите за графиком памяти и смотрите статью сколько RAM нужно серверу Minecraft о выборе размера. В RE:NODE контейнер, достигший лимита памяти, останавливается и перезапускается начисто, а не уходит в swap, так что слишком амбициозный прогон заканчивается перезапуском и возобновляемой задачей Chunky, а не часом пробуксовки.
Как запустить, не испортив вечер#
- Сначала сделайте backup и убедитесь, что он существует. Предварительная генерация не разрушительна, но вы собираетесь записать гигабайты и хотите иметь заведомо рабочую копию.
- Задайте границу в каждом измерении, которое вас интересует, и проверьте командой
worldborder get. - Освободите сервер или смиритесь с тем, что тем, кто на нём, будет неприятно.
- На время прогона снизьте
view-distanceдо 6. Генератору она не нужна, а снижение оставляет больше CPU для самой работы. - Запустите прогон, затем
chunky quiet 300, чтобы консоль потом можно было читать. - Проверьте
chunky progressодин раз и оставьте в покое. - Когда он закончится, перезапустите сервер, верните
view-distanceна место и посмотрите на размер папки мира.
Вкладка Schedules превращает шаги с 3 по 5 в то, что происходит, пока вы спите: задача на 0 4 * * *, выполняющая команды консоли, и другая, позже, которая перезапускает сервер. Если синтаксис вам незнаком, пять полей разобраны в статье выражения cron простыми словами, а другие задачи, которые стоит туда поставить, - в статье запланированные задачи, которые стоит иметь.
Одно честное предупреждение об общем железе: прогон предварительной генерации будет сидеть на 100% вашей доли CPU часами. В RE:NODE это жёсткое ограничение до купленной доли, а не нагрузка, переливающаяся на соседей, и сервер на 100% работает медленно, а не в беде - за это его никогда не приостанавливают. Но это значит, что прогон займёт столько, сколько позволяет ваша доля, а купить долю побольше на одну ночь - разумный шаг.
Обрезка мира, который уже слишком велик#
Это самый частый случай: двухлетний мир выживания без границы, 40 ГБ файлов региона и горстка чанков в тысяче блоков от центра, где кто-то когда-то бежал по прямой целый час.
Работу делают два инструмента. chunky trim удаляет каждый чанк вне текущей выделенной области в текущем мире и перед этим просит подтверждение. MCA Selector - внешний вариант: он открывает папку региона, показывает карту по чанкам и умеет выбирать по InhabitedTime - числу тиков, которые игроки реально провели в чанке. Фильтр по InhabitedTime меньше минуты-двух находит землю, сгенерированную мимоходом и не использованную, и это почти всегда основная масса потерь.
Порядок важен, и отмены нет:
- Остановите сервер. Обрезка работающего мира - вот как получают повреждённые файлы региона.
- Скачайте полный backup и убедитесь, что архив открывается. Этот шаг люди пропускают.
- Задайте границу, которую хотите на самом деле, и сверьте то, что она исключает, с веб-картой.
- Обрежьте Верхний мир, затем Незер, затем Энд: у каждого своя папка и своё решение.
- Запустите сервер и облетите периметр, прежде чем что-либо объявлять.
Что предварительная генерация не исправляет#
Стоит ясно обозначить пределы, потому что «сгенерируйте мир заранее» предлагают как лекарство от любого лага.
Предварительная генерация устраняет подвисания, вызванные созданием местности. Она ничего не делает с мобной фермой, где четыре тысячи сущностей, с цепочкой хопперов под чьей-то базой, с редстоун-часами, которые никогда не останавливаются, с плагином, выполняющим запрос к базе в главном потоке, или с паузами сборки мусора из-за неправильно выбранного heap. Если сервер тормозит, пока все стоят на спавне, генерация - не ваша проблема. Сначала измерьте: порядок действий - в статье почему падает TPS и что делать, а как читать отчёт spark превращает догадку в название плагина. Настройки Paper, ограничивающие работу с сущностями и блок-сущностями, есть в руководстве по оптимизации Paper.
Ещё она не исправляет схему загрузки чанков. Сгенерированную заранее землю всё равно нужно прочитать, распаковать и отправить. Двадцать игроков, разбросанных по карте 10 000 блоков, держат каждый свои 441 чанк, и это реальная цена по памяти и I/O даже когда генерировать нечего. Статья что на самом деле меняет NVMe в основном об этом: чтение быстрое, так что остаются CPU и память.
FAQ#
Останавливает ли граница мира генерацию чанков полностью?
В обычной игре - да: игроки не могут пройти за неё, так что за ней ничего никогда не запрашивается. Несколько пограничных случаев всё же выходят наружу: связь порталов Незера у самой линии и всё, что связано с телепортацией оператором. Это бюджет, который держится, а не стена в файловой системе.
Сколько занимает предварительная генерация?
При обычных 10-60 чанках в секунду граница 5000 блоков - это примерно от одного до трёх часов, а граница 10 000 блоков - от трёх до десяти. Chunky сам печатает скорость и оценку через минуту после начала прогона, и эта оценка заслуживает больше доверия, чем любая цифра в интернете, потому что измерена на вашей доле CPU.
Не сделает ли предварительная генерация папку мира огромной?
Она делает её ровно такой же большой, как граница, которую вы задали, в чём и смысл её задания. Заложите 2-5 ГБ для Верхнего мира с границей 10 000 блоков и проверьте по диску своего тарифа до начала. Предварительная генерация не создаёт больше данных, чем исследование той же области; она просто создаёт всё сразу.
Можно ли генерировать заранее, пока люди играют?
Можно, и они это заметят. Если приходится, разрежьте радиус на части и запускайте их ночью, запланировав chunky pause до часов пик. Chunky сохраняет своё место между перезапусками, так что прогон, растянутый на пять ночей, - совершенно нормальное дело.
Нужно ли предварительно генерировать Незер и Энд?
Незер - обычно да: это всего одна восьмая площади, а перемещение по Незеру быстрое, так что игроки покрывают его быстро. Энд - редко: главный остров крошечный и уже сгенерирован, а внешние острова - дешёвая местность, куда никто не ходит толпами.
Удаляет ли сужение границы то, что оказалось за ней?
Нет. Сужение границы только не даёт людям добраться до этой земли; файлы региона остаются на диске и в каждом backup. Удаление - отдельный осознанный шаг через chunky trim или MCA Selector, и без backup он необратим.




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