På vores blog har vi allerede
I løbet af sin 9-årige historie (regnet fra udgivelsesdatoen) har Minecraft tjent et utroligt antal fans og hadere blandt både almindelige spillere og nørder. Det enkle koncept med en verden lavet af blokke har udviklet sig fra en simpel form for underholdning til et universelt medium til at kommunikere og skabe forskellige objekter fra den virkelige verden.
Udover konstruktion har spillet evnen til at skabe
Men lad os ikke tale yderligere om, hvad spillerne præcist skaber, men lad os se på serverdelen af applikationen og fremhæve de problemer (nogle gange meget komplekse), der kan opstå under drift under belastning. Lad os tage en reservation med det samme, at vi kun vil tale om Java Edition.
Typer af servere
Den enkleste mulighed er en server indbygget i spilklienten. Vi skabte en verden, trykkede på én knap, og serveren blev tilgængelig over det lokale netværk. Denne mulighed kan ikke modstå nogen alvorlig belastning, og derfor vil vi ikke engang overveje det.
Vanilje
Mojang Studios distribuerer serverdelen af spillet som en Java-applikation gratis
Denne tilgang har en alvorlig ulempe, nemlig manglen på out-of-the-box-kapaciteter til at forbinde plugins, der udvider serverens funktionalitet og tillader ikke kun at automatisere mange processer, men også at optimere ydeevnen. Derudover har den officielle server et ret stort RAM-forbrug for hver tilsluttet afspiller.
bukkit
En serverapplikation skabt af entusiaster baseret på Vanilla-versionen
Det er ikke svært at installere Bukkit; de tilsvarende instruktioner er på ressourcen
SpigotMC
For at gøre livet lettere for plugin-udviklere var der behov for en API til at interagere med spilverdenen. Det er præcis det problem, skaberne løste.
I øjeblikket udvikles og bruges SpigotMC aktivt. Det understøtter alle plugins oprettet til Bukkit, men er ikke bagudkompatibelt med det. For at komme uden om DMCA Takedown blev en elegant metode kaldet BuildTools opfundet. Dette værktøj eliminerer behovet for at distribuere en kompileret applikation og giver brugerne mulighed for at kompilere Spigot, CraftBukkit og Bukkit fra kildekoden. Alt dette gør DMCA-forbuddet ubrugeligt.
PaperMC
Alt virkede fedt, og Spigot blev en god mulighed. Men dette var ikke nok for nogle entusiaster, og de skabte deres egen gaffel af Spigot "på steroider." På
PaperMC har fremragende kompatibilitet, så plugins skrevet til SpigotMC kan nemt fungere på PaperMC, men uden officiel support. Bagudkompatibilitet med SpigotMC er også til stede. Nu hvor vi har listet de forskellige muligheder for at oprette en server, lad os gå videre til de præstationsproblemer, der kan opstå.
Problemer og løsninger
Det vigtigste, du skal forstå, er, at alt relateret til behandling af spilverdenen kun vil blive behandlet på én computerkerne på den fysiske server. Så hvis du pludselig har en fremragende server med et dusin computerkerner, så vil kun én blive indlæst. Alle andre vil være praktisk talt ledige. Dette er applikationens arkitektur, og du kan ikke gøre noget ved det. Så når du vælger en server, skal du ikke være opmærksom på antallet af kerner, men på clockfrekvensen. Jo højere den er, jo bedre bliver ydeevnen.
Med hensyn til spørgsmålet om RAM-kapacitet bør vi gå ud fra følgende indikatorer:
- planlagt antal spillere;
- planlagt antal verdener på serveren;
- størrelsen af hver verden.
Det skal huskes, at en Java-applikation altid har brug for en reserve af RAM. Hvis du forventer et hukommelsesforbrug på 8 gigabyte, så skal du faktisk have 12. Tallene er relative, men essensen ændrer sig ikke.
For at starte serverdelen anbefaler vi at bruge de flag, der er angivet i artiklen
Generering af et blokkort
"Tror du virkelig, at månen kun eksisterer, når du ser på den?" (Albert Einstein)
Helt ny server. Så snart spilleren har oprettet forbindelse for første gang, dukker spilkarakteren op ved det generelle samlingspunkt (spawn). Dette er det eneste sted, hvor spilverdenen er prægenereret af serveren. I samme øjeblik ser klientdelen på indstillingerne, og nøgleparameteren er tegneafstanden. Det måles i bidder (kortområdet er 16×16 og 256 blokke højt) Hvor mange bidder der er angivet, er nøjagtigt hvor mange der vil blive anmodet om fra serveren.
Serveren gemmer et globalt kort over verden, og hvis der endnu ikke er genererede blokke i det på det tidspunkt, hvor spilkarakteren dukker op, genererer serveren dem dynamisk og gemmer dem. Dette kræver ikke kun store computerressourcer, men det øger også konstant størrelsen af verdenskortet. På en af de ældste anarkistiske servere
At skabe en verden omkring én spiller er ikke et problem. Generering af en verden omkring hundredvis af spillere vil forårsage mindre server-opbremsninger i kort tid, hvorefter belastningen vil falde. At generere en verden på klientgengivelsesafstand omkring tusind spillere er allerede i stand til at "droppe" serveren og smide alle klienter ud af den på grund af en timeout.
I serversoftwaren er der en værdi som f.eks TPS (Ticks per Server - ticks per second). Normalt er 1 urcyklus lig med 50 ms. (1 sekund af den virkelige verden er lig med 20 krydser af spilverdenen). Hvis behandlingen af et flueben stiger til 60 sekunder, lukkes serverapplikationen og smider alle spillere ud.
Løsningen er at begrænse verden til bestemte koordinater og udføre foreløbig blokgenerering. Dermed fjerner vi behovet for dynamisk generering under spillet, og serveren skal kun læse et eksisterende kort. Begge problemer kan løses med et enkelt plugin
Den nemmeste måde er at sætte verdensgrænsen i form af en cirkel i forhold til spawn-punktet (selvom du kan gøre det af enhver form) med én kommando:
/wb set <радиус в блоках> spawn
Hvis spillerens karakter forsøger at krydse grænsen, vil han blive skubbet flere blokke tilbage. Hvis dette gøres flere gange inden for en begrænset tid, vil gerningsmanden blive tvunget teleporteret til spawn-punktet. Forgenerering af verden gøres endnu enklere med kommandoen:
/wb fill
Da denne handling potentielt kan påvirke spillere på serveren, skal du sørge for at bekræfte:
/wb confirm
I alt tog det cirka 5000 timer at generere en verden med en radius på 40 blokke (~2 milliarder blokke) på en Intel® Xeon® Gold 6240-processor. Hvis du derfor vil prægenerere et større kort, skal du være opmærksom på, at denne proces vil tage en anstændig mængde tid, og serverens TPS vil blive alvorligt reduceret. Husk også, at selv en radius på 5000 blokke vil kræve cirka 2 GB diskplads.
På trods af at den seneste version af pluginet blev udviklet til Minecraft version 1.14, blev det eksperimentelt fundet ud af, at det fungerer fantastisk på efterfølgende versioner. En komplet liste over kommandoer med forklaringer er tilgængelig
Problemblokke
Der er et stort udvalg af blokke i Minecraft. Vi vil dog gerne henlede læsernes opmærksomhed på sådan en blok som TNT. Som navnet antyder, er denne blok et sprængstof (redaktørens bemærkning - dette er et spilelement fra den virtuelle verden, og dette element har intet med rigtige sprængstoffer). Dens ejendommelighed er sådan, at tyngdekraften i aktiveringsøjeblikket begynder at virke på den. Dette tvinger serveren til at beregne alle koordinater, hvis blokken i dette øjeblik begynder at falde.
Hvis der er flere TNT-blokke, forårsager detonationen af en blok detonation og aktivering af tyngdekraften i naboblokke, hvilket spreder dem i alle retninger. Al denne smukke mekanik på serversiden ligner en masse operationer for at beregne banen for hver blok, samt interaktion med naboblokke. Opgaven er ekstremt ressourcekrævende, hvilket enhver let kan tjekke. Generer og detoner en terning fra TNT-blokke, der er mindst 30x30x30 i størrelse. Og hvis du troede, at du havde en god, kraftfuld gaming-computer, tog du meget fejl 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt
Et lignende "eksperiment" på en server med Intel® Xeon® Gold 6240 førte til et alvorligt TPS-fald og 80 % CPU-belastning under hele blokdetonationstiden. Derfor, hvis en spiller er i stand til at gøre dette, så vil præstationsproblemet påvirke alle spillere på serveren.
En endnu sværere mulighed - Kantkrystaller. Hvis TNT alligevel eksploderer sekventielt, så detonerer Edge Crystals alle på samme tid, hvilket i teorien fuldstændig kan stoppe driften af serverapplikationen.
Dette scenarie kan kun undgås ved fuldstændigt at forbyde brugen af disse blokke i spilverdenen. For eksempel ved hjælp af plugin
Konklusion
Korrekt styring af en spilserver er ikke en nem opgave. Vanskeligheder og nedsat ydeevne vil vente på dig ved hver tur, især hvis du ikke tager selve gameplaymekanikken i betragtning. Det er umuligt at forudse alt, fordi spillere nogle gange kan være meget kreative i forsøget på at tvinge serveren til at gøre noget, som det ikke var beregnet til. Kun en rimelig balance mellem risici og etablerede restriktioner vil tillade serveren at fungere kontinuerligt og ikke reducere dens ydeevne til kritiske værdier.
Under karantæne savnede nogle af vores medarbejdere deres yndlingskontorer og besluttede at genskabe dem i Minecraft. Du har også en chance for at komme og besøge os uden at risikere dit helbred eller spilde tid på vejen.
For at gøre dette inviterer vi alle til vores server minecraft.selectel.ru (klientversion 1.15.2), hvor datacentrene Tsvetochnaya-1 og Tsvetochnaya-2 blev genskabt. Glem ikke at acceptere at downloade yderligere ressourcer, de er nødvendige for den korrekte visning af nogle steder.
Quests, kampagnekoder, påskeæg og behagelig kommunikation venter på dig.
Kilde: www.habr.com