Nozioni di base sul gioco multiplayer online [chiuso]


9

Attualmente sto lavorando al gioco multiplayer online ac # in tempo reale. L'obiettivo è avere una connessione client / server utilizzando il protocollo UDP. Finora ho usato UDP per i movimenti dei giocatori e TCP per gli eventi (un giocatore che spara, un giocatore che perde punti vita) perché devo essere sicuro che tali dati arriveranno a tutti i giocatori collegati al server. So che UDP è detto "inaffidabile" e alcuni pacchetti potrebbero andare persi. Ma ho letto ovunque per non mescolare mai TCP e UDP perché può influire sulla connessione.

La domanda principale è come devo organizzare la mia rete?

UDP è senza connessione, come devo salvare chi è chi? Devo salvare gli indirizzi IP dei client in un elenco?

Dovrei usare TCP per eventi importanti o usare UDP? Se devo usare UDP, come posso assicurarmi che i dati non vadano persi?

Utilizzando sia TCP che UDP, devo salvare per ciascun giocatore il loro IP in un elenco (per UDP) e il TcpClient che è collegato in un altro elenco (per UDP). Come potrei cambiarlo per essere più efficace?


@JoshPetrie questa domanda è legittima "La domanda principale è come devo organizzare la mia rete?". Non si tratta di usare questo o quello. L'OP ne usa uno e necessita di consigli sull'aggiunta di un'altra tecnologia che ha già scelto. È ampia in quanto la risposta non risiede in quale tecnologia dovrebbe essere utilizzata, ma in come il software può essere strutturato per evitare gonfiore dei tubi, ridurre il ritardo e aumentare l'affidabilità indipendentemente dalla tecnologia sottostante.
Coyote,

È anche troppo ampio. La domanda dovrebbe essere modificata (sentitevi liberi di farlo, è piuttosto vecchia) per essere più in tema, quindi può essere riaperta.

Risposte:


6

UDP ha un sovraccarico minore, ma a costo di perdere i pacchetti senza saperlo (parte dell'overhead con TCP assicura che i pacchetti persi vengano rispediti).

Tuttavia, il grosso problema con l'utilizzo di UDP è che ci sono molti siti che bloccano tutto il traffico UDP (tranne DNS) perché molti amministratori ritengono che sia una buona pratica di sicurezza.

Inoltre, non dare per scontato che ognuno dei tuoi giocatori disponga di un indirizzo IP diverso: ci sono molte situazioni in cui più utenti condividono la stessa connessione a Internet e se i bambini della scuola vengono agganciati al tuo gioco puoi scommettere che probabilmente scoprirai come installarlo ed eseguirlo durante le lezioni invece di fare il loro lavoro (e non preferiresti che trascorressero questo prezioso tempo sul tuo gioco anziché su quello di qualcun altro?).

Una volta aperto il flusso TCP, è ancora abbastanza efficiente. Il prossimo passo è minimizzare la quantità di dati che stai inviando / ricevendo, ed è qui che entra in gioco la progettazione del protocollo. Se invii solo pochi byte per ciascun comando (ad es. "Sposta avanti") anziché, ad esempio, racchiudendo lo stesso comando in centinaia di byte di codice XML, il consumo complessivo della larghezza di banda della rete sarà inferiore E meno cicli della CPU essere necessario per elaborare le informazioni (alcuni byte sono facilmente comparabili rispetto allo smantellamento e all'interpretazione e al controllo della sintassi di un grosso blocco di XML).

Puoi certamente aprire più flussi TCP e usarli per scopi diversi, come uno per i comandi, un altro per i trasferimenti di grafica, un altro per la chat basata su audio, ecc. In questo modo, se stai trasferendo un grafico di grandi dimensioni che richiede 5-10 secondi per il download, almeno i movimenti dei comandi del giocatore non rallenteranno perché si troveranno su un flusso diverso (e puoi visualizzare uno sprite predefinito fino al termine del download del nuovo sprite, che è sempre più divertente dell'attesa).


1
La domanda originale menzionava un modello client-server, quindi i "siti" che bloccano tutti gli UDP sono irrilevanti; questo è il problema del cliente, e dubito che molti client effettivamente blocchino tutto l'UDP. "L'uso di TCP è l'errore peggiore che puoi fare quando sviluppi un gioco in rete! Per capire perché, devi vedere cosa sta effettivamente facendo TCP al di sopra dell'IP per rendere tutto così semplice!" Vedi gafferongames.com/networking-for-game-programmers/udp-vs-tcp
indeed005

@ indeed005: ci sono pro e contro: UDP offre sicuramente un vantaggio in termini di prestazioni, ma a costo di affidabilità (che è dove TCP ha il vantaggio). Per quanto riguarda il blocco UDP, hai assolutamente ragione sul fatto che si tratta del problema del cliente, ma in molti ambienti aziendali ed educativi ho riscontrato che UDP (tranne la porta 53) è stato bloccato da amministratori ignari che pensano che UDP sia un problema di sicurezza, e quindi l'opzione per il client di fallback su TCP può almeno significare che il giocatore può sperimentare il gioco (specialmente se la larghezza di banda della rete è abbastanza veloce).
Randolf Richardson,

@ indeed005: Inoltre, l'utilizzo di una combinazione di UDP e TCP può essere abbastanza accettabile, poiché TCP può essere utilizzato per i trasferimenti di dati a priorità inferiore, mentre UDP può essere utilizzato per il lato dell'azione ad alta velocità delle cose. È interessante notare anche che con IPv6 ci sono nuove opzioni disponibili (che non sono disponibili con IPv4) che possono soddisfare le esigenze in tempo reale dei giochi pur non essendo di natura senza connessione, ma penso che ci vorrà un po 'prima di IPv6 può essere utilizzato dai giochi senza dover fare affidamento su IPv4 (questo è un peccato, quindi ci accontentiamo di IPv4 come meglio possiamo per ora).
Randolf Richardson,

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.