Sul nostro blog lo abbiamo già
Nel corso dei suoi 9 anni di storia (a partire dalla data di uscita), Minecraft ha guadagnato un numero incredibile di fan e odiatori sia tra i giocatori comuni che tra i geek. Il semplice concetto di un mondo fatto di blocchi si è evoluto da una semplice forma di intrattenimento a un mezzo universale per comunicare e creare vari oggetti dal mondo reale.
Oltre alla costruzione, il gioco ha la capacità di creare
Ma non parliamo ulteriormente di cosa creano esattamente i giocatori, ma diamo un'occhiata alla parte server dell'applicazione ed evidenziamo i problemi (a volte molto complessi) che possono sorgere durante il funzionamento sotto carico. Facciamo subito una prenotazione che parleremo solo della Java Edition.
Tipi di server
L'opzione più semplice è un server integrato nel client di gioco. Abbiamo creato un mondo, abbiamo premuto un pulsante e il server è diventato accessibile tramite la rete locale. Questa opzione non può sopportare alcun carico serio e quindi non la prenderemo nemmeno in considerazione.
Vaniglia
Mojang Studios distribuisce gratuitamente la parte server del gioco come applicazione Java
Questo approccio presenta un grave inconveniente, vale a dire la mancanza di funzionalità pronte all'uso per connettere plug-in che espandono le funzionalità del server e consentono non solo di automatizzare molti processi, ma anche di ottimizzare le prestazioni. Inoltre, il server ufficiale ha un consumo di RAM abbastanza elevato per ogni giocatore connesso.
bukkit
Un'applicazione server creata da appassionati basata sulla versione Vanilla
Installare Bukkit non è difficile, le istruzioni corrispondenti si trovano sulla risorsa
SpigotMC
Per rendere la vita più semplice agli sviluppatori di plugin, era necessaria un'API per interagire con il mondo del gioco. Questo è esattamente il problema che i creatori hanno risolto.
Attualmente, SpigotMC è sviluppato e utilizzato attivamente. Supporta tutti i plugin creati per Bukkit, ma non è retrocompatibile con esso. Per aggirare il DMCA Takedown, è stato inventato un metodo elegante chiamato BuildTools. Questo strumento elimina la necessità di distribuire un'applicazione compilata e consente agli utenti di compilare Spigot, CraftBukkit e Bukkit dal codice sorgente. Tutto ciò rende inutile il divieto del DMCA.
PaperMC
Tutto sembrava interessante e Spigot è diventata un'ottima opzione. Ma ad alcuni appassionati questo non è bastato e hanno creato il proprio fork di Spigot “con steroidi”. SU
PaperMC ha un'eccellente compatibilità, quindi i plugin scritti per SpigotMC possono funzionare facilmente su PaperMC, ma senza supporto ufficiale. È presente anche la retrocompatibilità con SpigotMC. Ora che abbiamo elencato le varie opzioni per creare un server, passiamo ai problemi di prestazioni che potrebbero sorgere.
Problemi e soluzioni
La cosa principale che devi capire è che tutto ciò che riguarda l'elaborazione del mondo di gioco verrà elaborato solo su un core di calcolo del server fisico. Quindi, se all'improvviso hai un server eccellente con una dozzina di core di calcolo, ne verrà caricato solo uno. Tutti gli altri saranno praticamente inattivi. Questa è l'architettura dell'applicazione e non puoi fare nulla al riguardo. Pertanto, quando si sceglie un server, è necessario prestare attenzione non al numero di core, ma alla frequenza dell'orologio. Più è alto, migliori saranno le prestazioni.
Per quanto riguarda la questione della capacità della RAM, dovremmo procedere dai seguenti indicatori:
- numero previsto di giocatori;
- numero pianificato di mondi sul server;
- la dimensione di ciascun mondo.
Va ricordato che un'applicazione Java necessita sempre di una riserva di RAM. Se ti aspetti un consumo di memoria di 8 gigabyte, in realtà devi averne 12. I numeri sono relativi, ma l'essenza non cambia.
Per avviare la parte server si consiglia di utilizzare i flag specificati nell'articolo
Generazione di una mappa di blocchi
"Pensi davvero che la luna esista solo quando la guardi?" (Albert Einstein)
Server completamente nuovo. Non appena il giocatore si connette con successo per la prima volta, il personaggio del gioco appare nel punto di ritrovo generale (spawn). Questo è l'unico posto in cui il mondo di gioco è pregenerato dal server. Nello stesso momento, la parte client esamina le impostazioni e il parametro chiave è la distanza di disegno. Viene misurato in blocchi (l'area della mappa è 16×16 e alta 256 blocchi).Quanti blocchi sono indicati lì indica esattamente quanti ne verranno richiesti al server.
Il server memorizza una mappa globale del mondo e, se non sono ancora presenti blocchi generati al momento dell'apparizione del personaggio del gioco, il server li genera dinamicamente e li memorizza. Ciò non solo richiede grandi risorse di calcolo, ma aumenta anche costantemente le dimensioni della mappa del mondo. Su uno dei server anarchici più antichi
Generare un mondo attorno a un giocatore non è un problema. La generazione di un mondo attorno a centinaia di giocatori causerà lievi rallentamenti del server per un breve periodo, dopodiché il carico diminuirà. Generare un mondo a una distanza di rendering del client di circa mille giocatori è già in grado di "lasciare cadere" il server e buttarne fuori tutti i client a causa di un timeout.
Nel software del server è presente un valore come TPS (Tick per server - tick al secondo). Normalmente 1 ciclo di clock equivale a 50 ms. (1 secondo del mondo reale equivale a 20 tick del mondo di gioco). Se l'elaborazione di un tick aumenta a 60 secondi, l'applicazione del server verrà chiusa, espellendo tutti i giocatori.
La soluzione è limitare il mondo a determinate coordinate ed eseguire la generazione preliminare dei blocchi. Pertanto, eliminiamo la necessità di generazione dinamica durante il gioco e il server dovrà solo leggere una mappa esistente. Entrambi i problemi possono essere risolti con un unico plugin
Il modo più semplice è impostare il confine del mondo sotto forma di cerchio rispetto al punto di spawn (anche se puoi renderlo di qualsiasi forma) con un comando:
/wb set <радиус в блоках> spawn
Se il personaggio del giocatore tenta di attraversare il confine, verrà respinto di diversi blocchi. Se ciò viene fatto più volte entro un tempo limitato, l'autore del reato verrà teletrasportato con la forza al punto di spawn. La pregenerazione del mondo viene eseguita in modo ancora più semplice, con il comando:
/wb fill
Poiché questa azione potrebbe potenzialmente influenzare i giocatori sul server, assicurati di confermare:
/wb confirm
In totale, sono state necessarie circa 5000 ore per generare un mondo con un raggio di 40 blocchi (~2 miliardi di blocchi) su un processore Intel® Xeon® Gold 6240. Pertanto, se desideri pregenerare una mappa più grande, tieni presente che questo processo richiederà una discreta quantità di tempo e il TPS del server sarà notevolmente ridotto. Inoltre, ricorda che anche un raggio di 5000 blocchi richiederà circa 2 GB di spazio su disco.
Nonostante il fatto che l'ultima versione del plugin sia stata sviluppata per Minecraft versione 1.14, è stato sperimentalmente riscontrato che funziona perfettamente sulle versioni successive. È disponibile un elenco completo dei comandi con relative spiegazioni
Blocchi problematici
Esiste una grande varietà di blocchi in Minecraft. Tuttavia, vorremmo attirare l'attenzione dei lettori su un blocco come TNT. Come suggerisce il nome, questo blocco è esplosivo (nota dell'editore: questo è un oggetto di gioco del mondo virtuale e non ha nulla a che fare con esplosivi reali). La sua particolarità è tale che nel momento dell'attivazione la forza di gravità comincia ad agire su di esso. Ciò costringe il server a calcolare tutte le coordinate se in questo momento il blocco inizia a cadere.
Se sono presenti più blocchi di TNT, la detonazione di un blocco provoca la detonazione e l'attivazione della gravità nei blocchi vicini, disperdendoli in tutte le direzioni. Tutta questa bellissima meccanica sul lato server sembra una serie di operazioni per calcolare la traiettoria di ciascun blocco, nonché l'interazione con i blocchi vicini. Il compito è estremamente dispendioso in termini di risorse, che chiunque può facilmente verificare. Genera e fai esplodere un cubo da blocchi TNT di dimensioni almeno 30x30x30. E se pensavi di avere un computer da gioco buono e potente, ti sbagliavi di grosso 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt
Un "esperimento" simile su un server con Intel® Xeon® Gold 6240 ha portato ad un grave calo del TPS e ad un carico della CPU dell'80% durante l'intero tempo di detonazione del blocco. Pertanto, se un giocatore è in grado di farlo, il problema di prestazioni interesserà tutti i giocatori sul server.
Un'opzione ancora più difficile - Cristalli di bordo. Se il TNT esplode comunque in sequenza, gli Edge Crystals esplodono tutti contemporaneamente, il che in teoria può interrompere completamente il funzionamento dell'applicazione server.
Questo scenario può essere evitato solo vietando completamente l'uso di questi blocchi nel mondo di gioco. Ad esempio, utilizzando il plugin
conclusione
Gestire correttamente un server di gioco non è un compito facile. Difficoltà e prestazioni ridotte ti aspetteranno ad ogni turno, soprattutto se non prendi in considerazione le meccaniche di gioco stesse. È impossibile prevedere tutto, perché a volte i giocatori possono essere molto creativi nel cercare di costringere il server a fare qualcosa per cui non era previsto. Solo un ragionevole equilibrio tra rischi e restrizioni stabilite consentirà al server di funzionare continuamente e di non ridurre le sue prestazioni a valori critici.
Durante la quarantena, ad alcuni dei nostri dipendenti sono mancati i loro uffici preferiti e hanno deciso di ricrearli all'interno di Minecraft. Hai anche la possibilità di venire a trovarci senza rischiare la salute o perdere tempo per strada.
Per fare ciò, invitiamo tutti al nostro server minecraft.selectel.ru (versione client 1.15.2), dove sono stati ricreati i data center Tsvetochnaya-1 e Tsvetochnaya-2. Non dimenticare di accettare di scaricare risorse aggiuntive, necessarie per la corretta visualizzazione di alcune località.
Ti aspettano missioni, codici promozionali, uova di Pasqua e piacevoli comunicazioni.
Fonte: habr.com