Meie blogis oleme seda juba teinud
Minecraft on oma 9-aastase ajaloo jooksul (alates väljalaskekuupäevast) pälvinud hämmastavalt palju fänne ja vihkajaid nii tavaliste mängijate kui ka geekide seas. Plokkidest koosneva maailma lihtne kontseptsioon on arenenud lihtsast meelelahutusvormist universaalseks meediumiks suhtlemiseks ja reaalsest maailmast erinevate objektide loomiseks.
Lisaks ehitusele on mängul ka loomise võimalus
Kuid ärme räägi pikemalt sellest, mida mängijad täpselt loovad, vaid vaatame rakenduse serveriosa ja toome välja probleemid (mõnikord väga keerulised), mis võivad koormuse all töötamise ajal tekkida. Teeme kohe reservatsiooni, et räägime ainult Java väljaandest.
Serverite tüübid
Lihtsaim variant on mängukliendisse sisseehitatud server. Tegime maailma, vajutasime ühte nuppu ja server sai ligipääsetavaks üle kohaliku võrgu. See valik ei talu tõsist koormust ja seetõttu me seda isegi ei kaalu.
Vanilla
Mojang Studios levitab mängu serveriosa tasuta Java-rakendusena
Sellel lähenemisviisil on üks tõsine puudus, nimelt valmisoleku puudumine pistikprogrammide ühendamiseks, mis laiendavad serveri funktsionaalsust ja võimaldavad mitte ainult automatiseerida paljusid protsesse, vaid ka optimeerida jõudlust. Lisaks on ametlikus serveris iga ühendatud mängija kohta üsna suur RAM-i tarbimine.
bukkit
Entusiastide poolt loodud serverirakendus Vanilla versiooni põhjal
Bukkiti installimine pole keeruline, vastavad juhised on ressursil
SpigotMC
Pistikprogrammide arendajate elu hõlbustamiseks oli mängumaailmaga suhtlemiseks vaja API-d. See on täpselt see probleem, mille loojad lahendasid.
Praegu arendatakse ja kasutatakse aktiivselt SpigotMC-d. See toetab kõiki Bukkiti jaoks loodud pistikprogramme, kuid ei ole sellega tagasiühilduv. DMCA eemaldamisest mööda pääsemiseks leiutati elegantne meetod nimega BuildTools. See tööriist välistab vajaduse kompileeritud rakendust levitada ja võimaldab kasutajatel kompileerida Spigoti, CraftBukkiti ja Bukkiti lähtekoodist. Kõik see muudab DMCA keelu kasutuks.
PaperMC
Kõik tundus lahe ja Spigot sai suurepäraseks võimaluseks. Kuid mõnele entusiastile sellest ei piisanud ja nad lõid oma Spigoti kahvli "steroidide peal". Peal
PaperMC-l on suurepärane ühilduvus, nii et SpigotMC jaoks kirjutatud pistikprogrammid saavad PaperMC-s hõlpsasti töötada, kuid ilma ametliku toeta. Samuti on olemas tagasiühilduvus SpigotMC-ga. Nüüd, kui oleme serveri loomise erinevad võimalused loetlenud, liigume edasi tekkida võivate jõudlusprobleemide juurde.
Probleemid ja lahendused
Peamine asi, mida peate mõistma, on see, et kõike, mis on seotud mängumaailma töötlemisega, töödeldakse ainult füüsilise serveri ühes arvutustuumal. Nii et kui teil on äkki suurepärane server, millel on kümmekond arvutustuuma, laaditakse ainult üks. Kõik teised jäävad praktiliselt jõude. See on rakenduse arhitektuur ja te ei saa sellega midagi teha. Seega tuleks serverit valides pöörata tähelepanu mitte tuumade arvule, vaid taktsagedusele. Mida kõrgem see on, seda parem on jõudlus.
RAM-i mahu küsimuses peaksime lähtuma järgmistest näitajatest:
- planeeritud mängijate arv;
- planeeritud maailmade arv serveris;
- iga maailma suurus.
Tuleb meeles pidada, et Java-rakendus vajab alati RAM-i reservi. Kui eeldate mälutarbimist 8 gigabaiti, siis tegelikult peab seda olema 12. Numbrid on suhtelised, kuid olemus ei muutu.
Serveriosa käivitamiseks soovitame kasutada artiklis märgitud lippe
Plokikaardi genereerimine
"Kas sa tõesti arvad, et kuu eksisteerib ainult siis, kui sa seda vaatad?" (Albert Einstein)
Täiesti uus server. Niipea, kui mängija esimest korda edukalt ühenduse loob, ilmub mängutegelane üldisesse kogunemispunkti (spawn). See on ainus koht, kus server on mängumaailma eelnevalt genereerinud. Samal hetkel vaatab kliendiosa seadeid ja võtmeparameetriks on joonistuskaugus. Seda mõõdetakse juppides (kaardi pindala on 16×16 ja 256 plokki kõrge) Kui palju tükke seal on märgitud, on täpselt märgitud, kui palju neid serverilt küsitakse.
Server salvestab globaalse maailmakaardi ja kui selles pole mängutegelase ilmumise hetkel veel genereeritud plokke, siis server genereerib need dünaamiliselt ja salvestab. See mitte ainult ei nõua suuri arvutusressursse, vaid suurendab pidevalt ka maailmakaardi suurust. Ühes vanimas anarhistlikus serveris
Ühe mängija ümber maailma loomine pole probleem. Sadade mängijate ümber maailma loomine põhjustab lühikeseks ajaks väiksemaid serveri aeglustusi, misjärel koormus väheneb. Maailma genereerimine kliendi renderduskaugusel umbes tuhande mängijaga on juba võimeline serveri "kukkuma" ja kõik kliendid sellest ajalõpu tõttu välja viskama.
Serveritarkvaras on selline väärtus nagu TPS (Ticks per Server – tics per second). Tavaliselt võrdub 1 taktitsükkel 50 ms. (1 sekund reaalsest maailmast võrdub 20 mängumaailma linnukesega). Kui ühe linnukese töötlemine pikeneb 60 sekundini, suletakse serverirakendus, visates kõik mängijad välja.
Lahenduseks on piirata maailm teatud koordinaatidega ja teostada esialgne plokkide genereerimine. Seega eemaldame mängu ajal dünaamilise genereerimise vajaduse ja server peab lugema ainult olemasolevat kaarti. Mõlemat probleemi saab lahendada ühe pistikprogrammiga
Lihtsaim viis on määrata maailma piir kudemispunkti suhtes ringi kujul (kuigi saate teha selle mis tahes kujuga) ühe käsuga:
/wb set <радиус в блоках> spawn
Kui mängija tegelane üritab piiri ületada, lükatakse ta mitu plokki tagasi. Kui seda tehakse mitu korda piiratud aja jooksul, teleporteeritakse kurjategija sunniviisiliselt kudemispunkti. Maailma eelgenereerimine toimub veelgi lihtsamalt, käsuga:
/wb fill
Kuna see toiming võib potentsiaalselt mõjutada mängijaid serveris, kinnitage kindlasti:
/wb confirm
Kokku kulus Intel® Xeon® Gold 5000 protsessoriga 40 ploki (~ 2 miljardit plokki) raadiusega maailma loomiseks umbes 6240 tundi. Seega, kui soovite eelgenereerida suuremat kaarti, pidage meeles, et see protsess võtab piisavalt aega ja serveri TPS väheneb tõsiselt. Samuti pidage meeles, et isegi 5000 ploki raadius nõuab umbes 2 GB kettaruumi.
Vaatamata asjaolule, et pistikprogrammi uusim versioon töötati välja Minecrafti versiooni 1.14 jaoks, leiti katseliselt, et see töötab järgmistes versioonides suurepäraselt. Saadaval on täielik käskude loend koos selgitustega
Probleemsed plokid
Minecraftis on palju erinevaid plokke. Siiski juhime lugejate tähelepanu sellisele plokile nagu TNT. Nagu nimigi ütleb, on see plokk lõhkeaine (toimetaja märkus - see on virtuaalmaailma mänguartikkel ja sellel elemendil pole midagi tõeliste lõhkeainetega). Selle eripära on selline, et aktiveerimise hetkel hakkab sellele mõjuma gravitatsioonijõud. See sunnib serverit arvutama kõik koordinaadid, kui plokk hakkab sel hetkel langema.
Kui TNT plokke on mitu, siis ühe ploki lõhkamine põhjustab naaberplokkides detonatsiooni ja gravitatsiooni aktiveerumise, hajutades neid igas suunas. Kogu see ilus mehaanika serveri poolel näeb välja nagu palju toiminguid iga ploki trajektoori arvutamiseks, aga ka suhtlemist naaberplokkidega. Ülesanne on äärmiselt ressursimahukas, mida igaüks saab hõlpsasti kontrollida. Genereeri ja detoneeri TNT-plokkidest kuubik, mille suurus on vähemalt 30x30x30. Ja kui arvasid, et sul on hea võimas mänguarvuti, siis eksid väga 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt
Sarnane "katse" serveris Intel® Xeon® Gold 6240-ga tõi kaasa tõsise TPS-i languse ja 80% protsessori koormuse kogu ploki detonatsiooniaja jooksul. Seega, kui mõni mängija seda suudab, mõjutab jõudlusprobleem kõiki serveri mängijaid.
Veelgi karmim variant - Ääre kristallid. Kui TNT plahvatab siiski järjestikku, plahvatavad Edge Crystals kõik korraga, mis teoreetiliselt võib serverirakenduse töö täielikult peatada.
Seda stsenaariumi saab vältida ainult nende plokkide kasutamise täieliku keelamisega mängumaailmas. Näiteks pistikprogrammi kasutamine
Järeldus
Mänguserveri korralik haldamine pole lihtne ülesanne. Raskused ja vähenenud jõudlus ootavad teid igal sammul, eriti kui te ei võta arvesse mängumehaanikat ennast. Kõike on võimatu ette näha, sest mängijad võivad mõnikord olla väga loomingulised, püüdes sundida serverit tegema midagi, mille jaoks see pole mõeldud. Ainult mõistlik tasakaal riskide ja kehtestatud piirangute vahel võimaldab serveril pidevalt töötada ja mitte vähendada oma jõudlust kriitiliste väärtusteni.
Karantiini ajal igatsesid mõned meie töötajad oma lemmikkontoreid ja otsustasid need Minecraftis uuesti luua. Samuti on teil võimalus tulla meile külla ilma oma tervisega riskimata või teel olles aega raiskamata.
Selleks kutsume kõiki oma serverisse minecraft.selectel.ru (kliendiversioon 1.15.2), kus taasloodi andmekeskused Tsvetotšnaja-1 ja Tsvetotšnaja-2. Ärge unustage nõustuda lisaressursside allalaadimisega, need on vajalikud mõne asukoha õigeks kuvamiseks.
Teid ootavad ülesanded, sooduskoodid, lihavõttemunad ja meeldiv suhtlus.
Allikas: www.habr.com