Chunky: пред-генерация чанков в Minecraft и как убрать лаги от новых регионов

Chunky: пред-генерация чанков в Minecraft и как убрать лаги от новых регионов

Если ваш сервер фризит на доли секунды, когда игрок уходит в неизведанные места, проблема почти всегда в генерации чанков. Этот гайд показывает, как плагин Chunky прогоняет генерацию мира заранее, чтобы во время игры сервер только читал готовые регионы с диска, а не считал их с нуля.

Почему генерация чанков лагает

Когда игрок впервые попадает в координату, где нет файла региона, Paper или Spigot должен сгенерировать чанк прямо в момент запроса. Под капотом это три тяжёлые операции одновременно: CPU считает шум Перлина для рельефа, биомов, структур и декораций; диск пишет новый .mca файл в world/region/; RAM держит все промежуточные структуры до тех пор, пока чанк не отдаётся на отправку игроку.

На свежем 1.21 это особенно больно. Новые биомы, кастомные структуры, чердаки в end city, тестовые камеры в trial chambers - всё это нагрузка на главный поток сервера. Даже на топовом CPU генерация одного чанка занимает 20-80 мс. Если игрок летит на elytra со скоростью 30 блоков в секунду, сервер должен выдавать 8-10 новых чанков ежесекундно, и TPS уходит в пол.

Проблема не в Minecraft как таковом, а в том, что генерация делается лениво. Логичное решение: подготовить чанки заранее, в спокойное время, и не трогать главный поток во время игры.

Что такое pre-generation и почему это работает

Идея простая. Один раз вы запускаете задачу, которая обходит все координаты внутри будущей игровой области и генерирует каждый чанк. После этого world/region/ содержит готовые .mca файлы. Когда игрок зайдёт в эти координаты, сервер откроет файл, прочитает чанк за 1-3 мс и отправит клиенту. Никакого Перлина, никаких структур на лету.

Это разовое вложение времени окупается каждый раз, когда новый игрок исследует мир. На паблике с парой сотен онлайна разница видна моментально: больше нет «фриза каждые 10 секунд», TPS сидит на 19.5-20.0 даже когда полтора десятка человек уезжают в дикие края.

Chunky vs WorldBorder fill: почему сейчас выбирают Chunky

Старая школа использовала команду /wb fill из плагина WorldBorder. Он работает, но писался под Bukkit 1.7-1.12 и тянет за собой проблемы: блокирует главный поток, плохо дружит с современным Paper, не поддерживает Folia. Plugin Pregen и Aurora из той же эпохи давно заброшены и не обновляются.

Chunky - современная замена. Поддерживает Paper, Purpur, Pufferfish, Folia 1.20-1.21, асинхронно загружает чанки, умеет паузиться, продолжаться после рестарта сервера, выбирать форму области и шаблон обхода. Активно обновляется, есть на Modrinth и SpigotMC, работает на всех версиях от 1.13 до 1.21.4.

В Paper 1.21+ появилась встроенная команда /paper chunkgen. Она рабочая, но беднее по функциям: нет паузы, нет сохранения прогресса, ограниченный контроль над паттернами. Для одноразовой задачи она годится, для серьёзного сервера всё ещё удобнее Chunky.

Установка Chunky на Paper, Purpur и Folia

Скачайте Chunky-X.X.X.jar с Modrinth или SpigotMC. Положите в папку plugins/ и перезагрузите сервер. Никаких зависимостей плагин не требует.

Проверьте загрузку:

[Server] [INFO] [Chunky] Enabling Chunky v1.4.x
[Server] [INFO] [Chunky] Loaded language file (en)

Если у вас Folia, скачайте отдельно ChunkyFolia с того же Modrinth - это форк с поддержкой региональных потоков Folia. Конфиг в plugins/Chunky/config.yml создастся при первом запуске.

Базовые команды Chunky

Минимальный набор, который покрывает 90% задач:

/chunky world world
/chunky radius 2000
/chunky start

Первой командой вы выбираете мир (по умолчанию world, но если вы переименовали - укажите имя из bukkit.yml). Второй - радиус в блоках от центра. Третьей запускаете задачу.

Управление в процессе:

/chunky pause
/chunky continue
/chunky cancel
/chunky quiet 30

pause останавливает задачу, continue возобновляет, cancel сбрасывает прогресс. quiet 30 уменьшает частоту лога прогресса до раз в 30 секунд - удобно, чтобы консоль не спамила.

Параметры формы и центра

По умолчанию Chunky генерирует квадратную область вокруг точки спавна. Если хотите кружок (естественнее для island worlds или small SMP):

/chunky shape circle

Сместить центр от 0,0:

/chunky center 1500 -800

Доступные формы: square, circle, oval, triangle, pentagon, hexagon, star. На практике 99% серверов используют square или circle.

Шаблон обхода влияет на то, как Chunky идёт по карте:

/chunky pattern concentric
/chunky pattern loop
/chunky pattern region

concentric идёт от центра спиралью, loop - построчно, region - блоками 32x32 чанка (по одному .mca файлу за раз). На SSD разница невелика, на HDD region экономит seek-time.

Реальный расчёт: сколько чанков и времени нужно

Вот тут многие совершают ошибку и ставят радиус 5000 блоков. Считаем.

Радиус 5000 = квадрат 10000x10000 блоков. Чанк это 16x16 блоков, значит 625x625 чанков = примерно 390 тысяч чанков для квадрата. Это уже много, но не катастрофа.

Если радиус 5000 трактовать как «расстояние от центра до угла» в виде 10000x10000 блоков по площади - получим ~390к чанков. На современном CPU вроде Ryzen 7 5800X с NVMe это 3-5 часов чистого времени. Терпимо.

Но если кто-то поставил радиус 10000 - получаем 1.56 млн чанков и 12-20 часов. А если 50000 (бывает и такое) - 39 миллионов и неделя непрерывной работы.

Реалистичные цифры для типичного SMP:

  • Радиус 1000 (2000x2000 блоков) = ~15 тыс чанков, 5-15 минут
  • Радиус 2000 (4000x4000 блоков) = ~62 тыс чанков, 20-40 минут
  • Радиус 3000 (6000x6000 блоков) = ~140 тыс чанков, 1-2 часа
  • Радиус 5000 (10000x10000 блоков) = ~390 тыс чанков, 3-6 часов

Размеры зависят от CPU и диска. На медленном VPS с 2 ядрами умножайте в 3-5 раз.

Размер мира на диске после прегена

Многих пугает мысль, что прегенерированный мир займёт сотни гигабайт. На практике 1 чанк весит около 30-90 КБ в .mca файле в зависимости от глубины генерации (новые миры с trial chambers и end city тяжелее).

Грубая оценка:

  • Радиус 2000 = ~62к чанков = 3-6 ГБ на диске
  • Радиус 5000 = ~390к чанков = 15-30 ГБ
  • Радиус 10000 = ~1.56М чанков = 60-120 ГБ

Для SMP с радиусом 2000-3000 размер мира вряд ли превысит 10 ГБ. Это меньше, чем можно подумать, и сильно меньше тех 80 ГБ, в которые разрастается мир за пару лет паблика без прегена (потому что игроки разбредаются хаотично и создают тысячи изолированных регионов).

World Border: чтобы игроки не вышли за прегенированную область

Бессмысленно генерить 4000x4000 блоков, а потом давать игрокам уходить на 50000. Сразу после прегена ставьте ванильный border:

/worldborder center 0 0
/worldborder set 4000
/worldborder warning distance 100

Радиус 4000 у Chunky соответствует диаметру 4000 у /worldborder (border меряет диаметр квадрата, Chunky - радиус). То есть Chunky radius 2000 = /worldborder set 4000. Это типичная путаница, проверяйте дважды.

Border делает три полезные вещи: останавливает игроков на границе, не даёт неизведанным чанкам генериться через elytra-полёт, рисует красную стену на клиенте.

Параллельные миры: nether и the_end

Незер компактнее в восемь раз. Координаты в незере = координаты в overworld делёные на 8. То есть для overworld радиуса 2000 хватает незера с радиусом 250-300:

/chunky world world_nether
/chunky radius 300
/chunky start

End по дефолту это маленький центральный остров плюс далёкие external islands. Для большинства серверов хватит:

/chunky world world_the_end
/chunky radius 1000
/chunky start

Учтите: external islands в End начинаются с координаты ~1000 от центра, и игроки будут туда летать. Если хотите готовое - ставьте 2000-3000 и закладывайте время.

Производительность во время прегена: TPS упадёт

Это нормально. Chunky грузит главный поток (потому что vanilla generator не thread-safe полностью), и во время задачи TPS просядет до 14-18. Игроки будут чувствовать рывки.

Два варианта стратегии:

Вариант 1: ночной прегенer. Останавливаете сервер от игроков (whitelist on), запускаете Chunky на ночь, утром снимаете whitelist. Самый чистый путь.

Вариант 2: фоновая генерация. Если whitelist неприемлем, используйте /chunky tasks 1 чтобы заставить плагин использовать только один поток вместо нескольких. TPS будет держаться около 18-19, но прегенерация займёт в 2-3 раза дольше.

/chunky tasks 1
/chunky start

Изменить число потоков по дефолту можно в plugins/Chunky/config.yml:

generation:
  parallel-tasks-multiplier: 0.25
  default-quiet-interval: 60

0.25 означает «использовать четверть доступных ядер». На 8-ядерном сервере это 2 потока.

Chunky и Aikar's flags

Если у вас Paper с Aikar's flags (G1GC, ParallelGCThreads, MaxGCPauseMillis и компания), Chunky отлично с ними дружит. Никаких конфликтов. Единственное - убедитесь, что хип не маленький: для прегена 2000+ радиуса хочется минимум -Xms6G -Xmx6G, иначе G1GC будет слишком часто триггериться при заполнении нового хипа чанков.

FAQ

Сколько RAM нужно для прегена?

Хватит того, что у вас уже выделено. Chunky обрабатывает регионы потоково, не держит весь мир в памяти. Но для радиуса 3000+ имеет смысл выделить минимум 4-6 ГБ heap, чтобы GC не тормозил процесс.

Можно ли прегенерить с игроками онлайн?

Можно, но TPS просядет до 14-17. Если игроки готовы потерпеть пару рывков, ставьте /chunky tasks 1 и продолжайте. Чистый вариант - выгнать всех на ночь и запустить с whitelist.

Нужно ли прегенерить заново после обновления Minecraft?

Нет. Старые чанки остаются как есть, они продолжают работать в новой версии. Минус: новые биомы и структуры из обновления не появятся в уже сгенерированных регионах. Если в 1.22 добавят новый биом, он будет только в новых чанках за пределами вашей прегенерированной зоны.

Что делать, если Chunky сломал мир?

Chunky не повреждает мир. Но обязательно делайте бэкап перед стартом: остановите сервер, скопируйте папку world/, world_nether/, world_the_end/. Если что-то пойдёт не так (диск кончился, питание выключили, плагин упал) - просто восстановите из бэкапа и запускайте снова.

Chunky vs встроенный /paper chunkgen?

/paper chunkgen появился в Paper 1.21 и работает, но без паузы, без выбора формы и шаблона, без сохранения прогресса при рестарте. Для одноразовой генерации маленькой области сойдёт. Для всего остального удобнее Chunky.

Прегенерация спасёт от лагов на работающем сервере?

Чанк-лаги - да, полностью. Лаги от мобфермы, redstone-машин, плохо написанных плагинов или сетевые лаги при DDoS-атаке - нет, прегенерация на это не влияет. Чтобы закрыть сетевые лаги, понадобится защита трафика отдельно.

Можно ли запускать Chunky на нескольких мирах одновременно?

Технически да: команды /chunky world и /chunky start ставят задачи в очередь. Но рекомендую генерить миры по очереди - меньше нагрузки, легче контролировать прогресс.

Что дальше

Если этот гайд помог вам убрать чанк-лаги, проверьте ещё пару моментов. Поставьте границу мира на 200-500 блоков меньше, чем прегенированная область - игроки не должны попадать на свежие чанки случайно через elytra. Заведите крон на ночной прегенeration, если у вас seasonal-сервер с регулярными ресетами карты. И не забудьте, что прегенерация решает проблему генерации, но не отменяет необходимости защиты от сетевых атак: если вашу карту положат DDoS-ом, никакой .mca файл не поможет.


Protege tu servidor contra ataques DDoS

Protección gratuita con configuración en 5 minutos. 1 TB de tráfico incluido.

Probar gratis


Artículos relacionados