
Blogunkban már írtunk arról, , hogyan készítheted el a saját Minecraft szerveredet, de azóta eltelt 5 év, és sok minden megváltozott. Megosztjuk veletek a legfrissebb módszereket a népszerű játék szerveroldalának létrehozására és optimalizálására.
Kilenc éves története alatt (ha a megjelenés dátumát nézzük) a Minecraft lenyűgöző számú rajongót és ellenzőt szerzett a hagyományos játékosok és a geekek között egyaránt. Az egyszerű kockavilág koncepciója egy szórakozásból sokoldalú kommunikációs és valós világbeli tárgyak létrehozására alkalmas környezetté alakult.
Az építkezés mellett a játékban lehetőség van létrehozására is, amelyek lehetővé teszik, hogy teljes algoritmusokat valósítsunk meg a Minecrafton belül. A YouTube-on rengeteg lenyűgöző videó található, ahol emberek rengeteg energiát fektettek és időt töltöttek el, hogy létrehozzanak egy-egy elektronikai eszköz másolatát vagy részletes másolatát építsenek és építészeti alkotásoknak. Minden a játékos fantáziáján és a játékvilág lehetőségein múlik.

De ne beszéljünk tovább arról, hogy mit hoznak létre a játékosok, inkább nézzük meg az alkalmazás szerveroldalát, és világítsuk meg azokat a problémákat (amelyek néha nagyon bonyolultak), amelyek a terhelés alatt felmerülhetnek. Azonnal jegyezzük meg, hogy csak a Java Edition-ről lesz szó.
Szerver típusok
A legegyszerűbb megoldás a játék kliensébe épített szerver. Létrehoztunk egy világot, megnyomtunk egy gombot, és a szerver elérhetővé vált a helyi hálózaton. Ez a megoldás komoly terhelést nem bír el, ezért ezt nem is fogjuk részletesen tárgyalni.
Vanilla
A Mojang Studios ingyenesen terjeszti a játék szerveroldalát Java-alkalmazás formájában. Ez lehetővé teszi, hogy saját és személyre szabott világot hozz létre, amely bárhonnan elérhető a világ bármely pontjáról. Azok számára, akik először teszik ezt, van egy kiváló , amely elérhető a megfelelő játéknál található Wiki-ban.
Ennek a megközelítésnek van egy komoly hátránya, nevezetesen a "dobozból ki" pluginok csatlakoztatásának hiánya, amelyek bővítik a szerver funkcionalitását, lehetővé téve nemcsak sok folyamat automatizálását, hanem a teljesítmény optimalizálását is. Ezenkívül a hivatalos szerver viszonylag nagy memóriát igényel minden csatlakozott játékos után.
Bukkit
A Vanilla verzióra épített, lelkesek által létrehozott szerveralkalmazás jelentősen bővítette a játék lehetőségeit a pluginok és modok (módosítások) támogatásával. Lehetővé tette nemcsak új blokkok hozzáadását a játékmenethez, hanem különböző manipulációk végrehajtását is, amelyek nem voltak elérhetők a vanilla szoftvernél. Érdekes módon, ennek az alkalmazásnak lényegesen kevesebb memóriára volt szüksége.
A Bukkit telepítése nem bonyolult, a megfelelő útmutató megtalálható az oldalon . De ennek nincs értelme, mivel 2014 óta a Bukkit csapata szétesett, a projekt fejlesztői a Mojang Studios munkatársai lettek, és elhagyatott. Így a Bukkit gyakorlatilag halott, és érdemes a következő két projektre figyelni.
SpigotMC
A plugin fejlesztők élete megkönnyítése érdekében szükség volt egy API-ra, amely lehetővé teszi a kölcsönhatást a játékkörnyezetben. Ezt a feladatot oldotta meg a , amely a Bukkit magjára épült, és átformálta azt a megbízhatóság és teljesítmény javítása érdekében. Ennek ellenére, a projektet blokkolták a Digitális Éra Szellemi Tulajdonának Törvényével kapcsolatban (), és az alapforrást letölteni nem lehet.
Jelenleg a SpigotMC aktívan fejlődik és használatos. Támogat minden olyan plugint, amely a Bukkitra készült, azonban visszafelé nem kompatibilis. A DMCA Takedown tilalom kikerülésére egy elegáns megoldást dolgoztak ki, amelyet BuildTools-nak hívnak. Ez az eszköz megszünteti a fordított alkalmazások terjesztésének szükségességét, és lehetővé teszi a felhasználók számára, hogy a Spigot, CraftBukkit és Bukkit forrást kód alapján fordítsák le. Mindez a DMCA tilalmat haszontalanná teszi.
PaperMC
Úgy tűnhet, hogy minden rendben van, és a Spigot nagyszerű választás lett. De néhány lelkes fejlesztő úgy vélte, hogy ez túl kevés, és elkészítette a saját, "szteroidokkal megtolt" Spigot fork-ot. A a kulcsfontosságú előny az, hogy "Stupidul gyors". A fejlett lehetővé teszi a felmerülő problémák gyors megoldását, az kiterjesztett API pedig érdekes pluginek készítését. A PaperMC elindítása egyetlen egyszerű parancs segítségével lehetséges, amely a .
PaperMC teljes kompatibilitásban van, így a SpigotMC-re írt pluginek könnyen működni fognak a PaperMC-n is, de hivatalos támogatás nélkül. Visszafelé kompatibilitás a SpigotMC-vel szintén biztosított. Most, hogy felsoroltuk a szerver létrehozásának különböző lehetőségeit, áttérhetünk a teljesítménybeli problémákra, amelyek felmerülhetnek.
Problémák és megoldások
A legfontosabb, amit meg kell értenie, hogy minden, ami a játék világának feldolgozásával kapcsolatos, csak egy fizikai szerver számítási magán fog feldolgozásra kerülni. Tehát, ha van egy nagyszerű szervere tucatnyi számítási maggal, akkor csak az egyik lesz terhelve. Az összes többi gyakorlatilag tétlen marad. Ez az alkalmazás architektúrája, és nem tudsz ezzel mit tenni. Tehát a szerver kiválasztásakor nem a magok számát kell figyelembe venni, hanem a óra frekvenciáját. Minél magasabb ez, annál jobb lesz a teljesítmény.
A memóriakapacitást illetően a következő mutatókra kell alapozni:
- a tervezett játékosok száma;
- a tervezett világok száma a szerveren;
- minden világ mérete.
Ne feledje, hogy a Java-alkalmazások mindig igényelnek egy kis tartalékot a memóriából. Ha 8 gigabájt memória fogyasztásra számít, akkor valójában 12-t kell rendelkezésre bocsátania. Ezek a számok feltételesek, de a lényeg nem változik.
A szerveroldali rész elindításához javasoljuk a cikkben megadott jelzők használatát, . Ez a "fekete mágia" lehetővé teszi a szerver számára, hogy helyesen beállítsa a "szemétgyűjtőt", és optimalizálja a memória használatát. Nem érdemes több memóriát allokálni, mint amit a szerver ténylegesen fogyaszt a játékosok csúcsidőszakában.
Tömbgenerálás
„Valóban azt hiszi, hogy a Hold csak akkor létezik, amikor ránéz?” (Albert Einstein)
Teljesen új szerver. Amint a játékos először sikeresen csatlakozik, a játék karaktere megjelenik egy közös gyűjtőponton (spawn). Ez az egyetlen hely, ahol a játék világát a szerver előre generálja. Ebben a pillanatban az ügyfélszoftver megnézi a beállításokat, és a kulcsfontosságú paraméter a látótávolság. Ezt chunkokban mérjük (a térkép területe 16×16 és 256 blokk magasságú). Annyi chunkot kérdez le a szerver, amennyi meg van adva.
A szerveren tárolva van a globális világ térképe, és ha a karakter megjelenési pontján még nincsenek generált blokkok, akkor a szerver dinamikusan generálja őket és elmenti. Nemcsak, hogy sok számítási erőforrást igényel, hanem folyamatosan növeli a világ térkép méretét is. Az egyik legöregebb anarchikus szerveren, (2builders2tools) a térkép mérete már meghaladta a 8 Tb-ot, és a világ határa a 30 millió blokk pontján halad. Ehhez a szerverhez ezrek története kapcsolódik, és megérdemel egy külön szakcikket a cikkek sorozatában.
A világ generálására egy játékos körül nem probléma. Száz játékos körüli világ generálása rövid ideig kisebb lagot okozhat a szerveren, de ezt követően a terhelés csökken. Az ügyfél látótávolsága körüli világ generálása ezernyi játékos körül már képes "lerombolni" a szervert, és minden ügyfelet időtúllépés miatt kidobni.
A szerver szoftverében van egy érték, mint például TPS (Ticks per Server – másodpercenkénti ciklusok). Alapértelmezés szerint 1 ciklus 50 ms-nak felel meg. (1 másodperc az igazi világban 20 ciklusnak felel meg a játék világában). Ha egy ciklus feldolgozása 60 másodpercre nő, a szerveralkalmazás le fog állni, kidobva minden játékost.
A megoldás – a világ korlátozása meghatározott koordinátákra és a blokkok előzetes generálása. Így eltávolítjuk a játék közbeni dinamikus generálás szükségességét, és a szervernek elegendő csak a már létező térképet olvasnia. Mindkét kérdést egyetlen plugin megoldja, .
A világ határának legegyszerűbb beállítása egy körként a spawn pontjának figyelembevételével (bár bármilyen forma létezhet) egyetlen parancs segítségével:
/wb set <радиус в блоках> spawnHa a játék karakter megpróbálja átlépni a határt, akkor több blokknyira visszaugrik. Ha ezt többször megteszi korlátozott időn belül, a jogsértőt kényszerítve teleportálják a spawn pontra. A világ előzetes generálása még egyszerűbb, a következő parancs segítségével:
/wb fillMivel ez a művelet potenciálisan érintheti a szerveren lévő játékosokat, ne felejtsd el megerősíteni a végrehajtását:
/wb confirmÖsszesen körülbelül 2 órát vett igénybe, hogy egy 5000 blokknyi sugárral rendelkező világot generáljunk az Intel® Xeon® Gold 6240 processzoron. Ezért ha nagyobb térkép előgenerálást tervezel, vedd figyelembe, hogy ez a folyamat jelentős időt igényel majd, és a szerver TPS-e komolyan csökkenni fog. Ezen kívül ne feledd, hogy még az 5000 blokknyi sugár is körülbelül 2 GB helyet igényel a tárolón.
Bár a plugin legfrissebb verzióját a Minecraft 1.14-es verziójához fejlesztették, tapasztalataink szerint a későbbi verziókon is jól működik. A parancsok teljes listája magyarázatokkal elérhető .
Problémás blokkok
A Minecraftban számos blokktípus létezik. Azonban szeretnénk felhívni a figyelmet egy blokktípusra, mégpedig a TNT-re.Ahogy a neve is sugallja, ez a blokk robbanóanyag. (szerkesztői megjegyzés – ez a virtuális világban található játékbeli tárgy, és semmi köze a valódi robbanóanyagokhoz).A jellemzője az, hogy aktiválásakor a gravitációs erő hatni kezd rá. Ez arra kényszeríti a szervert, hogy kiszámolja az összes koordinátát, amikor a blokk leesik.
Ha több TNT blokk is van, az egyik blokk detonációja a szomszédos blokkok detonációját és a gravitáció aktiválását okozza, szétszórva őket minden irányba. Ez a gyönyörű mechanika a szerver oldalán számos műveletként jelenik meg, amelyek mindegyike a blokkok pályájának kiszámításával és a szomszédos blokkokkal való interakcióval foglalkozik. Rendkívül erőforrás-igényes feladat, amit bárki könnyen ellenőrizhet. Generálj és robbants fel egy legalább 30x30x30 méretű TNT blokkhalmazt, és ha azt hitted, hogy egy jó erős játékszámítógéped van, nagyon tévedtél 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt 
Egy hasonló „kísérlet” egy Intel® Xeon® Gold 6240-as szerveren súlyos TPS-csökkenést és 80%-os CPU-terhelést okozott a blokkdetonáció ideje alatt. Ezért, ha bárki a játékosok közül képes lenne hasonlót végrehajtani, a teljesítményprobléma minden szerveren lévő játékost érintene.
Még szigorúbb változat — A Vég Krystaljei. Ha a TNT mégis egymás után robban, akkor a Vég Krystaljai egyszerre detonálnak, ami elméletben akár meg is állíthatja a szerveralkalmazás működését.
Ezt a forgatókönyvet csak úgy lehet elkerülni, ha teljesen megtiltjuk ezeknek a blokkoknak a használatát a játék világában. Például egy plugin segítségével, . Ne felejtsük el, hogy maga a plugin nem működik másik plugin nélkül, . Tehát először telepítsd a WorldEdit-et, majd a WorldGuard-ot.
Zárás
A játék szerverének helyes kezelése nem egyszerű feladat. Nehézségek és teljesítménycsökkenés minden lépésnél várható, különösen, ha figyelmen kívül hagyjuk a játékmechanikát magát. Minden lehetséges variációt előre megtervezni lehetetlen, hiszen a játékosok néha nagyon ötletesek abban, hogy megpróbálják rákényszeríteni a szervert arra, amire nem volt tervezve. Csak a kockázatok és a felállított korlátok közötti ésszerű egyensúly lehetővé teszi a szerver folyamatos működését és a teljesítmény kritikus szintre csökkenésének elkerülését.
A karantén alatt néhány munkatársunk vágyakozott a kedvenc irodáikra, és úgy döntöttek, hogy reprodukálják azokat a Minecraftban. Önnek is lehetősége van ellátogatni hozzánk, anélkül, hogy kockáztatná az egészségét vagy időt vesztegetne az útra.
Ehhez minden érdeklődőt meghívunk a szerverünkre, minecraft.selectel.ru (klient verzió 1.15.2), ahol a Színes 1 és Színes 2 adatközpontokat reprodukáltuk. Ne felejtse el jóváhagyni a további források letöltését, szükségesek bizonyos helyszínek helyes megjelenítéséhez.
Önre küldetések, promóciós kódok, „tojáskeresések” és kellemes beszélgetés vár.
Forrás: habr.com
