Optimizacija Minecraft poslužitelja

Optimizacija Minecraft poslužitelja
Na našem blogu već jesmo rekao, kako stvoriti vlastiti Minecraft server, ali od tada je prošlo 5 godina i puno se toga promijenilo. Dijelimo s vama trenutne načine za stvaranje i optimizaciju poslužiteljskog dijela tako popularne igre.

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 logika, koji vam omogućuju implementaciju punopravnih algoritama unutar Minecrafta. YouTube je prepun vrlo dojmljivih videa u kojima su ljudi, uloživši ogroman trud i potrošivši puno vremena, napravili kopiju ovog ili onog elektroničkog uređaja ili izradili detaljnu kopiju postojanje и izmišljena arhitektonske građevine. Sve je ograničeno samo igračevom maštom i mogućnostima gaming svemira.


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 na službenoj web stranici. To vam omogućuje stvaranje vlastitog namjenski poslužitelj i osobni svijet, čineći ga dostupnim za povezivanje s bilo kojeg mjesta na planetu. Za one koji ovo rade prvi put, postoji super tutorial, dostupno na odgovarajućoj Wiki igrici.

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 bukkit značajno je proširio mogućnosti igre podržavajući dodatke i modove (modifikacije). Omogućio je ne samo dodavanje novih blokova igranju, već i izvođenje raznih manipulacija koje su bile nedostupne vanilla softveru. Zanimljivo je da je ova aplikacija zahtijevala znatno manje memorije.

Instalacija Bukkita nije teška; odgovarajuće upute nalaze se na resursu GamePedia. Ali to nema smisla, budući da se od 2014. Bukkit tim raspao, programeri projekta postali su zaposlenici Mojang Studiosa, a spremište napuštena. Dakle, Bukkit je zapravo mrtav, a ima smisla obratiti pažnju na sljedeća dva projekta.

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. slavina, uzimajući Bukkitovu jezgru i prerađujući je kako bi se postigla bolja pouzdanost i izvedba. Štoviše, Git spremište projekt je blokiran zbog Zakona o autorskim pravima u digitalnom tisućljeću (DMCA), te je nemoguće preuzeti izvorni kod od tamo.

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 stranica projekta ključna prednost je u tome što je "brzo glupo". Razvijen zajednica omogućuje vam brzo rješavanje novonastalih problema, a prošireni API omogućuje vam stvaranje zanimljivih dodataka. PaperMC možete pokrenuti jednom jednostavnom naredbom dokumentacija.

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 Podešavanje JVM – G1GC Garbage Collector Flags za Minecraft. Ova "crna magija" omogućuje poslužitelju da ispravno konfigurira "sakupljač smeća" i optimizira korištenje RAM-a. Ne biste trebali dodijeliti više memorije nego što poslužitelj stvarno troši tijekom najvećeg priljeva igrača.

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 2b2t (2builders2tools) Veličina karte je već premašila 8 Tb, a granica svijeta je na oko 30 milijuna blokova. Postoje tisuće priča povezanih s ovim poslužiteljem i zaslužuje svoj članak u seriji.

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 Svjetska granica.

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 na forumu dodataka.

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

Optimizacija Minecraft poslužitelja
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 WorldGuard. Imajte na umu da ovaj dodatak sam po sebi ne radi bez drugog dodatka WorldEdit. Dakle, prvo instalirajte WorldEdit, a zatim WorldGuard.

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

Dodajte komentar