2011-02-08 10 views
9

Vedo che questa domanda è stata posta prima, ma il contesto intorno alle domande è solitamente vago. Sto cercando di creare un gioco multiplayer in tempo reale su Android in cui sia presente uno stato globale che deve essere condiviso tra tutti i client. Quindi, ho la tendenza a credere che UDP potrebbe non essere sufficiente. TCP offre affidabilità ma con il sovraccarico intrinseco. Tuttavia, poiché questa è la prima volta che ho affrontato un problema del genere, sto cercando un riscontro dalle esperienze di altre persone.Android gioco UDP/TCP?

Pertanto, (generalmente) nel contesto di un gioco multiplayer in tempo reale su uno smartphone Android, l'overhead associato a TCP è sufficientemente accettabile tale che l'esperienza dell'utente non è influenzata in modo così sfavorevole? Inoltre vale la pena ricordare che la connessione TCP dovrebbe essere una connessione persistente. Inoltre, l'UDP unito ad alcuni affidabili meccanismi personalizzati sviluppati potrebbe essere un approccio migliore? Qualsiasi input mi aiuterebbe davvero fuori & sarebbe molto apprezzato.

molte grazie

risposta

10

La risposta migliore è probabilmente "provare e vedere".

Sono dell'opinione che il sovraccarico TCP non sia davvero un grosso problema per la maggior parte delle applicazioni. Le dimensioni dell'intestazione sono dell'ordine di 10 byte più grandi e i messaggi di ack devono essere inviati avanti e indietro per ciascun messaggio.

Il vero killer per un gioco in tempo reale sarà la latenza. UDP è fire-and-forget. Ciò significa che ogni messaggio è in ritardo rispetto al tempo di transito tra i due nodi. Dal momento che TCP richiede un ack, un messaggio non è realmente considerato "inviato" fino a quando non viene ascoltata l'altra parte.

Generalmente, il problema tra di loro si riduce al rilevamento degli errori. Se un messaggio si perde in qualche modo nell'interwewe, come vorresti che fosse gestito? Se ogni messaggio è abbastanza importante, se usi UDP finirai per dover implementare il tuo protocollo simile a TCP su di esso. Potresti anche usare il TCP e lasciare che l'hardware di rete ti aiuti. Tuttavia, se i vecchi messaggi dopo il tempo richiesto per diversi tentativi (ciascuno alla latenza della rete) saranno comunque spazzatura con nuovi aggiornamenti in arrivo, quindi TCP è uno spreco di banda per te.

+0

Grazie per la risposta. Se vado con TCP, è possibile creare una connessione TCP persistente ?! – Joeblackdev

+0

Dipende da cosa intendi per "persistente". Se intendi che sopravvive a un riavvio, allora no. (In effetti, può volerci un po 'perché l'altro lato lasci la sua connessione, in quel caso è ** troppo persistente **). Se vuoi dire che dura fino a quando entrambe le app sono in esecuzione, è esattamente come funziona TCP. UDP, ovviamente, è senza connessione. –

+0

TCP è completamente bidirezionale fino a quando la sessione rimane connessa. –

7

Questa non è propriamente una domanda per Android, sebbene il protocollo e gli altri meccanismi scelti abbiano un effetto sul dispositivo (ad esempio la durata della batteria).

Quale protocollo scegliere dipende principalmente dalle proprie esigenze (dimensione media del pacchetto, pacchetti al secondo in media, se i pacchetti persi sono un problema, quanti dati si invieranno in una volta, è un problema di jitter, ecc.). Posso dare alcuni suggerimenti però.

Ecco un ottimo articolo sulla realizzazione di reti Quake3:

http://trac.bookofhook.com/bookofhook/trac.cgi/wiki/Quake3Networking

Semplice ma efficace, mi piace molto e posso solo consigliare questo.

Ecco anche una buona discussione sul tema:

http://www.gamedev.net/topic/319003-mmorpg-and-the-ol-udp-vs-tcp/

Alcuni giochi utilizzano UDP (soprattutto FPS e RTS tipi), un po 'di TCP, e alcuni di loro una certa combinazione di essi (ad esempio UDP inviare dati di gioco, TCP per chat e altre cose). O si può lavorare. Si dovrebbe anche tenere presente che gli utenti potrebbero voler lavorare su reti 2G, 3G o WiFi, e anche le reti WiFi possono essere in ritardo o in eccesso. Suggerirei di implementare un prototipo rapido e testarlo in vari ambienti di rete.

+0

Grazie per il collega amico. Darò un'occhiata. Tra l'altro lavoreremo con il 3G. – Joeblackdev

+3

Un'altra cosa: il TCP non era pensato per le reti wireless. Per la maggior parte delle implementazioni TCP, quando un pacchetto viene perso (che è molto comune nelle reti wireless), lo stack di solito pensa che sia a causa della congestione nel percorso di rete, quindi si rifiuta di inviare pacchetti. UDP e l'altra mano non ha questo problema, ma non ti dà alcuna garanzia sulla consegna dei pacchetti. Scambi :-) – ldx

+0

Eccellente, grazie per l'input! Cordiali saluti – Joeblackdev

4

Sto affrontando lo stesso problema. Dalla revisione della letteratura ho fatto vi consiglio di leggere questo articolo:

"Esperienze di implementazione di un mobile multiplayer gioco in tempo reale per reti wireless con elevata latenza" - http://www.hindawi.com/journals/ijcgt/2009/530367/

+0

Questo è un ottimo articolo. Grazie per quello! – Joeblackdev

3

Puoi vedere il mio gioco (ancora in fase di sviluppo) - https://market.android.com/details?id=com.reality.weapons.ak47

Utilizza TCP/IP. È possibile ottenere sensazioni sulle latenze sparando e osservando i messaggi di notifica in "Battle log".

Finora sono abbastanza soddisfatto. Nelle aree urbane con una buona copertura GSM, andata e ritorno

"fuoco-> viaggio per Server-> calcolo del risultati-> Risultati di viaggio back> visualizza notfication"

di solito prende meno di 200 Signorina.

A volte potrebbe essere 2 sec. Ma nel 99% è inferiore a 500 ms.

Problemi correlati