Na našem blogu već jesmo
Tijekom svoje 9-godišnje povijesti (računajući od datuma izlaska), Minecraft je stekao nevjerojatan broj obožavatelja i mrzitelja među običnim igračima i geekovima. Jednostavan koncept svijeta sazdanog od blokova razvio se iz jednostavnog oblika zabave u univerzalni medij za komunikaciju i stvaranje raznih predmeta iz stvarnog svijeta.
Osim gradnje, igra ima mogućnost stvaranja
Ali nemojmo dalje govoriti o tome što točno stvaraju igrači, već pogledajmo serverski dio aplikacije i istaknimo probleme (ponekad vrlo složene) koji se mogu pojaviti tijekom rada pod opterećenjem. Odmah rezervirajmo da ćemo govoriti samo o Java izdanju.
Vrste poslužitelja
Najjednostavnija opcija je poslužitelj ugrađen u klijent igre. Stvorili smo svijet, pritisnuli jednu tipku i server je postao dostupan preko lokalne mreže. Ova opcija ne može izdržati ozbiljno opterećenje i stoga je nećemo ni razmatrati.
Vanilija
Mojang Studios besplatno distribuira serverski dio igre kao Java aplikaciju
Ovaj pristup ima jedan ozbiljan nedostatak, točnije nedostatak mogućnosti izvan okvira za povezivanje dodataka koji proširuju funkcionalnost poslužitelja i omogućuju ne samo automatizaciju mnogih procesa, već i optimizaciju performansi. Osim toga, službeni poslužitelj ima prilično veliku potrošnju RAM-a za svakog spojenog igrača.
bukkit
Poslužiteljska aplikacija koju su izradili entuzijasti na temelju verzije Vanilla
Instalacija Bukkita nije teška; odgovarajuće upute nalaze se na resursu
SpigotMC
Kako bi se olakšao život programerima dodataka, postojala je potreba za API-jem za interakciju sa svijetom igara. Upravo su to problem koji su kreatori riješili.
Trenutno se SpigotMC aktivno razvija i koristi. Podržava sve dodatke stvorene za Bukkit, ali nije unazad kompatibilan s njim. Kako bi se zaobišlo DMCA Takedown, izumljena je elegantna metoda nazvana BuildTools. Ovaj alat eliminira potrebu za distribucijom kompajlirane aplikacije i omogućuje korisnicima da kompiliraju Spigot, CraftBukkit i Bukkit iz izvornog koda. Sve to čini zabranu DMCA beskorisnom.
PaperMC
Sve se činilo cool, a Spigot je postao odlična opcija. Ali nekim entuzijastima to nije bilo dovoljno, pa su kreirali vlastitu vilicu Spigota “na steroidima”. Na
PaperMC ima izvrsnu kompatibilnost, tako da dodaci napisani za SpigotMC mogu lako raditi na PaperMC-u, ali bez službene podrške. Prisutna je i povratna kompatibilnost sa SpigotMC-om. Sada kada smo naveli razne opcije za kreiranje poslužitelja, prijeđimo na probleme s performansama koji se mogu pojaviti.
Problemi i rješenja
Glavna stvar koju trebate razumjeti je da će se sve što je povezano s obradom svijeta igre obrađivati samo na jednoj računskoj jezgri fizičkog poslužitelja. Dakle, ako iznenada imate odličan poslužitelj s desetak računalnih jezgri, tada će se učitati samo jedna. Svi ostali bit će gotovo mirni. Ovo je arhitektura aplikacije i tu ne možete ništa učiniti. Dakle, pri odabiru poslužitelja obratite pozornost ne na broj jezgri, već na frekvenciju takta. Što je veći, performanse će biti bolje.
Što se tiče kapaciteta RAM-a, trebali bismo poći od sljedećih pokazatelja:
- planirani broj igrača;
- planirani broj svjetova na poslužitelju;
- veličina svakog svijeta.
Treba imati na umu da Java aplikacija uvijek treba rezervu RAM-a. Ako očekujete potrošnju memorije od 8 gigabajta, onda zapravo trebate imati 12. Brojke su relativne, ali bit se ne mijenja.
Za pokretanje poslužiteljskog dijela preporučujemo korištenje zastavica navedenih u članku
Generiranje mape blokova
"Zar stvarno misliš da Mjesec postoji samo kad ga gledaš?" (Albert Einstein)
Potpuno novi server. Čim se igrač prvi put uspješno poveže, lik iz igre pojavljuje se na općoj točki okupljanja (spawn). Ovo je jedino mjesto gdje je svijet igre unaprijed generiran od strane poslužitelja. Istog trenutka klijentski dio gleda postavke, a ključni parametar je udaljenost iscrtavanja. Mjeri se u komadima (površina karte je 16×16 i visoka 256 blokova). Koliko je komada naznačeno, točno koliko će ih biti zatraženo od poslužitelja.
Poslužitelj pohranjuje globalnu kartu svijeta, a ako u njoj još nema generiranih blokova u trenutku pojavljivanja lika igre, tada ih poslužitelj dinamički generira i pohranjuje. Ne samo da to zahtijeva velike računalne resurse, već i stalno povećava veličinu karte svijeta. Na jednom od najstarijih anarhističkih servera
Generiranje svijeta oko jednog igrača nije problem. Generiranje svijeta oko stotina igrača uzrokovat će manja usporavanja poslužitelja na kratko vrijeme, nakon čega će se opterećenje smanjiti. Generiranje svijeta na udaljenosti renderiranja klijenta od oko tisuću igrača već je sposobno "ispustiti" poslužitelj i izbaciti sve klijente s njega zbog vremenskog ograničenja.
U poslužiteljskom softveru postoji vrijednost kao što je TPS (Tikovi po poslužitelju - tikovi u sekundi). Normalno, 1 takt je jednak 50 ms. (1 sekunda stvarnog svijeta jednaka je 20 klikova svijeta igre). Ako se obrada jedne oznake poveća na 60 sekundi, aplikacija poslužitelja će se zatvoriti, izbacujući sve igrače.
Rješenje je ograničiti svijet na određene koordinate i izvesti preliminarnu generaciju blokova. Time uklanjamo potrebu za dinamičkim generiranjem tijekom igre, a poslužitelj će samo trebati čitati postojeću mapu. Oba problema mogu se riješiti jednim dodatkom
Najlakši način je postaviti granicu svijeta u obliku kruga u odnosu na točku stvaranja (iako je možete napraviti bilo kojeg oblika) jednom naredbom:
/wb set <радиус в блоках> spawn
Ako lik igrača pokuša prijeći granicu, bit će gurnut nekoliko blokova unazad. Ako se to učini nekoliko puta unutar ograničenog vremena, prijestupnik će biti prisilno teleportiran na točku stvaranja. Predgeneracija svijeta radi se još jednostavnije, naredbom:
/wb fill
Budući da ova radnja potencijalno može utjecati na igrače na poslužitelju, svakako potvrdite:
/wb confirm
Ukupno je bilo potrebno otprilike 5000 sata za generiranje svijeta s radijusom od 40 blokova (~2 milijardi blokova) na procesoru Intel® Xeon® Gold 6240. Stoga, ako želite unaprijed generirati veću kartu, imajte na umu da ovaj će proces potrajati dosta vremena, a TPS poslužitelja bit će ozbiljno smanjen. Također zapamtite da će čak i radijus od 5000 blokova zahtijevati približno 2 GB prostora na disku.
Unatoč činjenici da je najnovija verzija dodatka razvijena za verziju Minecrafta 1.14, eksperimentalno je utvrđeno da odlično radi na sljedećim verzijama. Dostupan je potpuni popis naredbi s objašnjenjima
Problemski blokovi
U Minecraftu postoji veliki izbor blokova. Međutim, htjeli bismo skrenuti pozornost čitatelja na takav blok kao TNT. Kao što ime sugerira, ovaj blok je eksploziv (napomena urednika - ovo je igraći predmet virtualnog svijeta i ovaj predmet nema ništa s pravim eksplozivom). Njegova je posebnost takva da u trenutku aktivacije na njega počinje djelovati sila teže. Ovo prisiljava poslužitelj da izračuna sve koordinate ako u ovom trenutku blok počne padati.
Ako postoji više TNT blokova, tada detonacija jednog bloka uzrokuje detonaciju i aktiviranje gravitacije u susjednim blokovima, raspršujući ih u svim smjerovima. Sva ova prekrasna mehanika na strani poslužitelja izgleda kao puno operacija za izračunavanje putanje svakog bloka, kao i interakcija sa susjednim blokovima. Zadatak je izuzetno zahtjevan, što svatko može lako provjeriti. Generirajte i detonirajte kocku od TNT blokova veličine najmanje 30x30x30. I ako ste mislili da imate dobro, moćno gaming računalo, jako ste se prevarili 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt
Sličan "eksperiment" na poslužitelju s Intel® Xeon® Gold 6240 doveo je do ozbiljnog pada TPS-a i 80% opterećenja CPU-a tijekom cijelog vremena detonacije bloka. Stoga, ako bilo koji igrač to može učiniti, tada će problem performansi utjecati na sve igrače na poslužitelju.
Još teža opcija - Rubni kristali. Ako TNT ipak eksplodira uzastopno, onda Edge Crystals detoniraju svi u isto vrijeme, što u teoriji može potpuno zaustaviti rad poslužiteljske aplikacije.
Ovaj se scenarij može izbjeći samo potpunom zabranom korištenja ovih blokova u svijetu igre. Na primjer, pomoću dodatka
Zaključak
Ispravno upravljanje serverom za igre nije lak zadatak. Poteškoće i pad performansi čekat će vas na svakom koraku, pogotovo ako ne uzmete u obzir same mehanike igranja. Nemoguće je sve predvidjeti, jer igrači ponekad znaju biti vrlo kreativni u pokušaju da natjeraju poslužitelja da učini nešto za što nije namijenjen. Samo razumna ravnoteža između rizika i uspostavljenih ograničenja omogućit će poslužitelju kontinuirani rad i ne smanjiti njegovu izvedbu na kritične vrijednosti.
Tijekom karantene nekim našim zaposlenicima nedostajali su njihovi omiljeni uredi i odlučili su ih ponovno stvoriti u Minecraftu. Također imate priliku doći nas posjetiti bez opasnosti za svoje zdravlje ili gubljenja vremena na putu.
Da bismo to učinili, pozivamo sve na naš poslužitelj minecraft.selectel.ru (klijentska verzija 1.15.2), gdje su rekreirani podatkovni centri Tsvetochnaya-1 i Tsvetochnaya-2. Ne zaboravite pristati na preuzimanje dodatnih resursa, oni su neophodni za točan prikaz nekih lokacija.
Očekuju vas misije, promotivni kodovi, uskršnja jaja i ugodna komunikacija.
Izvor: www.habr.com