... world.1
For large scale Role Playing Games, multiple servers are sometimes present; however, each handles a disjoint portion of the game world or simulates parallel, disjoint universes. Hence, the system is basically equivalent to multiple client-server systems.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
...delta-encoding.2
A third mechanism sometimes used to limit bandwidth costs is prioritized rate-limiting by dropping ``less imporant'' object updates. Since this mechanism can be used to limit bandwidth arbitrarily (with a corresponding loss in fidelity), we do not discuss it further.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... bottleneck3
The bot AI code consumed significantly less cycles as compared to the filtering code, and is not a bottleneck in these experiments.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... manner.4
In our implementation we use a simple last-writer-wins protocol and have observed that this loose synchronization is sufficient for even a fast-pace game like Quake II.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... store.5
In practice, our implementation also provides adaptor interfaces to support existing object store implementations, such as that of Quake II. Indeed, we only really had to interact with the original Quake II code during object construction, deletion, and one spot in the original game loop, though we made optimizations to other parts of the code as well.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... tunable6
Mercury allows for faster routing if more long-links are maintained.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... replicated).7
Another option would be to fetch pointers lazily only when they are deferenced by the application. We may add this feature in the future.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... maintained, 8
We note that this goal may be in conflict with fault tolerance since we essentially eliminate backups, but the issues can be handled in an orthogonal manner (e.g., just ensure there is always at least one replica).
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... cases9
First, some visual and audio effects generated by think-code in Quake 2 such as explosions are unreliably multicast to all clients in a visible area; since these events do not actually modify object state, in our distributed implementation the events were only send to clients on the node that executed the think-code (i.e., the node that had the primary). To overcome this, we also broadcast such events to nodes maintaining replicas of the object which generated the event so that clients on those nodes will also ``see'' the effects as well. Second, to simply our serialization code, we disabled ``dead bodies'' and ``gibs'' (since they were were created by mutating existing objects rather than constructing new ones, it was difficult for our serialization code to determine when such an object was ``new''). We also note that we have only implemented functionality for all player, missile, and item objects and have not yet implemented functionality for some game objects like moving platforms, though we do not believe it would be a significant challenge to do so.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... bots10
We used the AceBot bot, written by a third party.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.