La cosa migliore che si può fare in questo tipo di situazioni è cercare di prevedere il movimento lato client (calcolo stimato), e quindi correggere la posizione/velocità con i dati dal server se/quando necessario.
Ad esempio, supponiamo che il tuo oggetto in esecuzione veloce si muova da sinistra a destra attraverso lo schermo alla velocità di 5, e un giocatore gli spara e cambia direzione in modo che ora si muova verso l'alto sullo schermo a quella velocità di 5 (Giro di 90 gradi).
L'applicazione sul lato client verrà probabilmente aggiornata molto più frequentemente di quanto non ottenga i dati dal server (ad esempio 60 aggiornamenti al secondo lato client e 10 pacchetti al secondo ricevuti dal server). Diciamo che, in tempo reale, l'oggetto ha cambiato direzione con 5 fotogrammi rimasti prima dell'arrivo dell'aggiornamento del server. Sul lato client, l'oggetto continuerà a spostarsi lungo la sua traiettoria corrente finché non riceve l'aggiornamento dal server che ha cambiato direzione (cioè non si ferma solo quando non riceve dati dal server), a quel punto, il cliente correggerà la posizione e la velocità dell'oggetto.
In che modo la correzione determinerà quanto apparirà nervosa l'animazione. Potresti semplicemente fare lo zapping nella posizione corretta all'istante, causando così un piccolo salto ma dando istantaneamente la posizione corretta, oppure potresti cambiare la sua velocità in modo tale che si muova in una transizione morbida a quella posizione, senza causare alcun salto, ma avendo una posizione leggermente imprecisa durante il tempo medio della correzione.
Avrete sempre alcune situazioni in cui queste correzioni finiranno per essere piuttosto grandi (ad esempio qualcuno ha una connessione veramente brutta, pacchetti scartati, latenza altissima, ecc.). Questo è quando ottieni le anomalie folli che di solito le persone chiamano ritardo nei giochi online, come quando un oggetto salta grandi distanze o si muove velocemente per "recuperare" dove dovrebbe essere. Non c'è assolutamente modo di essere sincronizzati al 100% tutto il tempo. Tutto quello che puoi fare è fare davvero delle buone ipotesi su dove dovrebbero essere le cose.
Ecco alcuni articoli con maggiori dettagli, buona fortuna!
http://gmc.yoyogames.com/index.php?showtopic=415538 http://www.gamasutra.com/view/feature/3230/dead_reckoning_latency_hiding_for_.php
fonte
2011-10-18 18:42:23
È possibile inviare un timestamp con ciascuna azione e quindi fare in modo che il server inserisca retroattivamente l'azione al momento opportuno. (Questo non risolve completamente il tuo problema, in quanto i giocatori potrebbero barare cambiando il timestamp e i giocatori non vedranno il cambiamento più tardi, ma ridurranno i problemi di lag e non sarai in grado di trasmettere i dati istantaneamente non importa cosa fai.) – someone
timestamp basati su client non saranno mai precisi. Il mio orologio è a 2 minuti mentre scrivo il post. – Marc
La domanda principale è se c'è un modo per sincronizzare una grande quantità di dati, aggregati da piccoli messaggi (un giocatore ha sparato/cambia direzione) con un gran numero di connessioni - in tempo reale. – Marc