Come strutturare un semplice server di gioco per una partita multiplayer?


9

Vorrei creare un semplice server di gioco multiplayer per un semplice gioco:

Il gioco dovrebbe essere simile a Command & Conquer, hai alcuni carri armati e alcuni soldati. Puoi selezionare un soldato e fare clic sulla mappa, dove dovrebbe andare il soldato. Se il soldato arriva in una zona dove non poteva andare, va in giro. E i soldati possono essere abbattuti dai nemici.

Come dovrei strutturare il server di gioco e cosa fare al client?

Vale a dire se un soldato si sposta da X a Y ma attorno all'edificio Z, immagino che il server debba essere in grado di calcolare esattamente dove si trova il soldato (nel caso in cui un nemico gli abbia sparato), e il cliente deve anche conoscere la posizione per dipingere il soldato.

Cosa dovrebbe essere fatto sul server e penso di dover progettare un protocollo per questo. Penso che il server debba tenere traccia dello stato del gioco e del tempo. Qualcuno ha suggerimenti su come farlo? o potresti raccomandare qualche lettura?

Risposte:


12

In generale è un argomento molto complesso. Hai due obiettivi contrastanti (almeno se non prevedi di eseguire ogni singolo gioco su un server dedicato):

  1. Avrai bisogno di fare il più possibile sul server, sia per evitare cheat sia per assicurarti che tutti i client vedano le stesse cose.
  2. Ma vuoi anche che le cose siano giuste, il che significa che una persona ha un ping 0-time sul server mentre altre hanno un ritardo di rete, quando entrambi danno un comando alle loro unità contemporaneamente, il giocatore "server" ha un vantaggio .

Non posso dire esattamente come risolverlo per un RTS. Quello che facciamo per il nostro sparatutto in prima persona è che il server salvi uno stato mondiale completo qualche tempo fa e consenta al client di eseguire il timestamp ad ogni scatto. Quando il messaggio di rete per "I licenziato!" raggiunge il server, il server può tornare indietro nel mondo ed eseguire test di collisione ecc. sul mondo "come ha cercato il client quando è stato sparato il colpo".

Se stai pensando di avere molte unità, avrai anche il problema di avere potenzialmente troppe elaborazioni da gestire per il server. Se non sei terribilmente preoccupato per l'hacking o la truffa, suggerirei di indirizzare i client sui client e di inviarne i risultati al server.

Un'altra opzione potrebbe essere quella di andare peer2peer su di esso, lasciando che ciascun cliente gestisca gli aggiornamenti per i team locali, ma ciò apre quindi la domanda su come determinare chi colpisce cosa e così via.

A seconda di quanto sia complesso questo progetto e di quanti sforzi sei disposto a spendere per esso, il mio miglior suggerimento sarebbe quello di decidere qualcosa di preliminare e iniziare a lavorarci per testarlo.


1
In realtà ci sono tre (o forse più) obiettivi contrastanti. Il terzo è la prestazione, mantenendo e aggiornando completamente lo stato di un gioco in tempo reale sul server utilizza molte risorse.
Bart van Heukelom,

2
Oh, e puoi facilmente risolvere il n. 2 introducendo un ritardo artificiale che è uguale alla media del ritardo degli altri giocatori. Bene, se puoi chiamare "rendere il male per tutti" una soluzione, cioè.
Bart van Heukelom,

@Bart: in parte vero, ma ovviamente dovrebbe esserci un limite a quanto ritardo introduci artificialmente, o connessioni più lente potrebbero forzare costantemente connessioni più veloci a ritardare troppo, il che è sicuramente ora quello che vuoi.
o0 '.

Trovare il percorso migliore non è un problema se fatto sul client, a condizione che una volta trovato lo mandi la soluzione al server, che - come per tutti i movimenti - controlla se è corretto.
o0 '.

2

Esistono sostanzialmente due approcci:

  1. Cliente fidato
  2. Client non attendibile

Il client fidato è un po 'più complesso, ma ha il vantaggio di poter scaricare gran parte del calcolo dal server. Il costo del funzionamento del server è uno dei maggiori problemi per i giochi multiplayer e ridurrà seriamente la tua scalabilità.

Un buon approccio (per i principianti) è quello di lasciare che ogni client dei giocatori gestisca le proprie unità. Nel passaggio successivo puoi utilizzare i cicli di riserva per consentire ai giocatori giocatori di verificare le azioni di altri clienti. Il server non dovrebbe fare altro che scambiare messaggi, mantenere la sincronizzazione e garantire la persistenza (ad es. Database).

Se hai intenzione di avere una sorta di lobby o chat, allora gestisci ciascuno di questi argomenti in un server aggiuntivo. Renderà le cose molto più facili lungo la strada.


Grazie, è stato informativo. Penso che andrò per i client non attendibili, e devo fare del lavoro sul server. Non avrò molti giocatori all'inizio.
Jonas,

1
"Non avrò molti giocatori ..." Non posso contare il numero di sviluppatori che mi danno quella linea e tornano sei settimane dopo con: "Ho questi 5000 giocatori che vogliono pagare per giocare, ma non riesco a scalare :( ". Tienilo a mente!
Andreas,

9
"Client fidato" non è un approccio, è un errore.
o0 '.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.