
В нашия блог вече , как да създадете свой Minecraft сървър, обаче оттогава са минали 5 години и много неща се промениха. Споделяме с вас актуални начини за създаване и оптимизиране на сървърната част на тази популярна игра.
През своята 9-годишна история (ако считаме от датата на пускане) Minecraft спечели невероятно количество почитатели и хейтъри както сред обикновените играчи, така и сред гиковете. Простата концепция на света от кубчета се превърна от обикновено развлечение в универсална среда за общуване и създаване на различни обекти от реалния свят.
Освен строителството, в играта има възможност да се създават , които позволяват реализирането на пълноценни алгоритми в Minecraft. В YouTube има много впечатляващи видеа, в които хора, вложили огромно количество усилия и време, са създали копие на различни електронни устройства или са построили детално копие на и архитектурни структури. Всичко е ограничено само от въображението на играча и възможностите на игровата вселена.

Но нека не говорим повече за това, което именно играчите създават, а да погледнем на сървърната част на приложението и да осветим проблемите (понякога доста сложни), които могат да възникнат по време на работа под натоварване. Веднага уточняваме, че говорим само за Java Edition.
Видове сървъри
Най-простият вариант е сървърът, вграден в клиента на играта. Създадехте свят, натиснахте един бутон, и ето, сървърът стана достъпен по локалната мрежа. Такъв вариант не може да издържи на никакво сериозно натоварване, затова нямаме да го разглеждаме дори.
Vanilla
Компанията Mojang Studios разпространява сървърната част на играта под формата на Java приложение безплатно . Това позволява да създадете свой собствен и персонален свят, като го направите достъпно за свързване от всяка точка на планетата. За тези, които го правят за пръв път, има отличен , наличен в съответната игрова Wiki.
Този подход има един сериозен недостатък, а именно – липсата на възможности за добавяне на плъгини, които разширяват функционалността на сървъра и позволяват не само автоматизиране на много процеси, но и оптимизиране на производителността. Освен това, официалният сървър консумира значително количество оперативна памет на всеки свързан играч.
Bukkit
Сървърното приложение, създадено от ентусиасти на базата на Vanilla версията , значително разширяваше възможностите на играта чрез поддръжка на плъгини и модификации. То позволи не само добавянето на нови блокове в игровия процес, но и извършването на различни манипулации, недостъпни за ваниловото ПО. Интересно е, че това приложение изискваше значително по-малко памет.
Инсталирането на Bukkit не е особено трудно, съществуваща инструкция може да бъде намерена на ресурса . Но това няма смисъл, тъй като от 2014 година екипът на Bukkit се разпадна, разработчиците на проекта станаха служители на Mojang Studios, а проектът е забравен. Така че, Bukkit всъщност е мъртъв и има смисъл да се обърне внимание на следващите два проекта.
SpigotMC
За да се улесни животът на разработчиците на плъгини, имаше нужда от API за взаимодействие с игровия свят. Тази задача решиха създателите на , като взеха за основа ядрото на Bukkit и го преработиха, за да постигнат по-добра надеждност и производителност. Въпреки това, проектът беше блокиран поради Закона за авторско право в цифровата ера (), и изтеглянето на изходните кодове оттам е невъзможно.
В момента SpigotMC активно се развива и използва. То поддържа всички плъгини, създадени за Bukkit, но не е обратно съвместимо с него. За да заобиколи забраната DMCA Takedown, беше измислен елегантен метод, наречен BuildTools. Този инструмент освобождава от необходимостта от разпространение на компилирано приложение и позволява на потребителите да компилират Spigot, CraftBukkit и Bukkit от изходния код. Всичко това прави забраната DMCA безполезна.
PaperMC
Изглежда, всичко е страхотно, и Spigot стана прекрасен вариант. Но на някои ентусиасти им се стори недостатъчно и те създадоха свой собствен форк на Spigot "на стероиди". На ключовото качество е посочено, че "е бързо досадно". Развито бързо да разрешава възникнали въпроси, а разширеното API — да създава интересни плъгини. Стартирането на PaperMC може да стане с една проста команда, посочена в .
Съществува отлична съвместимост на PaperMC, така че написаните плъгини за SpigotMC лесно ще работят на PaperMC, но без официална поддръжка. Обратната съвместимост със SpigotMC също е налична. Сега, когато изброихме различни варианти за създаване на сървър, преминаваме към проблемите с производителността, които могат да възникнат.
Проблеми и решения
Главното, което трябва да се разбере, е, че всичко, свързано с обработката на игровия свят, ще се обработва само на едно изчислително ядро на физическия сървър. Така че, ако имате страхотен сървър с десетина изчислителни ядра, то ще бъде натоварено само едно. Всички останали ще стоят празни. Такова е приложението, и нищо не можете да направите по въпроса. Затова при избор на сървър трябва да обърнете внимание не на броя ядра, а на тактовата честота. Колкото по-висока е тя, толкова по-добра ще бъде производителността.
Що се отнася до обема на оперативната памет, тук трябва да се ръководите по следните показатели:
- планирано количество играчи;
- планирано количество светове на сървера;
- размер на всеки свят.
Трябва да се помни, че Java приложението винаги изисква резерв по оперативна памет. Ако разчитате на потребление на памет от 8 гигабайта, трябва всъщност да имате 12. Числата са условни, но същността си остава.
За стартиране на сървърната част препоръчваме да се използват флаговете, посочени в статията . Тази "черна магия" позволява на сървъра да настрои правилно "събирача на боклук" и оптимизира използването на оперативна памет. Не трябва да се отделя памет повече, отколкото реално консумира сървъра при пиково натоварване на играчите.
Генерация на карта на блоковете
“Наистина ли мислите, че Луната съществува само когато я гледате?” (Алберт Айнщайн)
Напълно нов сървър. В момента, в който играчът се свърже успешно за първи път, игровият персонаж се появява на общата точка за раждане (спаун). Това е единственото място, където игровият свят предварително се генерира от сървъра. В същия момент клиентската част проверява настройките, а ключовият параметър е разстоянието на визуализация. То се измерва в чанкове (област на картата 16×16 и височина 256 блока). Колкото чанкове са зададени, точно толкова ще бъдат запитани от сървъра.
На сървъра се съхранява глобалната карта на света и ако в нея все още няма генерирани блокове в точката на раждане на игровия персонаж, тогава сървърът ги генерира динамично и ги запазва за себе си. Не само, че това изисква големи изчислителни ресурси, но и постоянно увеличава размера на световната карта. На един от най-старите анархични сървъри (2builders2tools) размерът на картата вече надвиши 8 TB, а границата на света преминава на отметка от 30 милиона блока. С този сървър са свързани хиляди истории и той заслужава отделна статия или серия статии.
Генерирането на света около един играч не е проблем. Генерирането на света около стотици играчи ще предизвика незначителни забавяния на сървъра за кратко време, след което натоварването ще намалее. Генерирането на света на разстояние на визуализация на клиента около хиляда играчи вече може да „срути“ сървъра и да изхвърли всички клиенти поради таймаут.
В сървърния софтуер съществува стойност, наречена TPS (Ticks per Server — тактове в секунда). По правило 1 такт е равен на 50 ms. (1 секунда на реалния свят е равна на 20 такта на игровия свят). Ако обработката на един такт нарасне до 60 секунди — сървърното приложение ще бъде затворено, изхвърляйки всички играчи.
Решението е да се ограничи светът до определени координати и да се извърши предварителна генерация на блокове. Така ще се премахне нуждата от динамична генерация по време на игра и на сървъра ще му стигне да прочете вече съществуващата карта. И двата въпроса се решават с един единствен плъгин .
Най-лесно е да се зададе границата на света под формата на окръжност спрямо точката на спауна (въпреки че може да бъде направена в произволна форма) с една команда:
/wb set <радиус в блоках> spawnАко игровият персонаж се опита да премине границата, той ще бъде отхвърлен назад с няколко блока. Ако това се повтори няколко пъти за ограничен период от време, нарушителят ще бъде принудително телепортиран до точката на респаун. Предварителната генерация на света се извършва още по-лесно с командата:
/wb fillТъй като това действие потенциално може да засегне играчите, които са на сървъра, не забравяйте да потвърдите извършването му:
/wb confirmОбщо за генерирането на свят с радиус 5000 блока (~40 милиарда блока) отне около 2 часа на процесор Intel® Xeon® Gold 6240. Следователно, ако искате да стартирате прегенерация на по-голяма карта, имайте предвид, че този процес ще отнеме значително време, а TPS на сървъра ще бъде сериозно намалено. Освен това, имайте предвид, че дори радиус от 5000 блока изисква около 2 GB пространство на дисковия носител.
Въпреки че последната версия на плъгина е разработена за Minecraft версия 1.14, е установено, че той работи прекрасно и на по-късни версии. Пълният списък с команди с обяснения е наличен .
Проблемни блокове
В Minecraft има безброй видове блокове. Въпреки това, бихме искали да привлечем вниманието на читателите към такъв блок като TNT. Както подсказва името, този блок представлява експлозив. (редакционна нотка - това е игрови предмет от виртуалния свят и няма нищо общо с действителните взривни вещества). Неговата особеност е, че в момента на активиране върху него започва да действа силата на гравитацията. Това кара сървъра да изчисли всички координати, ако в този момент блокът започне да пада.
Ако TNT блоковете са повече, detonation на един блок предизвиква детонация и включване на гравитацията за съседните блокове, разпръсквайки ги в различни посоки. Цялата тази красива механика от страна на сървъра изглежда като множество операции по изчисляване на траекторията на всеки от блоковете, както и взаимодействие с съседните блокове. Задачата е изключително ресурсно интензивна, което всеки може лесно да провери. Генерирайте и взривете куб от TNT блокове с размер поне 30x30x30. И ако сте си мислили, че имате наистина мощен игрови компютър, лъжете се 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt 
Подобен "експеримент" на сървър с Intel® Xeon® Gold 6240 доведе до сериозно "падане" на TPS и 80% натоварване на CPU по време на детонацията на блоковете. Следователно, ако някой от играчите успее да направи нещо подобно, проблемът с производителността ще засегне всички играчи на сървъра.
Още по-строг вариант — Кристали на Края. Ако TNT все пак избухне последователно, Кристалите на Края детонират едновременно, което в теорията може да спре напълно работата на сървърното приложение.
Да се избегне този сценарий може да стане единствено чрез пълна забрана на използването на тези блокове в игровия свят. Например с помощта на плъгин . Имайте предвид, че самият този плъгин не работи без друг плъгин . Така че първо инсталирайте WorldEdit, а след това WorldGuard.
Заключение
Управлението на игрови сървър е задача, която не е лесна. Сложности и спад на производителността ще ви поджидат на всяка крачка, особено ако не се взема предвид самата механика на игровия процес. Невъзможно е да предвидите всичко, защото играчите понякога са много изобретателни в опитите си да накарат сървъра да изпълни това, за което не е предназначен. Само разумният баланс между рисковете и поставените ограничения ще позволи на сървъра да работи в непрекъснат режим и да не снижава производительността си до критични стойности.
На карантина някои от нашите служители се заскучили по любимите си офиси и решиха да ги пресъздадат в Minecraft. И вие също имате шанс да ни посетите, без да рискувате здравето си и без да губите време за път.
За целта каним всички желаещи на нашия сървър minecraft.selectel.ru (клиентска версия 1.15.2), където са пресъздадени центровете за данни Цветочна-1 и Цветочна-2. Не забравяйте да се съгласите на изтеглянето на допълнителни ресурси, те са необходими за правилното изобразяване на някои локации.
Очакват ви куестове, промокодове, "великденски яйца" и приятно общуване.
Източник: habr.com
