An Aether Engine multiplexer (muxer) is an intermediary executable handling network communication between simulation workers and clients.
The main objectives of the muxer design are: to support a globally distributed simulation with low latency and reduce the bandwidth usage for each client.
Globally Distributed Simulation
Aether Engine has adopted a design which leverages connections between data centres around the world to provide lower, more predictable latency.
While simulation worker nodes are hosted in a single data centre, muxer nodes are deployed to the edge data centres, so that each client has access to a muxer instance in their region. As such, only the connections between clients and muxers go through the public internet, while connections between clients and workers can use direct inter data centre connections which have greater bandwidth and lower latency.
Reducing the Bandwidth Usage of Each Client
Depending on the specific simulation, the muxer process can use a variety of techniques to reduce the bandwidth usage of each client:
- Implementing interest management (also known as net relevancy) ensure that only important information is sent to a given client. For example, clients may only be interested in frequent updates about other game objects in close proximity while infrequent updates may be acceptable for distant ones.
- Limiting the data visible by given players. For example ensuring a player doesn’t receive the private data of other players.
Implementing a muxer is done by linking to the muxer library provided with the Aether Engine SDK (
libmuxer.a) and implementing the Netcode interface. Aether Engine SDK provides a generic implementation of this interface, called the Generic Netcode, which supports distance-based interest management for reducing bandwidth and parameterisable by entity type.
The muxer logs are aggregated with the rest of the logs from the simulation and are accessible via the Aether Engine CLI.