Skip to content
Paul Speed edited this page Aug 20, 2016 · 7 revisions

SimEthereal uses fast and small UDP messaging to share object state between clients and the server. It operates in an "authoritative server" environment and only the deltas of a "known good state" are sent so that redundant information can be eliminated.
The "known good state" is synchronized through a sort of transient reliable protocol that uses a double-ack approach so that messages are always valid.

Each message packs as much state in as possible to try to fit under standard MTU sizes to keep the UDP packets from being split. As such, it's possible, in the worst case, to fit more than 80 object updates in a single 1500 byte message.

Main goals:

  • Fast: optimize for message latency and keep overhead low
  • Low bandwidth: pack as much state as possible into a single message
  • Easy to plugin to jMonkeyEngine applications: uses the JME network service model
  • Flexible: provide state syncing without dictating where the state comes from or how it will be used.

Architecture

Overview Diagram

The EtherealHost is a standard SpiderMonkey HostedService and is the main server-side component for SimEthereal. It internally manages the shared object spaces for each client.
It contains a ZoneManager that divides space into zones to provide view limits for each client.

The game server code can manage its own objects in whatever way is sees fit and then simply notify the ZoneManager about the changes. The EtherealHost and its contained components will then make sure each client gets the UDP state updates they require.

The EtherealClient is a standard SpiderMonkey ClientService and is the main client-side component for SimEthereal. It receives the updates over the network and applies them to its local view of the SharedObjectSpace.

The game client code can add a SharedObjectListener to the EtherealClient to recieve events about object updates.

For more detailed information on each of these parts, see the Component Documentation.