I've been reading through a couple open source game projects: RakNet, Cube, and The Mana World.
These projects use different methods to synchronize the game state, but I feel like all of them are subpar.
Here's my very rough summary of each (these may be a little off because the projects' sources are not made to be readable)
* RakNet uses delta compressed reliable packets in its ReplicaManager3 to synchronize variables (uses UDP instead of TCP... why?)
* Cube seems to use reliable packets for everything except movement (positions of every movable object sent every tick in an unreliable packet)
* The Mana World also uses reliable packets similar to RakNet (though they switched to ENet from their working TCP implementation... why?)
In this article, the snapshot system of Quake 3 is described.
I really like the idea of delta compression with unreliable packets, but storing snapshots per-client makes scaling up a pain on RAM.
Instead, I currently have the server storing the last one second of positions from each tick.
The server rewinds to the last tick the client recognized in an ACK and generates a delta snapshot from that state to the current.
This is convenient because I plan on implementing lag compensation later anyways (which requires storing the last one second).
However, I feel like I've not gotten a thorough idea of all the various game state synchronization techniques,
and finding more articles on the subject is fairly difficult for me. What are some other ways fast-paced games synchronize the world?
Edit: About the UDP instead of TCP stuff - I'm under the impression that, if one is going to use only reliable packets on a single stream, TCP is much more optimized.