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 |