
În blogul nostru am discutat deja , cum să îți creezi propriul server Minecraft, însă au trecut 5 ani de atunci și multe s-au schimbat. Împărtășim cu voi metodele actualizate de creare și optimizare a serverului pentru acest joc atât de popular.
În cei 9 ani de istorie ai săi (dacă considerăm data lansării), Minecraft a câștigat o mulțime impresionantă de fani și critici, atât din rândul jucătorilor obișnuiți, cât și al geek-ilor. Conceptul simplu al lumii din cuburi s-a transformat dintr-o simplă distracție într-un mediu universal pentru comunicare și crearea diverselor obiecte din lumea reală.
Pe lângă construcție, jocul oferă și posibilitatea de a crea , care permit realizarea de algoritmi compleți în interiorul Minecraft-ului. Pe YouTube există zeci de videoclipuri impresionate, în care oamenii, investind o cantitate enormă de efort și timp, au creat o copie a unui anumit dispozitiv electronic sau au construit o copie detaliată și structuri arhitecturale. Totul este limitat doar de imaginația gamerului și de posibilitățile universului de joc.

Dar să nu discutăm mai departe despre ceea ce creează jucătorii și să ne concentrăm pe partea de server a aplicației, subliniind problemele (de multe ori foarte complexe) care pot apărea în timpul funcționării sub sarcină. Menționăm de la bun început că vom discuta doar despre ediția Java.
Tipuri de servere
Cea mai simplă variantă este serverul încorporat în clientul jocului. Ai creat o lume, ai apăsat un buton și iată că serverul devine disponibil în rețeaua locală. Această variantă nu poate suporta o sarcină serioasă, așa că nu o vom lua în considerare.
Vanilla
Compania Mojang Studios oferă partea de server a jocului ca o aplicație Java gratuită . Aceasta permite crearea unei lumi proprii și personale, făcând-o accesibilă pentru conectare din orice colț al planetei. Pentru cei care fac asta pentru prima dată, există un excelent , disponibil în Wiki-ul de joc corespunzător.
Această abordare are un dezavantaj serios, și anume lipsa posibilităților de a conecta pluginuri care să extindă funcționalitatea serverului, permițând automatizarea multor procese și optimizarea performanței. În plus, serverul oficial consumă o cantitate considerabilă de memorie RAM pentru fiecare jucător conectat.
Bukkit
Aplicația de server creată de entuziaști pe baza versiunii Vanilla a extins semnificativ posibilitățile jocului prin suportul pentru pluginuri și moduri (modificări). Aceasta a permis nu doar adăugarea de blocuri noi în gameplay, dar și realizarea de diverse manevre inaccesibile software-ului Vanilla. Ce este interesant, această aplicație necesita semnificativ mai puțină memorie.
Instalarea Bukkit nu este o sarcină dificilă, instrucțiunea corespunzătoare se află pe resursa . Dar acest lucru nu are sens, deoarece din 2014 echipa Bukkit s-a destrămat, dezvoltatorii proiectului au devenit angajați ai Mojang Studios, iar proiectul a fost abandonat. Astfel, Bukkit este practic mort și are sens să ne concentrăm asupra următoarelor două proiecte.
SpigotMC
Pentru a facilita viața dezvoltatorilor de pluginuri a existat nevoie de un API pentru interacțiunea cu lumea jocului. Aceasta a fost exact problema pe care au rezolvat-o creatorii , bazându-se pe nucleul Bukkit și reproiectându-l pentru a obține mai multă fiabilitate și performanță. Cu toate acestea, proiectul a fost blocat din cauza Legii drepturilor de autor în era digitală (), iar descărcarea surselor de acolo este imposibilă.
În prezent, SpigotMC se dezvoltă activ și este folosit. Acesta suportă toate pluginurile create pentru Bukkit, dar nu este compatibil înapoi. Pentru a trece peste interdicția DMCA Takedown, a fost inventată o soluție elegantă numită BuildTools. Acest instrument elimină necesitatea distribuției aplicației compilate și permite utilizatorilor să compileze Spigot, CraftBukkit și Bukkit din sursa originală. Toate acestea fac ca interdicția DMCA să fie inutilă.
PaperMC
S-ar părea că totul este grozav, iar Spigot a devenit o variantă excelentă. Dar unor entuziaști acest lucru li s-a părut insuficient și și-au creat propriul fork Spigot „pe steroizi”. La principala sa calitate este menționată că „Este incredibil de rapid”. Comunitatea dezvoltată permite rezolvarea rapidă a problemelor apărute, iar API-ul extins – crearea de pluginuri interesante. Poate fi pornit PaperMC cu o singură comandă simplă, prezentată în .
Compatibilitatea cu PaperMC este excelentă, astfel încât pluginurile scrise pentru SpigotMC vor funcționa ușor și pe PaperMC, dar fără suport oficial. De asemenea, există compatibilitate înapoi cu SpigotMC. Acum, când am enumerat diferitele opțiuni de creare a unui server, să trecem la problemele de performanță care pot apărea.
Probleme și soluții
Ceea ce trebuie spus este că tot ce ține de procesarea lumii de joc va fi procesat doar pe un singur nucleu de calcul al serverului fizic. Așadar, dacă aveți un server excelent cu zece nuclee de calcul, doar unul dintre acestea va fi utilizat. Toate celelalte vor rămâne practic inactive. Asta este arhitectura aplicației și nu aveți ce face în legătură cu asta. Așadar, la alegerea unui server, ar trebui să vă concentrați nu pe numărul de nuclee, ci pe frecvența de bază. Cu cât aceasta este mai mare, cu atât performanța va fi mai bună.
Când vine vorba de cantitatea de memorie RAM, ar trebui să ne bazăm pe următoarele criterii:
- numărul planificat de jucători;
- numărul planificat de lumi pe server;
- dimensiunea fiecărei lumi.
Trebuie avut în vedere că o aplicație Java are întotdeauna nevoie de un rezervor de memorie RAM. Dacă estimați un consum de 8 gigabaiți, va trebui de fapt să aveți 12. Numerele sunt aproximative, dar esența rămâne aceeași.
Pentru a porni partea serverului, recomandăm utilizarea flag-urilor indicate în articolul . Această „magie neagră” permite serverului să configureze corect „colectorul de gunoi” și optimizează utilizarea memoriei RAM. Nu ar trebui să alocați mai multă memorie decât consumă efectiv serverul în timpul încercării de vârf a jucătorilor.
Generarea hărții blocurilor
„Credeți cu adevărat că Luna există doar atunci când o priviți?” (Albert Einstein)
Serverul este complet nou. Când un jucător se conectează pentru prima dată cu succes, personajul său apare într-un punct comun de întâlnire (spawn). Acesta este singurul loc unde lumea jocului este generată anticipat de server. În acest moment, partea clientului verifică setările, iar un parametru cheie este distanța de desenare. Aceasta este măsurată în chunk-uri (o zonă de hărți de 16×16 și o înălțime de 256 de blocuri). Cu cât sunt indicate mai multe chunk-uri, atât de multe vor fi solicitate de la server.
Serverul stochează harta globală a lumii, iar dacă nu există blocuri generate în punctul de apariție al personajului, serverul le generează dinamic și le salvează. În plus, aceasta necesită resurse computaționale semnificative și crește constant dimensiunea hărții lumii. Pe unul dintre cele mai vechi servere anarhice, (2builders2tools), dimensiunea hărții a depășit deja 8 Tb, iar limita lumii se află la 30 milioane de blocuri. Acest server este legat de mii de povești și merită un articol dedicat într-o serie de articole.
Generarea lumii în jurul unui singur jucător nu este o problemă. Generarea lumii în jurul unei sute de jucători va cauza întârzieri minore ale serverului pentru o perioadă scurtă de timp, după care încărcătura va scădea. Generarea lumii pe distanța de desenare a clientului în jurul a o mie de jucători poate deja să „blocheze” serverul și să deconecteze toți clienții din cauza timeout-ului.
În software-ul serverului există o valoare cunoscută sub numele de TPS (Ticks per Server — ticuri pe secundă). În mod standard, 1 tic este echivalent cu 50 ms. (1 secundă în lumea reală este egală cu 20 de ticurilor în lumea jocului). Dacă timpul de procesare pentru un tic crește la 60 de secunde, aplicația serverului va fi închisă, deconectând toți jucătorii.
Soluția este de a restricționa lumea la coordonate specifice și de a efectua o generare anticipată a blocurilor. Astfel, eliminăm necesitatea generării dinamice în timpul jocului, iar serverului îi va fi suficient să citească deja harta existentă. Ambele probleme sunt rezolvate de un singur plugin .
Cel mai simplu mod de a defini limita lumii este sub formă de cerc în jurul punctului de spawn (deși poate fi de orice formă) cu o singură comandă:
/wb set <радиус в блоках> spawnDacă un personaj de joc încearcă să traverseze limita, va fi respins cu câteva blocuri înapoi. Dacă acest lucru se repetă de mai multe ori într-un interval scurt, infractorul va fi teleportat forțat la punctul de spawn. Pre-generarea lumii se face și mai simplu, cu comanda:
/wb fillDeoarece această acțiune poate afecta potențial jucătorii aflați pe server, nu uitați să confirmați executarea:
/wb confirmÎn total, generarea unei lumi cu un radius de 5000 de blocuri (~40 miliarde de blocuri) a durat aproximativ 2 ore pe un procesor Intel® Xeon® Gold 6240. Prin urmare, dacă doriți să lansați o pre-generare a unei hărți mai mari, țineți cont că acest proces va dura o perioadă considerabilă de timp, iar TPS-ul serverului va fi serios redus. În plus, rețineți că chiar și un radius de 5000 de blocuri va necesita aproximativ 2 GB de spațiu pe unitatea de stocare.
Deși ultima versiune a plugin-ului a fost dezvoltată pentru Minecraft versiunea 1.14, s-a constatat experimental că funcționează foarte bine și pe versiunile ulterioare. Lista completă de comenzi cu explicații este disponibilă .
Blocuri problematice
Există o mulțime de tipuri de blocuri în Minecraft. Cu toate acestea, am dori să atragem atenția cititorilor asupra unui bloc, și anume TNT. Așa cum sugerează numele, acest bloc reprezintă un explozibil (notă editorială - acest obiect este un element de joc dintr-o lume virtuală și nu are legătură cu explozibilii reali). Caracteristica sa este că în momentul activării acestuia, forța gravitației începe să acționeze asupra lui. Acest lucru determină serverul să calculeze toate coordonatele, dacă în acel moment blocul începe să cadă.
Dacă există mai multe blocuri TNT, detonarea unui bloc va provoca detonarea și activarea gravitației blocurilor adiacente, împrăștiindu-le în toate direcțiile. Toată această mecanică frumoasă pe partea serverului se prezintă ca o mulțime de operațiuni pentru a calcula traiectoria fiecărui bloc, precum și interacțiunea cu blocurile vecine. Sarcina este extrem de consumatoare de resurse, lucru pe care oricine îl poate verifica. Generați și detonați un cub de blocuri TNT de cel puțin 30x30x30. Și dacă ați crezut că aveți un computer de gaming puternic, v-ați înșelat serios 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt 
Un astfel de „experiment” pe un server cu Intel® Xeon® Gold 6240 a dus la o scădere semnificativă a TPS și o utilizare de 80% a CPU-ului pe întreaga durată a detonării blocurilor. Prin urmare, dacă cineva dintre jucători ar putea realiza un asemenea lucru, problema de performanță ar afecta toți jucătorii aflați pe server.
O variantă și mai severă — Cristalele Marginilor. Dacă TNT-ul explodează secvențial, atunci Cristalele Marginilor se detonează toate simultan, ceea ce, în teorie, ar putea chiar opri complet aplicația serverului.
Evitarea acestui scenariu este posibilă doar prin interzicerea completă a utilizării acestor blocuri în lumea jocului. De exemplu, prin intermediul pluginului . Rețineți că acest plugin, de unul singur, nu funcționează fără un alt plugin . Așadar, instalați mai întâi WorldEdit, iar apoi WorldGuard.
Concluzie
Gestionarea eficientă a unui server de jocuri este o sarcină nu tocmai ușoară. Dificultățile și scăderea performanței vor fi oconstantă la fiecare pas, mai ales dacă nu se ia în calcul însăși mecanica jocului. Este imposibil să previi totul, deoarece jucătorii pot fi foarte inventivi în încercările de a face serverul să execute lucruri pentru care nu a fost destinat. Numai un echilibru rațional între riscuri și limitările impuse va permite serverului să funcționeze în mod constant fără a-și reduce performanța la valori critice.
În carantină, unii dintre angajații noștri s-au dorit de birourile lor preferate și au decis să le recreeze în Minecraft. Aveți și voi șansa de a ne vizita, fără a vă pune sănătatea în pericol și fără a pierde timp pe drum.
Pentru aceasta, invităm pe toți doritorii pe serverul nostru minecraft.selectel.ru (versiunea clientului 1.15.2), unde au fost recreate centrele de date Floarea-1 și Floarea-2. Nu uitați să acceptați descărcarea resurselor suplimentare, acestea sunt necesare pentru o corectă afișare a unor locații.
Vă așteaptă misiuni, coduri promoționale, „surprize” și conversații plăcute.
Sursa: habr.com
