Все публикации

Создаём MMORPG на Unreal Engine 5.8 — дневник разработки №1: авторитетный сервер и архитектура мира

Архитектура Ancient Online: клиент на Unreal Engine 5.8, авторитетный сервер на C++, мировой цикл 25 Hz и единый мир, который редактируется вживую.

Рабочее место с мониторами и ноутбуками, стоящими рядом в слабо освещённой студии

MMORPG отличается от одиночной игры тем, что за всем, что вы видите, стоит сервер. В этой первой части дневника разработки Ancient Online: Remastered мы рассказываем, как создаём MMORPG на Unreal Engine 5.8: как работа распределена между клиентом и сервером, как симулируется мир и как нам удаётся вживую редактировать единый, цельный мир.

Две части: клиент и сервер

Ancient Online состоит из двух отдельных программ:

  • Клиент написан на C++ на Unreal Engine 5.8. Его задачи — отрисовка, звук, интерфейс и ввод.
  • Сервер не зависит от Unreal: мы написали его с нуля на C++23. Здесь работают все правила игры.

Почему мы написали сервер отдельно, а не внутри движка? Потому что серверу MMORPG нужно не то же самое, что игровому движку: графики нет, зато есть тысячи сущностей, постоянные данные, долгая непрерывная работа и потребность в предсказуемой производительности. Отдельный сервер позволяет нам делать только необходимую работу и контролировать каждый байт.

Авторитетный сервер: не доверять клиенту

Наше основное правило: клиент заявляет, сервер решает.

  • Движение: Ввод игрока уходит на сервер, и сервер вычисляет позицию. Клиент отображает позицию, которую сообщает сервер, с плавной интерполяцией. Поэтому клиент, который «телепортирует сам себя» или проходит сквозь стену, с точки зрения сервера никуда не попадает.
  • Бой: Такие результаты, как урон, попадания и отбрасывание, вычисляются на сервере. Например, сервер решает, собьёт ли удар комбо противника с ног, и рассылает результат всем одновременно.
  • Экономика: Предметы, валюта и операции в магазине меняются только на сервере и в базе данных.

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

Мировой цикл 25 Hz

Сервер обновляет мир 25 раз в секунду. На каждом шаге продвигаются ИИ монстров, движение, бой, эффекты навыков и погода. Фиксированный шаг делает симуляцию предсказуемой и гарантирует, что один и тот же ввод всегда даёт один и тот же результат.

Не каждому игроку нужно знать обо всём. Сервер делит мир на сетку и отправляет каждому игроку обновления только о тех сущностях, которые находятся в его области интереса (то есть поблизости). Это удерживает сетевой трафик в разумных пределах даже в людном городе.

Лёгкий бинарный протокол

Между клиентом и сервером нет ни JSON, ни REST; каждое сообщение — бинарный пакет с фиксированной структурой. Это экономит и пропускную способность, и процессорное время. Добавляя новую систему (например, погоду, движение или внутриигровой сервис аккаунтов), мы пишем для неё отдельный версионируемый контракт пакетов, а общие заголовочные файлы гарантируют, что клиент и сервер работают по одному и тому же контракту.

Сохранение данных: записывать, не заставляя игру ждать

Данные игроков хранятся в базе данных PostgreSQL. Но нельзя допустить, чтобы мировой цикл на каждом шаге ждал базу данных. Поэтому сохранение идёт в фоне, по схеме отложенной записи (write-behind): мировой сервер складывает изменения в очередь (Redis), а фоновый процесс записи пакетами фиксирует их в базе данных. Ход игры не зависит от скорости базы данных.

Каналы и сервер входа

Сначала игроки подключаются к серверу входа, который отвечает за проверку аккаунта, выбор персонажа и сеанс. Затем они переходят на один из четырёх игровых каналов (CH1–CH4). Текущее состояние каналов показано на странице «Состояние серверов» на сайте игры.

Единый мир, редактируемый вживую

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

Содержимое мира (рельеф, объекты, расстановка монстров) хранится не в коде, а в базе данных, с версиями. Этот мир мы можем редактировать редактором мира прямо в игре: изменения сначала вносятся в черновик, проверяются и лишь затем публикуются. Каждая публикация создаёт новую версию, а клиент проверяет, что его данные мира совпадают с серверными, сравнивая контрольную сумму. При несовпадении он ждёт обновления данных и только потом продолжает вход в игру.

Задания: Lua как язык сценариев

Задания и диалоги NPC пишутся на Lua 5.4 на сервере. Это позволяет нам разрабатывать и тестировать задания, не перекомпилируя сервер.

Сообщения игроков не покидают наши серверы

Для перевода внутриигрового чата мы не используем внешний сервис перевода. На собственных серверах у нас работает локальная модель перевода, работающая только на CPU; сообщения игроков не отправляются ни в какой внешний API. Так игроки, говорящие на разных языках, понимают друг друга, а их сообщения при этом не покидают студию.

Что дальше

Вторая часть дневника разработки посвящена решениям, которые мы приняли, чтобы в один и тот же мир можно было играть мышью, на сенсорном экране и с геймпадом. Чтобы познакомиться со студией, прочитайте статью «Кто такие Astronaut Entertainment?»; а саму игру представляет страница «Игры».

Поделиться:
Также доступно на29