Newsgroup: it.comp.java
Titolo: Applicazione multiclient, la soluzione migliore

Ciao a tutti, sto realizzando un giochino multiplayer dove i giocatore
possono essere circa una decina.
Lo sto facendo in UDP.
Stavo pensando a come fare in modo che ogni client sapesse della
posizone degli altri client, e sono arrivato a due soluzioni possibili.
Premetto che ogni client si connette ad un server dedicato.
Prima soluzione:ogni client spedisce le proprie info al server, il
quale ha tenuto in memoria(al momento della connessione dei giocatori)
ogni indirizzio dei client, e quindi rispedisce l'info a tutti i client
connessi. In questo modo ogni client sa della posizione degli altri, ma
penso che la latenza(il ping) raddoppi in quanto io client A per fare
sapere la mia posizione al client B devo prima spedirla al server, il
quale poi la spedisce al client B, quindi ping doppio penso...
Seconda soluzione:quando un client si connette al server riceve la
lista degli indirizzi di tutti i client connessi in quel momento,e
ovviamente quando si connetterà un altro client il server si preoccupa
di mandare l'indirizzo del nuovo arrivato a tutti i client.
In questo modo io client A posso far sapere la mia posizione a tutti
client perchè la posso spedire direttamente a loro senza passare dal
server, in questo modo deduco che il ritardo sia minore della soluzione
precedente, in quanto la comunicazione è diretta.
In questo caso il server servirebbe solo a mandare la lista dei client
connessi alla partita, ed a far sapere a tutti quando un client si
sconnette o connette.
Io opterei per la seconda soluzione, c'è una cosa però che non mi
convince.
Analizzando i più comuni giochi in multiplayer(per citarne alcuni
Quake 3, unreal tournament ecc ecc) sembra che il server centri molto
di più, infatti se ci si collega ad un server "lento" si avrà un ping
bello alto che impossibilita quasi a giocare.
Questo mi fa pensare che utilizzino la prima soluzione e non la
seconda, nella quale il server lento non influirebbe sul ping dei
giocatori.
Ma se così fosse, per quale motivo questi giochi utilizzano la prima
soluzione(sicuramente molto più raffinata ovviamente, ma pur sempre
così penso) e non la seconda che sembrerebbe più perfomante?Ci sarà
sicuramente un motivo.
Oppure sto sbagliando tutto e nessuna delle due mie soluzione andrebbe
bene e i giochi da me menzionati utilizzano soluzione totalmente
diverse?

bho ha scritto:

Mmm, non ci avevo mai pensato, ma riflettendoci un pò arrivo ad una 
semplice comclusione: il serve non serve solo per fare da "diffusore" di 
messaggi, ma sicuramente senrva a limitare le connessioni.
Se un Client deve connettersi a 10 altri client deve avere 10 
connessioni diverse, ognuna con una latenza diversa e così per ognuno 
dei 10 client... quindi 100 connessioni diversi con dati che girano per 
la rete.
Un solo server semplifica moltissimo lo scambio di messaggi, prova a 
pensare al movimento dei personaggi in un livello complesso... se io 
client A non posso vedere/sentire/altro dove stà il personaggio del 
client B molto probabilmente il server (conoscendo la posizione di 
tutti) neanche mi invierà i dati, cosa diversa se i dati me li avesse 
mandati direttamente B.
Poi tutto il mare di dati potrebbe venire 
ottimizzato/impacchettato/modificato dal server stesso per motivi sia di 
ottimizzazione che di sicurezza.
Delvy

 Delvy
Ciao, intanto grazie per l'interessamento!
Certo hai ragione, non ci avevo pensato, sicuramente il server farà
una specie di selezione su cosa mandare e a chi.
Per il fatto delle 100 connessioni diverse se ho 10 client non ho
capito, non ti seguo.
Le connessioni(che poi sono virtuali in quanto non utilizzo TCP ma UDP)
sarebberò comunque 10.
Considera che ogni client ha 1 porta dove riceve i dati dagli altri
client, quindi ogni client spedisce 10 volte i dati,una x ogni client.
Anzi a dirla tutta forse è più complicata la prima solzione, in
quanto il server oltre a stare in ascolto di tutti i client, ogi volta
che riceve qualcosa la deve rispedire a tutti!
Ovviamente la mia applicazione ritengo sia molto più semplice di
giochi del calibro di quake(si tratta di una specie di worms ma in
tempo reale e non a turni),quindi credo che una selezione da parte del
server dei dati sia non necessaria, secondo te comunque dovrei optare
per la prima solzione?

Dai ragazzi non lasciatemi nel buio della mia ignoranza! :)