
Na našem blogu smo već , kako stvoriti svoj Minecraft server, ali od tada je prošlo 5 godina i mnogo se toga promenilo. Delimo s vama aktuelne načine za kreiranje i optimizaciju serverske strane ove popularne igre.
Tokom svoje 9-godišnje istorije (ako se broji od datuma izlaska), Minecraft je stekao neverovatnu količinu obožavatelja i kritičara, kako među običnim igračima, tako i među entuzijastima. Jednostavna koncepcija sveta od kocaka pretvorila se iz obične zabave u univerzalno okruženje za komunikaciju i kreiranje različitih objekata iz stvarnog sveta.
Pored gradnje, u igri postoji mogućnost kreiranja , koje omogućavaju realizaciju kompletnog algoritma unutar Minecrafta. Na YouTubeu ima mnogo impresivnih video zapisa, gde su ljudi, uloživši ogromne napore i vreme, stvorili repliku nekog elektronskog uređaja ili izgradili detaljnu kopiju in arhitektonskih građevina. Sve se svodi samo na maštu gejmera i mogućnosti igračke univerzuma.

Ali nećemo dalje govoriti o tome šta igrači stvaraju, već ćemo se posvetiti serverskoj strani aplikacije i osvetliti probleme (ponekad veoma složene) koji se mogu javiti tokom rada pod opterećenjem. Odmah napominjemo da ćemo se baviti samo Java Edition.
Vrste servera
Najjednostavnija opcija je server ugrađen u klijent igre. Napravili ste svet, pritisnuli jedan dugme i server je postao dostupan na lokalnoj mreži. Ova opcija ne može izdržati ozbiljno opterećenje, pa je nećemo ni razmatrati.
Vanilla
Kompanija Mojang Studios besplatno deli serverski deo igre u obliku Java aplikacije . To omogućava kreiranje sopstvenog i ličnog sveta, čineći ga dostupnim za povezivanje iz bilo kog dela planete. Za one koji to rade prvi put, postoji odličan , dostupan u odgovarajućoj igračkoj Wiki.
Ovaj pristup ima jedan ozbiljan nedostatak, a to je — nedostatak mogućnosti "iz kutije" za povezivanje pluginova koji proširuju funkcionalnost servera i omogućavaju ne samo automatizaciju mnogih procesa, već i optimizaciju performansi. Pored toga, službeni server ima prilično visoku potrošnju radne memorije po svakom povezanom igraču.
Bukkit
Aplikacija za server koju su stvorili entuzijasti na bazi Vanilla verzije značajno je proširila mogućnosti igre podržavajući dodatke i modove (modifikacije). Omogućila je ne samo dodavanje novih blokova u igru, već i izvođenje raznih manipulacija koje vanilski softver nije omogućavao. Zanimljivo je da je ova aplikacija zahtevala znatno manje memorije.
Instalacija Bukkit-a nije posebno teška, odgovarajuća instrukcija je dostupna na resursu . No, to nema smisla, jer se tim Bukkit-a raspao 2014. godine, a programeri projekta postali su zaposleni u Mojang Studios, a napušten. Tako da je Bukkit zapravo mrtav i ima smisla obratiti pažnju na dva naredna projekta.
SpigotMC
Kako bi se olakšao život programerima dodataka, postojala je potreba za API-jem za interakciju sa igračkim svetom. Upravo tu potrebu su zadovoljili kreatori , uzimajući kao osnovu jezgro Bukkit-a i preradivši ga radi bolje pouzdanosti i performansi. Ipak, projekat je bio blokiran zbog Zakona o autorskim pravima u digitalnom veku (), i preuzimanje izvornih kodova odatle nije moguće.
Trenutno se SpigotMC aktivno razvija i koristi. Podržava sve dodatke stvorene za Bukkit, ali nije unazad kompatibilan s njim. Da bi se izbegla zabrana DMCA, smislili su elegantan način nazvan BuildTools. Ovaj alat uklanja potrebu za distribucijom kompilirane aplikacije i omogućava korisnicima da izvrše kompilaciju Spigot-a, CraftBukkit-a i Bukkit-a iz izvornih kodova. Sve to čini zabranu DMCA besmislenom.
PaperMC
Bilo bi logično da je sve u redu i da je Spigot odlična opcija. No, nekim entuzijastima to se činilo nedovoljnim, pa su napravili svoj vlastiti fork Spigot-a "na steroidima". Na ključnom kvalitetu navodi se da “It’s stupid fast”. Razvijena omogućava brzo rešavanje nastalih pitanja, a prošireni API - izradu zanimljivih dodataka. Pokretanje PaperMC-a moguće je jednostavnom komandom, koja je prikazana u .
Z združljivostjo PaperMC je vse v redu, tako da bodo vtičniki napisani za SpigotMC zlahka delovali tudi na PaperMC, vendar brez uradne podpore. Tudi obratna združljivost s SpigotMC je prisotna. Zdaj, ko smo navedli različne možnosti za ustvarjanje strežnika, preidimo k težavam z zmogljivostjo, ki se lahko pojavijo.
Težave in rešitve
Najpomembneje je razumeti, da se vse, kar se tiče obdelave igralnega sveta, obdeluje le na enem procesorskem jedru fizičnega strežnika. Torej, če imate čudovit strežnik z ducatom procesorskih jeder, bo obremenjeno le eno. Vsa ostala bodo dejansko neaktivna. Takšna je arhitektura aplikacije in s tem ne morete nič narediti. Tako je ob izbiri strežnika treba paziti ne na število jeder, temveč na taktirno frekvenco. Višja kot je, boljša bo zmogljivost.
Kar zadeva količino delovnega spomina, je treba izhajati iz naslednjih meril:
- predvideno število igralcev;
- predvideno število svetov na strežniku;
- velikost vsakega sveta.
Treba je opozoriti, da Java aplikaciji vedno potrebuje rezervo delovnega spomina. Če načrtujete porabo spomina 8 gigabajtov, morate dejansko imeti 12. Številke so simbolične, vendar bistvo ostaja nespremenjeno.
Za zagon strežniškega dela priporočamo uporabo zastavic, navedenih v članku . Ta "črna magija" omogoča, da se strežnik pravilno nastavi za "sistem za zbiranje smeti" in optimizira uporabo delovnega spomina. Ne dodeljujte več spomina, kot ga strežnik dejansko porabi ob vrhuncu števila igralcev.
Generacija zemljevida blokov
„Ali resnično mislite, da Luna obstaja samo, ko jo gledate?“ (Albert Einstein)
Popolnoma nov strežnik. Ko se igralec prvič uspešno poveže, se njegov igralni lik pojavi na skupni zbirni točki (spawn). To je edino mesto, kjer je igralni svet vnaprej generiran s strežnikom. V tem trenutku odjemalski del preverja nastavitve, pri čimer je ključni parameter razdalja risanja. Ta se meri v chunkih (območje zemljevide 16×16 in višine 256 blokov). Koliko chunkov je tam navedeno, toliko jih bo zahtevano od strežnika.
Na strežniku je shranjena globalna karta sveta, in če v točki, kjer se pojavi igralni lik, še ni generiranih blokov, jih strežnik dinamično generira in shranjuje. Poleg tega, da to zahteva velike izračunske zmogljivosti, nenehno povečuje tudi velikost sveta. Na enem najstarejših anarhičnih strežnikov (2builders2tools) je velikost zemljevida že presegla 8 Tb, meja sveta pa poteka pri oznaki 30 milijonov blokov. S tem strežnikom je povezanih tisoč zgodb, zato si zasluži ločen članek ali serijo člankov.
Generiranje sveta okoli enega igralca ni težava. Generiranje sveta okoli sto igralcev bo povzročilo manjše zamude strežnika za kratek čas, po katerem se bo obremenitev zmanjšala. Generiranje sveta na razdalji risanja odjemalca okoli tisoč igralcev bo že sposobno "urašiti" strežnik in iz njega izgnati vse odjemalce zaradi prekinitev.
V strežniškem programu obstaja takšna vrednost kot TPS (Ticks per Server — taktov na sekundo). Privzeto 1 takt traja 50 ms. (1 sekunda resničnega sveta je enaka 20 taktov igralnega sveta). Če se obdelava enega takta podaljša na 60 sekund, se bo strežniška aplikacija zaprla in izgnala vse igralce.
Izhod je omejiti svet na določene koordinate in opraviti predhodno generacijo blokov. Tako se izognemo potrebi po dinamični generaciji med igranjem, in strežniku bo dovolj, da prebere obstoječ zemljevid. Obe težavi reši ena samotni vtičnik. .
Najlažje je določiti mejo sveta v obliki kroga glede na točko spawn (čeprav jo je mogoče oblikovati poljubno) z eno ukazno vrstico:
/wb set <радиус в блоках> spawnČe igralni lik poskusi prekoračiti mejo, bo potisnjen več blokov nazaj. Če to storite večkrat v omejenem času, bo prekršitelj prisilno teleportiran na točko pojava. Predhodna generacija sveta se izvaja še preprosteje, s pomočjo ukaza:
/wb fillKer ta akcija potencialno lahko vpliva na igralce, ki so prisotni na strežniku, ne pozabite potrditi izvedbo:
/wb confirmV skupnem je za generiranje sveta s premerom 5000 blokov (~40 milijard blokov) potrebovalo približno 2 uri na procesorju Intel® Xeon® Gold 6240. Zato, če želite zagnati pre-generacijo večje karte, upoštevajte, da bo ta proces trajal kar precej časa, TPS strežnika pa se bo resno zmanjšal. Poleg tega ne pozabite, da tudi premer 5000 blokov zahteva približno 2 GB prostora na disku.
Kljub temu da je zadnja različica vtičnika zasnovana za Minecraft različice 1.14, smo s poskusom ugotovili, da deluje tudi na poznejših različicah. Celoten seznam ukazov s pojasnili je na voljo .
Problematični bloki
V Minecraftu obstaja neskončno mnogo vrst blokov. Vendar bi radi bralcem namenili pozornost bloku, kot je TNT. Kot pove že ime, ta blok predstavlja eksploziv. (opomba uredništva - to je igralni predmet v virtualnem svetu in nima nobene povezave z dejanskimi eksplozivi). Njegova posebnost je, da ob aktivaciji nanj začne delovati gravitacija. To povzroči, da strežnik izračuna vse koordinate, če blok začne padati.
Če je več blokov TNT, detonacija enega bloka sproži detonacijo in activacijo gravitacije pri sosednjih blokih, ki jih razprši na vse strani. Vsa ta lepa mehanika na strani strežnika izgleda kot mnogo operacij za izračun poti vsakega od blokov ter interakcije s sosednjimi bloki. Naloga je izjemno zahtevna, kar lahko vsak zlahka preveri. Ustvarite in raznesite kocko blokov TNT, velikosti vsaj 30x30x30. In če ste mislili, da imate dober zmogljiv računalnik, ste se zelo zmotili 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt 
Podoben 'eksperiment' na strežniku z Intel® Xeon® Gold 6240 je povzročil resne 'padce' TPS in 80% obremenitev CPU med celotnim časom detonacije blokov. To pomeni, da, če bi kdorkoli iz igralcev to lahko storil, bi problem s zmogljivostjo prizadel vse igralce, ki so na strežniku.
Še bolj stroga različica — Kristali Roba. Če TNT vseeno eksplodira zaporedno, se Kristali Roba detonirajo vsi hkrati, kar teoretično lahko popolnoma ustavi delovanje strežniške aplikacije.
Te scenarije lahko preprečite le tako, da popolnoma prepoveste uporabo teh blokov v igralnem svetu. Na primer, z uporabo vtičnika . Upoštevajte, da ta vtičnik sam po sebi ne deluje brez drugega vtičnika . Torej najprej namestite WorldEdit, nato pa WorldGuard.
Zaključek
Pametno upravljanje igralnega strežnika ni enostavna naloga. Težave in zmanjšanje zmogljivosti bodo čakale na vsakem koraku, še posebej, če ne upoštevamo same mehanike igralnega procesa. Predvideti vse je nemogoče, saj so igralci včasih zelo iznajdljivi pri poskušanju, da bi strežnik prisilili, da izvede tisto, za kar ni bil namenjen. Le razumen balans med tveganji in uvedenimi omejitvami bo omogočil, da strežnik deluje v neprekinjenem načinu in ne zmanjša svoje zmogljivosti do kritičnih vrednosti.
Med karanteno so se nekateri naši zaposleni pogrešali svoja ljubljena pisarniška okolja in se odločili, da jih obnovijo znotraj Minecrafta. Tudi vi imate priložnost, da nas obiščete, ne da bi tvegali svoje zdravje in ne da bi porabili čas na poti.
Zato vabimo vse, da se nam pridružijo na našem strežniku minecraft.selectel.ru (verzija odjemalca 1.15.2), kjer so obnovljeni podatkovni centri Cvetlična-1 in Cvetlična-2. Ne pozabite se strinjati s prenosom dodatnih virov, ti so potrebni za pravilno prikazovanje nekaterih lokacij.
Čakajo vas naloge, promocijske kode, 'velikonočne jajčke' in prijetno druženje.
Izvor: habr.com
