sto facendo un gioco di fisica veloce che è un hockey da tavolo. Con due mazze e un disco. Il gioco funziona su iPhone / iPad e sto facendo la parte multiplayer tramite GameCenter.
Ecco come funziona il sistema di rete. Il client che inizia la partita, verrà impostato come server e quello che accetta la richiesta di corrispondenza è il client.
Il 'server' ha la fisica in esecuzione e la risposta è immediata e il client ha anche la sua fisica in esecuzione, quindi sembra regolare tra lo scambio di messaggi. Quello che faccio come server è che invio al client la mia velocità del disco e la mia posizione e il client regola la sua velocità / posizione del disco in relazione al server per mantenerlo sincronizzato. Altrimenti la fisica si disincronizza e la rovina.
Quando la latenza della rete è buona, sotto 100 ms i risultati sono abbastanza buoni, ho un gioco giocabile liscio sul lato client e il comportamento strano è minimo. Il problema si verifica quando il ritardo è compreso tra 150 e 200 ms. In quel caso, succede che il mio disco client ha già colpito un bordo e una direzione invertita ma riceve un messaggio di ritardo dal server e si arresta un po 'causando una strana sensazione al comportamento della palla.
Ho letto alcune cose a riguardo:
Fai clic su Esempio di sincronizzazione
Quindi, come posso risolvere questo? Per quanto ho letto l'opzione migliore che ho è quella di fare una sincronizzazione dell'orologio sul server / client con un timestamp in modo che quando ricevo messaggi di ritardo relativi al mio orologio, ignoro solo allora e lascio che la simulazione dei client faccia il lavoro. Siete d'accordo con questo? E poiché sto inviando dati inaffidabili (UDP), potrei ricevere messaggi ritardati o messaggi fuori servizio.
Se questo è l'approccio migliore, come posso implementare la sincronizzazione dell'orologio. Ho letto i passaggi su come farlo ma non l'ho capito del tutto.
Dice che:
- Il client stampa l'ora locale corrente su un pacchetto "richiesta ora" e lo invia al server.
- Alla ricezione da parte del server, il server indica l'ora e i resi del server
- Alla ricezione da parte del cliente, il cliente sottrae l'ora corrente dall'ora inviata e si divide per due per calcolare la latenza. Sottrae l'ora corrente dall'ora del server per determinare il delta temporale client-server e aggiunge la mezza latenza per ottenere il delta dell'orologio corretto. (Finora questo algothim è molto simile a SNTP)
- Il client ripete i passaggi da 1 a 3 per cinque o più volte, facendo una pausa di alcuni secondi ogni volta. Nel frattempo potrebbe essere consentito altro traffico, ma dovrebbe essere ridotto al minimo per ottenere i migliori risultati. I risultati delle entrate dei pacchetti vengono accumulati e ordinati nell'ordine di latenza minima a quello di latenza più elevata. La latenza mediana viene determinata selezionando il campione del punto medio da questo elenco ordinato.
- Tutti i campioni superiori a circa 1 deviazione standard dalla mediana vengono scartati e la media dei campioni rimanenti viene utilizzata con una media aritmetica.
Seguendo questo esempio vorrei questo:
Facciamo finta che il gioco sia caricato e il tempo del mio client sia 0 ora, quindi invio al server che il mio tempo è 0.
I messaggi impiegano 150 ms per arrivare al server ma l'orologio del server era già stato avviato ed è 1 secondo avanti rispetto al client. Quando il server riceve il messaggio, l'ora sarà: 1.15 e invierà l'ora al client, siamo a posto? Facciamo finta che il nostro ritardo sia costante a 150 ms.
Ora il client riceve l'ora 1.15 e sottrae l'ora corrente dall'ora inviata e si divide per due per calcolare la latenza. Quale è: 0,3 - 0 = 0,3 / 2 -> 150 ms.
Sottrae l'ora corrente dall'ora del server per determinare il delta dell'ora client-server e aggiunge la mezza latenza per ottenere il delta dell'orologio corretto:
Tempo del client: 0,3 Tempo del server 1,15
0,3 - 1,15 = .85 + latenza (.15) = 1
Come è sincronizzato? Cosa mi sto perdendo?
È la prima volta che faccio esperienza multiplayer e di rete, quindi sono un po 'confuso.
Grazie.