Se utilizzo un'architettura server / client (con uno dei giocatori che agiscono sia da server che da client) e uno dei client ha generato un gruppo di azioni, dovrebbe aggiungerli direttamente al gestore o inviare solo una richiesta al server, che a sua volta ordinerà ad ogni client di aggiungere quel gruppo?
Hai tre opzioni in questo caso, due delle quali hai già menzionato. La scelta dell'opzione scelta dipende da una varietà di fattori di cui solo tu puoi essere il migliore giudice:
1: il client genera un gruppo di azioni che le aggiunge direttamente e quindi le invia al server. Il server lo accetta senza alcun controllo
* I vantaggi di questo approccio sono che, per quanto riguarda il cliente, le sue azioni forniscono loro un feedback immediato indipendentemente dal ritardo della rete. Lo svantaggio è che i messaggi del client sono accettati dal server come un fatto (che potrebbero non essere) *
2: il client invia una richiesta al server, che a sua volta trasmette la richiesta a tutti, incluso il client che ha originato la richiesta.
I vantaggi di questo approccio sono che il server è ora in controllo di tutto ciò che accade nel gioco che allevia la maggior parte dei problemi con attività illegali (qui illegale può variare dal client che taglia un muro all'esecuzione di una mossa che ora è illegale perché il server ha più informazioni che il cliente non aveva quando il cliente ha fatto una mossa particolare)
3: il client genera un gruppo di azioni, le aggiunge direttamente e quindi le invia al server. Il server elabora la richiesta, esegue i propri controlli sulle azioni per assicurarsi che non siano illegali e quindi trasmette il passaggio a tutti i giocatori incluso il client.
Questo prende il meglio di 1 e 2 al costo di requisiti di larghezza di banda leggermente più elevati. I vantaggi sono il feedback immediato al client per le proprie mosse e se le mosse effettuate dal client sono illegali, il server intraprende le azioni appropriate (corregge forzatamente il client).
Che dire delle perdite di pacchetti e simili? Il gioco è deterministico, ma sto pensando che qualsiasi discrepanza nella sequenza di azioni eseguite in un cliente potrebbe portare a stati incoerenti del mondo. Come posso proteggermi da questo tipo di problema?
La perdita di pacchetti e il ritardo estremo sono un problema difficile da risolvere . Soluzioni diverse (nessuna perfetta) vengono utilizzate per affrontare il problema a seconda del tipo di gioco (ad es. Calcoli morti). Presumo che il tuo gioco non debba sincronizzare la fisica.
Una delle prime cose che dovresti fare è timbrare tutte le tue mosse. Il tuo sistema dovrebbe quindi tenerne conto e giocare le mosse di conseguenza (forse il server ha questa responsabilità e quindi negare le mosse illegali). Quando si implementa questo sistema, assumere 0 latenza (test in locale).
Ovviamente la latenza 0 non è una buona ipotesi, anche sulle reti locali, quindi ora che tutte le mosse rispettano il tempo, a che ora ti fidi? È qui che entra in gioco il problema della sincronizzazione temporale. Molti articoli / documenti online ti guideranno nella risoluzione di questo problema.
Che cosa succede se aggiungo troppe azioni contemporaneamente, ciò non causerà problemi alla connessione? Qualche modo per alleviarlo?
Prima le cose ovvie. Non inviare mai stringhe o oggetti serializzati. Non inviare messaggi velocemente mentre il gioco stesso si sta aggiornando. Mandali a pezzi (ad es. 10 volte al secondo). Si verificherà un errore (in particolare un errore di arrotondamento) per cui il server / client dovrà correggere gli errori di tanto in tanto (quindi ogni secondo, il server invia tutto [tutto = tutti i dati importanti per mantenere le cose nel gioco corrette state] a cui il client esegue quindi lo snap e / o prende in considerazione per correggere il suo stato).EDIT: Uno dei miei colleghi ha affermato che se si utilizza UDP [che si dovrebbe, se si dispone di molti dati], non esiste un ordinamento di rete. L'invio di più di 10 pacchetti al secondo aumenta le modifiche dei pacchetti che arrivano fuori servizio. Vedrò se posso citare quell'affermazione. Per quanto riguarda i pacchetti fuori servizio, è possibile scartarli o aggiungerli al messaggio del sistema / spostare la coda che è progettata per gestire le modifiche in passato per correggere lo stato attuale
Dovresti avere un sistema di messaggistica che si basa su qualcosa che occupa pochissimo spazio. Se devi inviare qualcosa che può avere solo due valori, invia solo un bit. Se sai che puoi avere solo 256 mosse, quindi invia un carattere senza segno. Esistono vari trucchi per modificare i messaggi nel modo più stretto possibile.
Molto probabilmente il tuo sistema di messaggistica utilizzerà molte enumerazioni per permetterti di estrarre facilmente le mosse da un messaggio in arrivo (suggerirei di dare un'occhiata a RakNet e agli esempi in essa se non capisci cosa intendo qui).
Sono sicuro che sai già che non puoi risolvere i problemi che sorgono con alta latenza e perdita di pacchetti, ma puoi renderne gli effetti meno pronunciati. In bocca al lupo!
EDIT: il commento di Patrick Hughes sopra con il link rende questa risposta incompleta e specifica nella migliore delle ipotesi. Consiglio vivamente di leggere gli argomenti collegati invece