Лучшее  🚀
06.09.2021 в 21:34 Evernews

«Мамонт»: как устроен сервер Minecraft, рассчитанный на тысячи игроков

Если вовремя добавлять железо, тут может играть более-менее любое число людей.

Кстати, на сайте читать удобнее

Серверная часть Minecraft устроена не особо оптимально: она однопоточная и обсчитывается единственным ядром CPU. Если на сервере собирается больше пары сотен игроков, ему становится плохо — все лагает, чанки едва грузятся.

Словом, возникает куча проблем. В начале 2020 года, когда пандемия только начиналась, разработчик Джексон Робертс решил воспользоваться карантином и попытаться привести сервер Minecraft в чувство. Спустя почти полтора года у него есть более-менее рабочее решение: Джексон назвал его Mammoth.

На самом деле, рассказывает Робертс, найти правильный подход удалось далеко не сразу. Сперва Джексон решил разбить мир на сегменты по 1024 блока, каждый из которых будет обсчитываться одним сервером. Казалось, все будет работать нормально — надо лишь синхронизировать области на границах серверов.

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

Когда сервер падал, область мира, за которую он отвечал, просто становилась недоступной. Кроме того, не удалось обойти основное ограничение Minecraft: такой подход не позволял большому числу игроков собраться в одной локации.

Поразмыслив, Робертс сформулировал ряд принципов, которым должен соответствовать его идеальный сервер:

Идея была следующей. Нужно создать две вещи: центральную базу данных, где будет храниться состояние игрового мира, и систему, которая будет контролировать сервера Minecraft, снабжая их данными для синхронизации передвижения игроков и изменения состояния мира.

Существующие решения не подошли, и Робертс создал собственную систему, WorldQL. Она выполняет одновременно несколько задач: хранит данные обо всем мире и балансирует нагрузку между серверами Minecraft. Кроме того, у WorldQL есть поддержка скриптов.

Для игрока все выглядит прозрачно: он подключается к любому доступному серверу и попадает в общий мир. Тем временем WorldQL незаметно синхронизирует данные: вне зависимости от того, на каком сервере находится игрок, он будет видеть всех остальных игроков и сможет взаимодействовать с ними.

Чтобы синхронизация работала, сервера Minecraft постоянно сообщают серверу WorldQL о том, где находятся игроки. Сам WorldQL пересылает серверам данные об игроках, которых они должны обсчитывать.

Вот так выглядит взаимодействие двух игроков, находящихся на разных серверах.

Данные обо всем игровом мире хранятся только в WorldQL. У серверов этой информации нет, это позволяет снизить нагрузку на них.

Когда серверу Minecraft нужно обсчитать какой-то чанк, о котором он ничего не знает, он запрашивает данные у WorldQL, а потом отдает их подключенному клиенту. Такой подход обеспечивает синхронизацию всех блоков и объектов в игровом мире, от надписей на знаках до порталов.

Подключение к системе нового сервера Minecraft устроено просто: он точно так же запрашивает у WorldQL данные об игровом мире. Обычно синхронизация происходит автоматически, вот так она выглядит в ручном режиме.

В результате с помощью Mammoth и WorldQL можно устраивать эвенты, в которых задействовано огромное количество игроков.

Во время одного из тестов Джексон имитировал подключение тысячи игроков; сервер не упал, его TPS — количество обсчитываемых тиков в секунду — не падал ниже 20. При этом вся серверная часть работала не на каком-то особенно мощном железе, а на обычном ноутбуке разработчика.

Для сравнения: в 2011 году Minecraft попала в Книгу рекордов Гиннесса, когда на одном сервере собралось 2622 игрока. С такой нагрузкой сервер работал очень условно, в лучшем случае игроки могли поговорить в чате.

У WorldQL, отмечает разработчик, есть еще один плюс: благодаря встроенному JavaScript можно добавлять в Minecraft мини-игры, не создавая отдельные серверные плагины. Это позволяет менять логику, не перезапуская сервер.

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

Поближе познакомиться с WorldQL и Mammoth можно здесь и здесь.

Читать далее