У нашому блозі ми вже
За свою 9-річну історію (якщо рахувати від дати релізу) Minecraft заробив приголомшливу кількість шанувальників і хейтерів як серед звичайних гравців, так і серед гіків. Проста концепція світу з кубиків перетворилася із звичайної розваги на універсальне середовище для спілкування та створення різних об'єктів із реального світу.
Крім будівництва, у грі є можливість створювати
Але не будемо далі говорити про те, що саме гравці створюють, а подивимося на серверну частину програми та висвітлимо проблеми (іноді складні), які можуть виникнути в процесі роботи під навантаженням. Відразу обмовимося, що йтиметься лише про Java Edition.
Види серверів
Найпростішим варіантом є сервер, вбудований у клієнт гри. Створили світ, натиснули на одну кнопочку, і сервер став доступний по локальній мережі. Жодного серйозного навантаження такий варіант витримати не може, а тому ми не будемо його навіть розглядати.
Vanilla
Компанія Mojang Studios розповсюджує серверну частину гри у вигляді Java-додатків безкоштовно
Цей підхід має один серйозний недолік, а саме — відсутність можливостей «з коробки» підключати плагіни, що розширюють функціонал сервера і дозволяють не тільки автоматизувати багато процесів, а й оптимізувати продуктивність. Крім того, офіційний сервер має велике споживання оперативної пам'яті на кожного підключеного гравця.
буккіт
Створений ентузіастами на базі Vanilla-версії серверний додаток
Встановити Bukkit не складає особливих труднощів, відповідна інструкція є на ресурсі
SpigotMC
Для полегшення життя розробників плагінів була потреба в API взаємодії з ігровим світом. Саме це завдання і вирішили творці
На даний момент SpigotMC активно розвивається та використовується. Він підтримує всі плагіни, створені під Bukkit, проте з ним несумісний. Щоб уникнути заборони DMCA Takedown, був придуманий елегантний спосіб під назвою BuildTools. Цей інструмент позбавляє необхідності дистрибуції скомпільованого додатка і дозволяє користувачам виконати компіляцію Spigot, CraftBukkit та Bukkit з вихідного коду. Все це робить заборону DMCA марною.
PaperMC
Здавалося б, все круто, і Spigot став чудовим варіантом. Але деяким ентузіастам цього здалося мало, і вони запиляли свій власний форк Spigot на стероїдах. на
З сумісністю PaperMC все чудово, так що написані плагіни під SpigotMC легко запрацюють і на PaperMC, але без офіційної підтримки. Зворотна сумісність зі SpigotMC також є. Тепер, коли ми перерахували різні варіанти створення сервера, перейдемо до проблем продуктивності, які можуть виникати.
Проблеми і рішення
Головне, що треба розуміти, — все, що стосується обробки ігрового світу, оброблятиметься лише на одному обчислювальному ядрі фізичного сервера. Тож якщо раптом у вас чудовий сервер із десятком обчислювальних ядер, то завантажено буде лише одне. Всі інші фактично простоюватимуть. Така вже архітектура програми, і нічого ви з цим вдіяти не зможете. Отже, при виборі сервера слід звертати увагу не на кількість ядер, а на тактову частоту. Чим вона буде вищою, тим краще буде продуктивність.
Що стосується питання про обсяг оперативної пам'яті, тут слід виходити з таких показників:
- запланована кількість гравців;
- запланована кількість світів на сервері;
- Розмір кожного світу.
Слід пам'ятати, що Java-додатку завжди потрібний запас оперативної пам'яті. Якщо ви розраховуєте на споживання пам'яті 8 гігабайт, то фактично треба мати 12. Цифри умовні, але суть від цього не змінюється.
Для запуску серверної частини рекомендуємо скористатися прапорами, зазначеними у статті
Генерація картки блоків
"Ви дійсно вважаєте, що Місяць існує, тільки коли ви на нього дивитеся?" (Альберт Ейнштейн)
Абсолютно новий сервер. Як тільки гравець вперше успішно підключається, ігровий персонаж з'являється на загальній точці збору (спаун). Це єдине місце, де ігровий світ заздалегідь генерується сервером. У цей момент клієнтська частина дивиться у налаштування, і ключовим параметром є дальність промальовування. Вимірюється вона у чанках (область карти 16×16 і висотою 256 блоків) Скільки чанків там зазначено, саме стільки і буде запрошено у сервера.
На сервері зберігається глобальна карта світу, і якщо в ній ще немає згенерованих блоків у точці появи ігрового персонажа, сервер їх динамічно генерує і зберігає у себе. Мало того, що це потребує великих обчислювальних ресурсів, то ще й постійно збільшує розмір карти світу. На одному із найстаріших анархічних серверів
Генерація світу навколо одного гравця – не проблема. Генерація світу навколо сотні гравців викличе незначні гальма сервера протягом короткого часу, після чого навантаження зменшиться. Генерація світу на дальність промальовування клієнта навколо тисячі гравців вже здатна «впустити» сервер і викидати з нього всіх клієнтів по таймууту.
У серверному програмному забезпеченні є таке значення, як TPS (Ticks per Server - тактів за секунду). Штатно 1 такт дорівнює 50 мс. (1 секунда реального світу дорівнює 20 тактам ігрового світу). Якщо обробка одного такту зросте до 60 секунд, серверний додаток буде закрито, викинувши всіх гравців.
Вихід – обмежити світ певними координатами та виконати попередню генерацію блоків. Тим самим ми знімаємо необхідність динамічної генерації в процесі гри, і сервер достатньо прочитати вже існуючу карту. Обидва питання вирішуються одним плагіном
Найпростіше задати кордон світу у вигляді кола щодо точки спауна (хоча можна його зробити будь-якої форми) однією командою:
/wb set <радиус в блоках> spawn
Якщо ігровий персонаж спробує перетнути кордон, то буде відкинутий на кілька блоків назад. Якщо це зробити кілька разів за обмежений час, порушник буде примусово телепортований на точку спауна. Попередня генерація світу виконується ще простіше, командою:
/wb fill
Оскільки ця дія потенційно може торкнутися гравців, що знаходяться на сервері, не забудьте підтвердити виконання:
/wb confirm
Загалом на те, щоб згенерувати світ радіусом у 5000 блоків (~40 млрд блоків) пішло приблизно 2 години на процесорі Intel Xeon Gold 6240. Тому, якщо хочете запустити прегенерацію більшої карти, враховуйте, що цей процес займе пристойну кількість часу , а сервер TPS буде серйозно знижено. Крім того, пам'ятайте, що навіть радіус у 5000 блоків вимагатиме приблизно 2 Гб місця на дисковому накопичувачі.
Незважаючи на те, що крайня версія плагіна була розроблена для Minecraft версії 1.14, досвідченим шляхом з'ясовано, що вона чудово працює і на наступних версіях. Повний список команд із поясненнями доступний
Проблемні блоки
Різновидів блоків у Minecraft безліч. Проте ми хотіли б зупинити увагу читачів на такому блоці, як TNT. Як випливає з назви, цей блок є вибухівкою (Примітка редакції - це ігровий предмет віртуального світу і нічого зі справжніми ВР цей предмет не має). Його особливість така, що у момент активації нею починає діяти сила гравітації. Це змушує сервер обрахувати всі координати, якщо блок починає падати.
Якщо блоків TNT кілька, то детонація одного блоку викликає детонацію та включення гравітації у сусідніх блоків, розкидаючи їх на всі боки. Вся ця гарна механіка на стороні сервера виглядає як безліч операцій з підрахунку траєкторії кожного з блоків, а також взаємодії із сусідніми блоками. Завдання вкрай ресурсомістке, що легко може перевірити кожен. Згенеруйте та підірвіть куб із блоків TNT, розміром хоча б 30x30x30. І якщо ви думали, що у вас хороший потужний ігровий комп'ютер, то дуже помилялися 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt
Подібний «експеримент» на сервері з Intel Xeon Gold 6240 привів до серйозного «просідання» TPS і 80% навантаження на CPU протягом усього часу детонації блоків. А отже, якщо хтось із гравців зможе зробити подібне, то проблема з продуктивністю торкнеться всіх гравців, що знаходяться на сервері.
Ще більш жорсткий варіант Кристали Краю. Якщо TNT все ж таки вибухає послідовно, то Кристали Краю детонують все одночасно, що в теорії може взагалі зупинити роботу серверної програми.
Уникнути цього сценарію можна лише повністю заборонивши використання даних блоків в ігровому світі. Наприклад, за допомогою плагіна
Висновок
Грамотне керування ігровим сервером – завдання не з простих. Складності та зниження продуктивності чекатимуть на кожному кроці, особливо якщо не брати до уваги саму механіку ігрового процесу. Передбачити все неможливо, адже гравці часом дуже винахідливі в спробах змусити сервер виконати те, для чого він не був призначений. Тільки розумний баланс між ризиками та встановлюваними обмеженнями дозволить серверу працювати в безперервному режимі та не знижувати свою продуктивність до критичних значень.
На карантині деякі наші співробітники скучили за улюбленими офісами і вирішили відтворити їх усередині Minecraft. Ви також маєте шанс заглянути до нас у гості, не ризикуючи своїм здоров'ям і не витрачаючи час на дорогу.
Для цього ми запрошуємо всіх бажаючих на наш сервер minecraft.selectel.ru (версія клієнта 1.15.2), де відтворено дата-центри Квіткова-1 та Квіткова-2. Не забудьте погодитись зі скачуванням додаткових ресурсів, вони необхідні для коректного відображення деяких локацій.
На вас чекають квести, промокоди, «паскалки» та приємне спілкування.
Джерело: habr.com