|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
[JAVA]Gioco multiplayer
Come potrei fare un gioco muliplayer?
Vorrei fare che uno potrebbe fare da server e rimanere in ascolto di vari client(numero prestabilito), e ovviamente che quando un client si connette riceve dati dal server e invia i propri. Io ho pensato ad un thread che resta in ascolto della connessione dei client(temporizzato in modo da non bruciare troppa cpu, non so tipo 200ms) e che quando riceve la richiesta di connessione da un client avvia un altro thread adibito alla comunicazione con quel client. Secondo voi andrebbe bene così?? Il fatto è che avrei molto thread poi, ed in più i thread per gestire i client(ognuno il suo) non devono essere temporizzati o sbagli? Altrimenti avrei un lag assurdo. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Mmm sto pensando, il thread che rimane in ascolto dei client può anche essere non temporizzato credo visto che tanto rimane bloccato finche un client non si connette.
Stavo poi anche pensando ad una cosa, se il ping di norma tra due linee adsl è di 90ms come cavolo faccio a spedire la posizione di un oggetto e rielaborarla dall'altra parte? Cioè se spedisco ogni 90ms circa, avrò un frame rate bassissimo!!! Mettiamo un caso semplice dove c'è un server ed un solo client, ognuno può muovere una palla ede entrambi vedono sullo schermo la propria palla e quella dell'altro. Si devono ovviamente spedire la posizione delle singole palle, ma andranno a scattissimi se spedisco ogni 90ms!!! Sono solo 11frame per secondo, assurdo ci deve essere un'altro modo! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Mi sono dimenticato di dire che prima parlavo del protocollo TCP
Sto guardando il protoccollo UDP e forse credo che potrebbe fare al caso mio... |
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Comunque non confondere la latenza (90ms) con la velocità! E comunque chi vuole veramente giocare "on-line" è bene che si prenda una ADSL settata in modalità "fast". Tieni presente che dal momento in cui invii un pacchetto di dati, esso arriva al destinatario con un certo ritardo (questo è ovvio e normale). Quello che ti deve importare non è tanto questa latenza ma la velocità con cui puoi spedire pacchetti! Non devi per forza spedire pacchetti ogni 90ms! Se tu spedisci pacchetti di dati ogni 20ms (50 volte al secondo) il destinatario li riceverà più o meno ogni 20 ms ma semplicemente "ritardati" di un tot di tempo, che è comunque molto basso! (90ms sono comunque meno di una frazione di secondo!). P.S. stavo osservando il tuo avatar .... divertente
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 13-07-2006 alle 13:59. |
||
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Ah ok capito grazie!
Te hai mai realizzato qualcosa del genere?? Stavo proprio guardando se non era il caso di usare l'UDP(mai fatto prima) se butto giù un po' di codice hai tempo di seguirmi un attimino? Comunque mi chiedevo, se io ho un thread per ogni client dove spedisco i dati(parlo ancora del TCP) in pratica dovrei fare una cosa del genere Codice:
ObjectOutputStream.writeObject(pos_giocatore_server); ObjectInputStream.readObject(pos_giocatore_client); ObjectOutputStream.writeObject(altri dati); ps.grazie x l'avatar(fatto con le mie mainine il giorno dopo la vittoriaaaaaaa) |
|
|
|
|
|
#6 | |||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Uhm ma i thread non cominciano a diventare un po' troppi?
Facciamo due conti, essendo un'applicazione grafica, quindi elbarazione e rendering: SERVER 1 thread per elaborare la posizione 1 thread per disegnare quel che c'è da disegnare 1 thread per rimanere in attesa dei client n thread dove n?numero client 2 thread per client 1 di lettura uno di scrittura TOTALE=3+2*n thread CLIENT 1 thread per elaborare la posizione 1 thread per disegnare quel che c'è da disegnare 1 thread per spedire i dati 1 thread per leggerli TOTALE 4 thread Non sono un po' tantini? |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Intanto butto giù un po' di codice per cercare di fare una connessione multithread sempre TCP per ora.
Più tardi spero di postare il risultato
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
vai, ti seguo impazientemente, speriamo che ci riesca, e se hai problemi postali
A prop, mi sono "scopiazzato" il tuo avatar
__________________
My gaming placement |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Fai pure per l'avatar no problem
Sto scrivendo intanto fra poco dovrei postare le prime cose! |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Problemino, che so come risolvere ma penso ci sia un metodo meno macchinoso del mio!
Allora ho un thread(A) il quale resta in ascolto delle connessioni dei client, quando un client si connette genera un thread(B) il quale svolge tutte le attività inerenti allo scambio di dati tra server e client. Il problema è questo:come faccio dal thread(B) a far entrare ed uscire i dati che devo scambiare? Un po' di codice: Codice:
...metodo run del thread(A)
public void run(){
try{
System.out.println("Server Avviato...");
while(true){
cs=ss.accept(); // crea il socket del client per comunicarci
nClient++;
ServerThread st=new ServerThread(cs,in,out); //E' il thread che si occupa dello scambio dati
st.start();
System.out.println(nClient);
}
}
catch(Exception e){
System.err.println(e);
}
}
Codice:
...metodo run thread(B)
public void run(){
Thread leggi=new Thread("Lettura"){
public void run(){
while(true){
try{
ObjectInputStream is=new ObjectInputStream(cs.getInputStream());
in=(String)is.readObject();
System.out.println(in);
sleep(1);
}
catch(Exception e){
System.err.println(e);
}
}
}
};
Thread scrivi=new Thread("Scrittura"){
public void run(){
while(true){
try{
ObjectOutputStream os=new ObjectOutputStream(cs.getOutputStream());
os.writeObject(out);
sleep(1);
}
catch(Exception e){
System.err.println(e);
}
}
}
};
leggi.start();
scrivi.start();
}
Per usare tutto questo basta creare un oggetto di tipo Server ed automaticamente si creerà un thread che resta in ascolto delle connessioni, ma poi come passo i valori da scrivere e come tiro fuori ciò che ho letto??? |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Io ho pensato che potrei inserire tutti i thread che creo quando si connetto i client in un array invece di perdere i riferimenti, così posso usarli per scambiare i dati. Basterebbe infatti interrogare ogni thread uno ad uno con un ciclo for.
Mi sembra però un po' macchinoso. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Ho praticamente fatto una chat multiutente, cioè che ciò che scrivi lo vedono tutti, un po' come irc.
Il fatto è che non funziona |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Allora, ho finito la chat multiutente se posto il codice non mi prendete in giro vero?
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Ho finito la mia piccola prova direi, si tratta di una connessione multiutente dove ogni utente può muovere una palla e scrivere in una chat, e ovviamente vedere la posizione delle altre palle.
In locale funziona benissimo ora vorrei provarlo "veramente" chi si offre? Mi sono iscritto qui http://www.no-ip.com/ come faccio per poter reindirizzare il mio ip sulla rete? Cioè vorrei che digitando il mio ip, non mi collego direttamente alla mia macchina ma passo da un loro server. Ma magari apri un 3d apposta. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Anche se non vi frega dopo diverse prove con il TCP ho dedotto che forse non è quello che fa per me.
Sono riuscito a fare quello che volevo ma non mi piace molto il metodo, ora provo con l'UDP! |
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Oct 2004
Città: Bologna
Messaggi: 50
|
No, il TCP non fa per te, non fosse altro per l'algoritmo di Neagle che ritarda la spedizione dei segmenti tcp finchè non hanno una certa dimensione, per evitare frammentazione.
L'UDP in effetti era la scelta giusta fin da subito, ovvero un protocollo veloce che non dia garanzie di ricezione (non ti interessa che un pacchetto perso venga rispedito, essendo "real time" un pacchetto rispedito è già obsoleto e quindi inutile). Magari una panoramica sui protocolli prima di mettersi a scrivere il codice aiuta ed evita fatiche inutili Wikipedia di solito su queste cose è abbastanza buona come punto di partenza.
__________________
And the salad is frightful! I have an important message to deliver to all the cute people all over the world. If you're out there and you're cute, maybe you're beautiful. I just want to tell you something: there's more of us ugly mother-fuckers than you are, hey-y, so watch out. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:33.



















