På vår blogg har vi redan
Under sin 9-åriga historia (räknat från släppdatumet) har Minecraft fått ett fantastiskt antal fans och hatare bland både vanliga spelare och nördar. Det enkla konceptet med en värld gjord av block har utvecklats från en enkel form av underhållning till ett universellt medium för att kommunicera och skapa olika objekt från den verkliga världen.
Förutom konstruktion har spelet förmågan att skapa
Men låt oss inte prata mer om exakt vad spelarna skapar, utan låt oss titta på serverdelen av applikationen och lyfta fram de problem (ibland mycket komplexa) som kan uppstå under drift under belastning. Låt oss göra en reservation direkt att vi bara kommer att prata om Java Edition.
Typer av servrar
Det enklaste alternativet är en server inbyggd i spelklienten. Vi skapade en värld, tryckte på en knapp och servern blev tillgänglig över det lokala nätverket. Detta alternativ kan inte motstå någon allvarlig belastning, och därför kommer vi inte ens att överväga det.
Vanilla
Mojang Studios distribuerar serverdelen av spelet som en Java-applikation gratis
Detta tillvägagångssätt har en allvarlig nackdel, nämligen bristen på färdiga möjligheter för att ansluta plugins som utökar serverns funktionalitet och tillåter inte bara att automatisera många processer, utan också att optimera prestanda. Dessutom har den officiella servern en ganska stor RAM-förbrukning för varje ansluten spelare.
bukkit
En serverapplikation skapad av entusiaster baserad på Vanilla-versionen
Att installera Bukkit är inte svårt; motsvarande instruktioner finns på resursen
SpigotMC
För att göra livet enklare för plugin-utvecklare fanns det ett behov av ett API för att interagera med spelvärlden. Det är just detta problem som skaparna löste.
För närvarande utvecklas och används SpigotMC aktivt. Den stöder alla plugins som skapats för Bukkit, men är inte bakåtkompatibel med den. För att komma runt DMCA Takedown uppfanns en elegant metod som heter BuildTools. Detta verktyg eliminerar behovet av att distribuera en kompilerad applikation och tillåter användare att kompilera Spigot, CraftBukkit och Bukkit från källkoden. Allt detta gör DMCA-förbudet värdelöst.
PaperMC
Allt verkade coolt och Spigot blev ett bra alternativ. Men detta räckte inte för vissa entusiaster, och de skapade sin egen gaffel av Spigot "på steroider." På
PaperMC har utmärkt kompatibilitet, så plugins skrivna för SpigotMC kan enkelt fungera på PaperMC, men utan officiellt stöd. Bakåtkompatibilitet med SpigotMC finns också. Nu när vi har listat de olika alternativen för att skapa en server, låt oss gå vidare till de prestandaproblem som kan uppstå.
Problem och lösningar
Det viktigaste du behöver förstå är att allt relaterat till bearbetning av spelvärlden endast kommer att bearbetas på en datorkärna på den fysiska servern. Så om du plötsligt har en utmärkt server med ett dussin datorkärnor, kommer bara en att laddas. Alla andra kommer att vara praktiskt taget inaktiva. Det här är applikationens arkitektur och det finns inget du kan göra åt det. Så när du väljer en server bör du vara uppmärksam inte på antalet kärnor, utan på klockfrekvensen. Ju högre den är, desto bättre blir prestandan.
När det gäller frågan om RAM-kapacitet bör vi utgå från följande indikatorer:
- planerat antal spelare;
- planerat antal världar på servern;
- storleken på varje värld.
Man bör komma ihåg att en Java-applikation alltid behöver en reserv av RAM. Om du räknar med en minnesförbrukning på 8 gigabyte så behöver du faktiskt ha 12. Siffrorna är relativa, men essensen förändras inte.
För att starta serverdelen rekommenderar vi att du använder flaggorna som anges i artikeln
Generera en blockkarta
"Tror du verkligen att månen bara existerar när du tittar på den?" (Albert Einstein)
Helt ny server. Så snart spelaren lyckas ansluta för första gången, dyker spelkaraktären upp vid den allmänna samlingspunkten (spawn). Detta är det enda stället där spelvärlden är förgenererad av servern. I samma ögonblick tittar klientdelen på inställningarna, och nyckelparametern är ritningsavståndet. Det mäts i bitar (kartområdet är 16×16 och 256 block högt) Hur många bitar som anges är exakt hur många som kommer att begäras från servern.
Servern lagrar en global karta över världen, och om det inte finns några genererade block i den ännu när spelkaraktären dyker upp, genererar servern dem dynamiskt och lagrar dem. Detta kräver inte bara stora datorresurser, utan det ökar också hela tiden storleken på världskartan. På en av de äldsta anarkistiska servrarna
Att skapa en värld runt en spelare är inget problem. Att skapa en värld runt hundratals spelare kommer att orsaka mindre servernedgångar under en kort tid, varefter belastningen kommer att minska. Att generera en värld på ett klientåtergivningsavstånd runt tusen spelare är redan kapabelt att "släppa" servern och kasta alla klienter ur den på grund av en timeout.
I servermjukvaran finns ett värde som t.ex TPS (Ticks per Server - ticks per second). Normalt är 1 klockcykel lika med 50 ms. (1 sekund av den verkliga världen är lika med 20 bockar av spelvärlden). Om bearbetningen av en bock ökar till 60 sekunder kommer serverapplikationen att stängas och alla spelare kastas ut.
Lösningen är att begränsa världen till vissa koordinater och utföra preliminär blockgenerering. Således tar vi bort behovet av dynamisk generering under spelets gång, och servern behöver bara läsa en befintlig karta. Båda problemen kan lösas med en enda plugin
Det enklaste sättet är att sätta världsgränsen i form av en cirkel i förhållande till spawn-punkten (även om du kan göra den av vilken form som helst) med ett kommando:
/wb set <радиус в блоках> spawn
Om spelarkaraktären försöker passera gränsen kommer han att tryckas tillbaka flera block. Om detta görs flera gånger inom en begränsad tid, kommer gärningsmannen att med tvång teleporteras till spawn-punkten. Förgenerering av världen görs ännu enklare, med kommandot:
/wb fill
Eftersom denna åtgärd potentiellt kan påverka spelare på servern, var noga med att bekräfta:
/wb confirm
Totalt tog det cirka 5000 timmar att generera en värld med en radie på 40 block (~2 miljarder block) på en Intel® Xeon® Gold 6240-processor. Därför, om du vill förgenerera en större karta, var medveten om att denna process kommer att ta en anständig tid och serverns TPS kommer att reduceras avsevärt. Kom också ihåg att även en radie på 5000 block kommer att kräva cirka 2 GB diskutrymme.
Trots att den senaste versionen av pluginet utvecklades för Minecraft version 1.14 fann man experimentellt att den fungerar utmärkt på efterföljande versioner. En komplett lista med kommandon med förklaringar finns tillgänglig
Problemblock
Det finns ett stort utbud av block i Minecraft. Vi vill dock uppmärksamma läsarna på ett sådant block som TNT. Som namnet antyder är detta block ett sprängämne (redaktörens anmärkning - det här är ett spelobjekt från den virtuella världen och det här föremålet har inget med riktiga sprängämnen). Dess egenhet är sådan att tyngdkraften i aktiveringsögonblicket börjar verka på den. Detta tvingar servern att beräkna alla koordinater om blocket i detta ögonblick börjar falla.
Om det finns flera TNT-block, orsakar detonationen av ett block detonation och aktivering av gravitationen i angränsande block, vilket sprider dem i alla riktningar. All denna vackra mekanik på serversidan ser ut som många operationer för att beräkna banan för varje block, såväl som interaktion med närliggande block. Uppgiften är extremt resurskrävande, vilket vem som helst enkelt kan kontrollera. Generera och detonera en kub från TNT-block som är minst 30x30x30 i storlek. Och om du trodde att du hade en bra, kraftfull speldator så hade du fel 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt
Ett liknande "experiment" på en server med Intel® Xeon® Gold 6240 ledde till ett allvarligt TPS-fall och 80 % CPU-belastning under hela blockdetonationstiden. Därför, om någon spelare kan göra detta, kommer prestandaproblemet att påverka alla spelare på servern.
Ett ännu tuffare alternativ - Kantkristaller. Om TNT trots allt exploderar sekventiellt, detonerar Edge Crystals alla samtidigt, vilket i teorin helt kan stoppa driften av serverapplikationen.
Detta scenario kan bara undvikas genom att helt förbjuda användningen av dessa block i spelvärlden. Till exempel genom att använda plugin
Slutsats
Att hantera en spelserver på rätt sätt är ingen lätt uppgift. Svårigheter och minskad prestanda kommer att vänta dig vid varje tur, speciellt om du inte tar hänsyn till själva spelmekaniken. Det är omöjligt att förutse allt eftersom spelare ibland kan vara väldigt kreativa när de försöker tvinga servern att göra något som det inte var avsett för. Endast en rimlig balans mellan risker och etablerade restriktioner kommer att tillåta servern att fungera kontinuerligt och inte minska dess prestanda till kritiska värden.
Under karantänen missade några av våra anställda sina favoritkontor och bestämde sig för att återskapa dem i Minecraft. Du har också en chans att komma och besöka oss utan att riskera din hälsa eller slösa tid på vägen.
För att göra detta bjuder vi in alla till vår server minecraft.selectel.ru (klientversion 1.15.2), där datacenterna Tsvetochnaya-1 och Tsvetochnaya-2 återskapades. Glöm inte att gå med på att ladda ner ytterligare resurser, de är nödvändiga för korrekt visning av vissa platser.
Uppdrag, kampanjkoder, påskägg och trevlig kommunikation väntar på dig.
Källa: will.com