Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - quale logica implementare in un gioco multiplayer
Forum - Algoritmi - quale logica implementare in un gioco multiplayer

Avatar
dotNET (Member)
Rookie


Messaggi: 26
Iscritto: 13/09/2010

Segnala al moderatore
Postato alle 13:40
Domenica, 11/12/2011
Salve a tutti, ho un dubbio che mi tormenta, allora, volendo fare un gioco in multiplayer vorrei sapere quale tecnica viene utilizzata solitamente.
Ovvero, prendete come esempio Minecraft in multiplayer, uno fa partire il server e i vari client si connettono per giocare.
Arrivando al punto, secondo voi il client dice al server (ad esempio) che ha premuto il tasto per saltare e il server di conseguenza muove il giocatore oppure il client alla pressione del tasto salto aggiorna il server con le varie posizioni che sta percorrendo?
O si usano ancora altre tecniche?

PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Up
3
Down
V
Segnala al moderatore
Postato alle 15:42
Lunedì, 12/12/2011
il metodo corretto è il primo, non solo per il motivo che ti ha correttamente suggerito @walker93, ma anche perchè così usi meno pacchetti.

Il problema del "gioco scattoso" esiste e ci sono vari metodi per attenuare l'effetto. Uno dei classici consiste nell'adozione di modelli "predittivi".

Te lo spiego con un esempio pratico:

- Premo il pulsante di salto
- Il client invia al server il messaggio "Jump"
- Nel frattempo il client esegue l'animazione del salto
- Il server, elaborata la richiesta, invia al client una risposta che gli dice se il salto è stato vietato per una qualche ragione (magari nel frattempo ti hanno sparato e invece di saltare dovresti fare qualche altra azione), ed invia un eventuale messaggio contenente la situazione "corretta"
- Il client, una volta ricevuta la risposta, esegue la correzione se presente

In questo modo può capitare che parta l'animazione di salto, ma dopo alcuni frame arrivi un messaggio "Head Shot" e il personaggio si trova teletrasportato più lontano e con un'animazione diversa. Nella maggior parte dei casi, soprattutto se sono giochi poco movimentati, la predizione funziona bene e il gioco scorre senza intoppi.

L'algoritmo di predizione deve essere identico nel client e nel server, così il server può sapere se il client si trova nello stato corretto oppure se deve inviare un messaggio correttivo (ad esempio la correzione potrebbe essere: "posizionati +10.0 pixel lungo l'asse X, velocità di salto +2.0 lungo Y").

E' un po' bruttino a vedersi quando la predizione fallisce, ma il 99% dei giochi online moderni funzionano così e la gente si è abituata a questo sistema di funzionamento.

Implementare nella pratica questa tecnica è tutto tranne che semplice, ma almeno hai un'idea di base da cui partire.

Ultima modifica effettuata da TheKaneB il 12/12/2011 alle 15:43
Ottimo, ragionandoci su nella giornata anch'io ero arrivato per logica a una soluzione simile, se poi nelle vacanze ti va puoi aiutarmi in una semplice implementazione di ciò di cui si è discusso :) - dotNET - 12/12/11 16:40
PM
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 16:26
Domenica, 11/12/2011
credo, (non vorrei dire cavolate perchè non è essattamente il mio ambito)  che utilizzando il secondo metodo sia più facile barare tramite programmi esterni(come CheatEngine) perchè si inviano al server dati maipolati per migliorare le proprie prestazioni.
utilizzando il primo invece è il server che esegue i calcoli e quindi il client non fa altro che visualizzare correttamente i dati ricevuti dal server; e anche se si modificassero questi dati solo il tuo client vedrebbe dati "manipolati" perchè gli altri giocatori ricevendo i dati corretti dal server vedrebbero dati corretti.

Si sicuramente sarebbe piu facile creare hack ma se si usasse il secondo metodo penso risulti tutto quanto molto piu lento e scattoso x ogni client - dotNET - 11/12/11 19:56
PM
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 15:41
Lunedì, 12/12/2011
questo è vero, il server gestirebbe tutti gli utenti, tuttavia devi considerare che sei tu a scegliere la potenza di calcolo del server in base alle esigenze,  invece non puoi scegliere i client che si connettono di conseguenza se un computer scaccione si connette e non è abbastanza potente da gestire tutto (invio e ricezione dati dal server e calcoli) rischi che quel giocatore faccia casini: cioè potrebbe scadere il timeout della connessione tra un calcolo e l'altro, creare lag(differenza tra i dati sul server e sul client) o altri problemi simili...

bèh giocando su assaultcube vedo che loro per esempio hanno dei server dove al massimo massimo si può stare in venti. quindi direi che gran parte del lavoro sta sul server come hai detto anche tu. - Mte90 - 14/12/11 17:30
PM