Усі дописи

Створюємо 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. Це дає нам змогу розробляти й тестувати завдання без перекомпіляції сервера.

Повідомлення гравців ніколи не залишають наших серверів

Для перекладу внутрішньоігрового чату ми не користуємося зовнішнім сервісом перекладу. На власних серверах у нас працює локальна модель перекладу, якій достатньо самого процесора; повідомлення гравців не надсилаються до жодного зовнішнього API. Так гравці, що розмовляють різними мовами, розуміють одне одного, а їхні повідомлення ніколи не залишають студії.

Що далі

Друга частина щоденника розробки розповідає про рішення, які ми ухвалювали, щоб у той самий світ можна було грати мишею, на сенсорному екрані та з контролером. Щоб познайомитися зі студією, прочитайте допис «Хто такі Astronaut Entertainment?»; а про саму гру розповідає сторінка «Ігри».

Поділитися:
Також доступно такими мовами29