Voglio creare un semplice gioco multiplayer client-server in tempo reale come progetto per la mia classe di networking.
Ho letto molto sui modelli di rete multiplayer in tempo reale e capisco le relazioni tra il client e il server e le tecniche di compensazione del ritardo.
Quello che voglio fare è qualcosa di simile al modello di rete di Quake 3: in sostanza, il server memorizza un'istantanea dell'intero stato del gioco; alla ricezione di input dai client, il server crea una nuova istantanea che riflette le modifiche. Quindi, calcola le differenze tra la nuova istantanea e l'ultima e le invia ai client, in modo che possano essere sincronizzate.
Questo approccio mi sembra molto solido: se il client e il server hanno una connessione stabile, verrà inviata solo la minima quantità necessaria di dati per mantenerli sincronizzati. Se il client non è sincronizzato, è possibile richiedere anche un'istantanea completa.
Tuttavia, non riesco a trovare un buon modo per implementare il sistema di istantanee. Trovo davvero difficile abbandonare l'architettura di programmazione per giocatore singolo e pensare a come memorizzare lo stato del gioco in modo tale che:
- Tutti i dati sono separati dalla logica
- Le differenze possono essere calcolate tra un'istantanea degli stati del gioco
- Le entità di gioco possono ancora essere facilmente manipolate tramite codice
Come viene implementata una classe di istantanee ? Come vengono archiviate le entità e i loro dati? Ogni entità client ha un ID che corrisponde a un ID sul server?
Come vengono calcolate le differenze di snapshot?
In generale: come verrebbe implementato un sistema di snapshot dello stato di gioco?