Щоденник розробки: За лаштунками Gradient MC
Привіт, спільното! Ми продовжуємо активно розвивати сервер і сьогодні раді поділитися технічними деталями того, над чим наша команда працює останнім часом.
🚀 Концепція: Централізація
Головна мета, яку поставлено цього літа — розбиття серверу на “свою роботу”. Якщо коротко: поділ роботи між сервісами та плагінами. Можна було б сказати, що навіщо це робити на таких ранніх етапах, адже це over engineering. Поясню: розробляючи сервер мініігор, ми спираємось на продуктивність і швидкодію, аби віддати максимально серверам ту потужність, яку вони потребують. Але, якщо лишати той самий набір плагінів на кожній мінігрі, то ми матимемо зайве навантаження і для масштабування пізніше - потребуватимемо багато ресурсів для підтримки серверу. А це в зарашні часи - дорого. Тому прийнято рішення щодо поділу роботи. А як ми це робимо, я далі розпишу…
⚙️ “Конектори та ігрові рушії”
У більшості плагінів мініігор закладено систему “одна мінігра - один сервер”. При цьому ця мінігра може містити на одному сервері кілька арен для гри. Це звуть мультиареною. Плагін гри керує світами, має інтеграції з іншими плагінами аби передавати валюту (для купівлі косметики та інших “корисних” штучок), досвіду (аби збільшувати рівень гравця на сервері), технічні метрики (кількість гравців, перемоги, поразки, тощо). І здавалось би, ідеальна концепція, розробникам менше роботи для підтримки, але тут криється багато проблем, які потім “вилізуть боком”…
Я завжди притримуюсь принципу, що кожен має відповідати за свою роботу. “Все в одному” - то круто, але його важко підтримувати. Тому прийшла ідея в голову поділити роботу мінігри, створивши конектор та ігровий рушій.
Конектор - маленький плагін, робота якого полягає відправити на арену і прийняти гравця після виходу з арени. Він відображає скільки є арен, підключає до випадкової або ж дає можливість вибрати якусь певну (тільки якщо є дозвіл у гравця).
Ігровий рушій - сама мінігра. З неї винесено логіку приєднання, збір статистики і відображення через плейсхолдери. Лише процес гри, нічого більше.
Тут постає питання: а як конектор дізнається про доступні арени, перенаправляє у гру, куди після гри ігровий рушій відправляє гравця? Тут з’являється проксі і канали зв’язку Bungee. Детальніше розповім у інших блогах, як це все працює :>
👨💻 Сервіси
От є у нас конектор та ігровий рушій, наче все прикольно і класно, але функціоналу не вистачає: немає статистики, аби гравці змагались між собою; економіки, де отримували б досвід і валюту; косметики, аби виділятись серед гравців.
І тут приходять сервіси, вони забрали на себе все те, чим займався ігровий рушій. Написані на мові програмування Go, вони споживають мізерні мегабайти оперативки і відсотки процесора, працюють дуже швидко та є “хабом” для інших плагінів. Наприклад: StatsService: обробляє статистику з усіх мініігор, звільняючи їх від важких операцій над базою даних.
Таких сервісів може бути багато, вони оброблятимуть швидко будь-яку інформацію, отриману від мініігор і впорядковуватимуть її для подальшого використання: вивід статистики на сайті чи лідерборди на сервері.
🌐 Оптимізації
- Поділ роботи між конекторами, ігровими рушіями та сервісами дає можливість зробити сервер швидшим, не перейматись за просадки TPS (коли йде відновлення світу), позбутись непотрібних плагінів: голограми, економіка, керуванням лобі, тощо.
- Оновлення до нових версій: ми оновлюємо плагіни до 26.1.2, аби отримати нові інструменти для роботи, контент для гравців, безпеку для серверу.
- Перехід до кращого збереження світів: поточна реалізація ванільних світів підходить лише для виживання, мінііграм багато функціоналу не потрібно: пусті чанки, робота світла, генерація структур, тощо. Тому під час пошуку в інтернеті цікавого, я наштохнувся на Slime та Polar.
Slime - це формат стиснення світів, який завантажує дані безпосередньо в оперативну пам’ять, дозволяючи дуже швидко розгортати та видаляти тимчасові арени для міні-ігор. Polar - це сучасніший та ще легший In-Memory формат, спеціально розроблений для максимальної швидкодії та мінімального споживання ресурсів при частих перезапусках ігрових сесій.
Рішення очевидно за polar.
Робота кипить! Ми вдячні кожному за відгуки та підтримку.
Слідкуйте за іншими постами, адже нам є що розповісти.