2011-11-30 6 views
12

Cerco di trovare il metodo migliore per farlo, considerando un gioco cross-plateform su cellulare (larghezza di banda 3G) con proiettili e blocchi che cadono.Come sincronizzare la fisica in una partita multiplayer?

Mi chiedo se un dispositivo (il turno corrente giocatore = ruolo server) può eseguire la fisica e inviare alcuni dati "frame chiave" (posizione, orientamento dei blocchi) all'altro dispositivo, che si limitano a interpolare dallo stato corrente a i "keyframes" ricevuti. Con questo metodo sono abbastanza spaventato dall'enorme quantità di dati per garantire la stessa visibilità sul dispositivo dell'altro giocatore.

Un altro metodo dovrebbe essere quello di inviare i dati fisici (forza, accelerazione ...) ed eseguire la fisica anche sull'altro dispositivo, ma ho paura di non avere mai lo stesso risultato.

+0

Gli oggetti non hanno lo stesso risultato esatto su entrambi i dispositivi se gli oggetti hanno la stessa posizione di partenza e gli stessi dati di phyisics applicati? – Kjetil

+0

@Kjetil solo se si ha un tempo di tick fisso. Questo generalmente non sarà il caso se aggiorni la fisica su ogni frame grafico. –

+0

Giusto Rob. Non sono sicuro, ma i problemi dovrebbero venire considerando il cross-platform (diverse architetture) e il calcolo in virgola mobile, no? –

risposta

9

mio attuale implementazione funziona così:

  1. Server gestisce la simulazione fisica
  2. Su ogni grande collisione di qualsiasi oggetto, posizione, rotazione e la velocità/accelerazione/forze assolute degli oggetti vengono inviati a ogni cliente .
  3. Il client imposta ciascun oggetto nella posizione insieme alla sua velocità e applica le forze necessarie.
  4. Il client calcola la latenza e fa avanzare il sistema fisico per compensare il tempo di ritardo di tale importo.

Questo, per me, funziona abbastanza bene. Ho il sistema fisico in esecuzione su dozzine di sottosistemi (mappe).

Alcune cose chiave circa la mia realizzazione:

ignorano completamente qualsiasi oggetto che non è contrassegnata come "necessario". Per esempio, particelle di polvere e sporcizia che rispondono al movimento del giocatore o all'erba e all'acqua mentre risponde al movimento del giocatore. In sostanza roba non essenziale.

Tutto questo viene inviato tramite UDP a proposito. Questo sarebbe orrendo su TCP.

6

Si desidera inviare posizioni e rotazioni assolute.

Hai ragione, che se invii solo forze, non funzionerà. È possibile farlo funzionare, ma è molto più difficile del semplice invio di posizioni. È necessario che entrambi i dispositivi eseguano i calcoli allo stesso modo, quindi prima di ogni frame è necessario attendere l'input dall'altro dispositivo, è necessario utilizzare lo stesso intervallo temporale, gli script devono essere eseguiti nello stesso ordine o essere commutativi e puoi utilizzare solo le istruzioni della CPU che garantiscono lo stesso risultato su entrambe le macchine.

l'ultimo è uno che lo rende particolarmente problematico, perché significa che non è possibile utilizzare numeri in virgola mobile (float/singoli o doppi). è necessario utilizzare numeri interi o eseguire il rollover del proprio formato numerico, in modo da non poter trarre vantaggio da molti strumenti esistenti.

Molti giochi utilizzano un modello client-server con previsione lato client. se il tuo gioco è a turni, potresti essere in grado di farla franca senza usare la previsione lato client. al contrario, potresti avere il client in ritardo di un po 'di tempo, in modo che tu possa essere abbastanza sicuro che l'input del server sarà già presente quando andrai a renderizzare. la previsione lato client è importante solo se il client può apportare modifiche a cui il server si preoccupa (come lo spostamento).

+0

Aspettando input per ogni frame, immagino tu intenda ogni frame della fisica? – RobotRock

+0

Intendo ogni frame di input, che potrebbe essere 1-a-1 con i frame fisici, oppure no. sarebbe più semplice avere frame di input e frame fisici da 1 a 1, ma è possibile aggiornare la fisica due volte ogni volta che si campiona l'input, se lo si desidera. – notallama

Problemi correlati