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

Но без да навлизаме в по-нататъшни дискусии за това какво точно създават играчите, ще разгледаме сървърната страна на приложението и ще подчертаем проблеми (понякога доста сложни), които могат да възникнат по време на работа под натоварване. Нека уточним от самото начало, че ще обсъждаме само Java Edition.
Видове сървъри
Най-простият вариант е сървър, вграден в клиента на играта. Създайте свят, натиснете бутон и сървърът е достъпен през локалната мрежа. Тази опция не може да се справи със сериозно натоварване, така че дори няма да я разглеждаме.
ванилия
Mojang Studios разпространява сървърния компонент на играта като Java приложение безплатно. Това ви позволява да създадете свой собствен и личен свят, което го прави достъпен от всяка точка на планетата. За тези, които правят това за първи път, има чудесен , достъпно в съответната Wiki страница на играта.
Този подход има един сериозен недостатък: липсата на готова поддръжка за плъгини, които разширяват функционалността на сървъра и позволяват не само автоматизирането на много процеси, но и оптимизиране на производителността. Освен това, официалният сървър консумира значително количество RAM памет на свързан играч.
Букит
Сървърно приложение, създадено от ентусиасти, базирано на ваниловата версия значително разшири възможностите на играта чрез поддръжка на плъгини и модове. Това позволи не само добавянето на нови геймплей елементи, но и различни манипулации, недостъпни в стандартния софтуер. Интересното е, че това приложение изисква значително по-малко памет.
Инсталирането на Bukkit не е особено трудно, съответните инструкции са налични в ресурса. Но това няма смисъл, тъй като екипът на Bukkit се разпадна през 2014 г., разработчиците на проекта станаха служители на Mojang Studios и... изоставен. Така че, Bukkit е на практика мъртъв и е логично да насочим вниманието си към следващите два проекта.
SpigotMC
За да улеснят разработчиците на плъгини, имаше нужда от API за взаимодействие със света на играта. Именно този проблем създателите решиха. , като взема ядрото на Bukkit за основа и го преработва, за да постигне по-добра надеждност и производителност. Въпреки това Проектът беше блокиран поради Закона за авторското право в цифровото хилядолетие () и е невъзможно да се изтеглят изходните кодове оттам.
SpigotMC в момента се разработва и използва активно. Той поддържа всички плъгини, създадени за Bukkit, но не е обратно съвместим. За да се заобиколи забраната за премахване на DMCA, беше разработено елегантно решение, наречено BuildTools. Този инструмент елиминира необходимостта от разпространение на компилирано приложение и позволява на потребителите да компилират Spigot, CraftBukkit и Bukkit от изходния код. Това прави забраната на DMCA безполезна.
PaperMC
Изглеждаше, че всичко е чудесно и Spigot беше чудесен вариант. Но някои ентусиасти не бяха доволни от това, затова създадоха свой собствен fork на Spigot „на стероиди“. Ключовото предимство е посочено като „Ужасно бързо е“. Разработено Това ви позволява бързо да разрешавате възникнали проблеми, а разширеният API ви позволява да създавате интересни плъгини. PaperMC може да се стартира с проста команда, както е показано на .
PaperMC има отлична съвместимост, така че плъгините, написани за SpigotMC, ще работят лесно на PaperMC, но без официална поддръжка. Налична е и обратна съвместимост със SpigotMC. След като разгледахме различните опции за създаване на сървъри, нека преминем към проблеми с производителността, които могат да възникнат.
Проблеми и решения
Основното, което трябва да се разбере, е, че всичко, свързано с обработката на игровия свят, ще се обработва само от едно ядро на физическия сървър. Така че, дори да имате фантастичен сървър с дузина ядра, само едно ще бъде натоварено. Останалите по същество ще бъдат в режим на готовност. Това е естеството на архитектурата на приложението и няма какво да направите по въпроса. Така че, когато избирате сървър, обърнете внимание не на броя на ядрата, а на тактовата честота. Колкото по-висока е тактовата честота, толкова по-добра е производителността.
Що се отнася до въпроса за количеството RAM, трябва да се вземат предвид следните показатели:
- планиран брой играчи;
- планиран брой светове на сървъра;
- размера на всеки свят.
Важно е да запомните, че едно Java приложение винаги изисква известна RAM памет. Ако очаквате 8 гигабайта памет, всъщност ще ви трябват 12. Тези числа са произволни, но същността остава същата.
За да стартирате сървърната част, препоръчваме да използвате флаговете, посочени в статията. Тази „черна магия“ позволява на сървъра правилно да конфигурира своя събирач на боклук и да оптимизира използването на RAM памет. Избягвайте да разпределяте повече памет, отколкото сървърът действително изразходва, по време на пиково натоварване на плейъра.
Генериране на блокова карта
„Наистина ли мислиш, че Луната съществува само когато я гледаш?“ (Алберт Айнщайн)
Напълно нов сървър. Веднага щом играч се свърже успешно за първи път, игровият герой се появява на обща точка за събиране (точка на раждаемост). Това е единственото място, където игровият свят е предварително генериран от сървъра. В този момент клиентската страна проверява настройките, а ключовият параметър е разстоянието за рисуване. То се измерва в парчета (площ на картата 16x16 с височина 256 блока). Броят на парчетата, посочени там, е точно колко ще бъдат поискани от сървъра.
Сървърът съхранява глобална карта на света и ако тя все още не съдържа генерирани блокове в точката на поява на героя на играча, сървърът динамично ги генерира и съхранява. Това не само изисква значителни изчислителни ресурси, но и постоянно увеличава размера на картата на света. На един от най-старите сървъри на Anarchy (2builders2tools) Размерът на картата вече е надхвърлил 8 TB, а границата на света е на 30 милиона блока. Този сървър е свързан с хиляди истории и заслужава отделна статия от поредицата.
Генерирането на свят около един играч не е проблем. Генерирането на свят около стотици играчи ще доведе до леко забавяне на сървъра за кратко време, след което натоварването ще намалее. Генерирането на свят в обсега на клиента около хиляди играчи може да доведе до срив на сървъра и да доведе до прекъсване на работата на всички клиенти.
В сървърния софтуер има такава ценност като TPS (Тикове на сървър – тактове в секунда). Един такт обикновено е равен на 50 мс. (Една секунда в реалния свят е равна на 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Както подсказва името, този блок е експлозив. (Забележка на редактора: Това е игрови предмет за виртуалния свят и няма нищо общо с истинските BB)Особеността му е, че при активиране върху него започва да действа гравитацията. Това принуждава сървъра да преизчисли всички координати, ако блокът започне да пада в този момент.
Ако има множество TNT блокове, детонацията на един блок задейства детонацията и гравитационното активиране на съседни блокове, разпръсквайки ги във всички посоки. Цялата тази механика от страна на сървъра се състои от множество операции за изчисляване на траекторията на всеки блок, както и взаимодействия със съседните блокове. Това е изключително ресурсоемка задача, както всеки може лесно да провери. Генерирайте и детонирайте куб от TNT блокове, с размери поне 30x30x30. И ако сте си мислили, че имате добър, мощен геймърски компютър, жестоко сте се сгрешили.
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt 
Подобен „експеримент“ на сървър с Intel® Xeon® Gold 6240 доведе до значителен спад на TPS и 80% натоварване на процесора за цялото времетраене на детонацията на блока. Следователно, ако някой играч успее да извърши това, проблемът с производителността ще засегне всички играчи на сървъра.
Още по-труден вариант е - Крайни кристалиАко тротилът експлодира последователно, Крайните кристали ще детонират едновременно, което теоретично би могло да спре работата на сървърното приложение.
Този сценарий може да се избегне само чрез пълно деактивиране на използването на тези блокове в игровия свят. Например, чрез използване на плъгин Моля, обърнете внимание, че този плъгин не работи самостоятелно без друг плъгин. Така че, първо инсталирайте WorldEdit, а след това WorldGuard.
Заключение
Правилното управление на игрови сървър не е лесна задача. Трудности и влошаване на производителността ще дебнат на всяка крачка, особено без да се вземат предвид самите механики на играта. Невъзможно е да се предвиди всичко, тъй като играчите понякога могат да бъдат много изобретателни в опитите си да принудят сървъра да изпълнява задачи, за които не е проектиран. Само разумен баланс между рисковете и установените ограничения ще гарантира, че сървърът ще остане работещ, без да се влоши до критични нива.
По време на карантината някои от нашите служители се скучаеше по любимите си офиси и решиха да ги пресъздадат в Minecraft. Вие също имате възможност да ни посетите, без да рискувате здравето си или да губите време за пътуване.
За тази цел каним всички на нашия сървър. minecraft.selectel.ru (клиентска версия 1.15.2), която пресъздава центровете за данни Цветочная-1 и Цветочная-2. Не забравяйте да се съгласите да изтеглите допълнителни ресурси; те са необходими за правилното показване на някои местоположения.
Очакват ви куестове, промо кодове, великденски яйца и приятен разговор.
Източник: www.habr.com
