Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-07-2006, 12:11   #1
MEMon
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.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 12:36   #2
MEMon
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!
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 12:54   #3
MEMon
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...
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 12:56   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da MEMon
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.
Esatto ... rimane bloccato sulla accept().

Quote:
Originariamente inviato da MEMon
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!!!
Innanzitutto in questi casi in cui si ha bisogno di una certa velocità, credo (ma non ne sono sicuro) che sarebbe meglio usare UDP invece che TCP.
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet

Ultima modifica di andbin : 13-07-2006 alle 12:59.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 13:07   #5
MEMon
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);
In pratica ogni volta si blocca finchè non riceve i dati dal client giusto? Questo fa perdere un casino di tempo o sbaglio?

ps.grazie x l'avatar(fatto con le mie mainine il giorno dopo la vittoriaaaaaaa)
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 13:20   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da MEMon
Te hai mai realizzato qualcosa del genere??
No .... magari.

Quote:
Originariamente inviato da MEMon
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?
Più o meno (più il meno che il più ), perché non sono ferratissimo in materia di networking e socket.

Quote:
Originariamente inviato da MEMon
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);
In pratica ogni volta si blocca finchè non riceve i dati dal client giusto? Questo fa perdere un casino di tempo o sbaglio?
Innanzitutto sarebbe, credo, meglio avere 2 thread per una singola comunicazione, uno per la scrittura e l'altro per la lettura.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 13:32   #7
MEMon
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?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 13:49   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da MEMon
Non sono un po' tantini?
Dal lato client, avere 4 thread non è certamente un problema. Dal lato server, non credo nemmeno e comunque dipende da quanto vale quel "n".
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 13:53   #9
MEMon
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
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 16:05   #10
franksisca
Senior Member
 
L'Avatar di franksisca
 
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
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 16:52   #11
MEMon
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!
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 17:23   #12
MEMon
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);
		}
	}
Come potete vedere creo i thread quando un client si connette.

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();
	}
Allora in pratica il thread(B) istanzia altri due thread uno per la lettura ed uno per la scrittua di una stringa(in e out sono le stringhe)

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???
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 17:25   #13
MEMon
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.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 17:54   #14
MEMon
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 cioè, quando scrive il server scrive a tutti i client, ma quando scrivono i client riceve solo il server...
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2006, 18:00   #15
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Allora, ho finito la chat multiutente se posto il codice non mi prendete in giro vero?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2006, 08:19   #16
MEMon
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.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2006, 16:48   #17
MEMon
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!
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 15-07-2006, 00:10   #18
il_luridone
Member
 
L'Avatar di il_luridone
 
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.
il_luridone è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:13.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v