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