{"id":317,"date":"2022-10-20T01:40:11","date_gmt":"2022-10-20T01:40:11","guid":{"rendered":"https:\/\/merserver.com\/?p=317"},"modified":"2022-10-20T01:40:11","modified_gmt":"2022-10-20T01:40:11","slug":"the-doom-iii-network-architecture","status":"publish","type":"post","link":"http:\/\/merserver.com\/index.php\/2022\/10\/20\/the-doom-iii-network-architecture\/","title":{"rendered":"The DOOM III Network Architecture"},"content":{"rendered":"\n<p>To immerse a player into a highly interactive game environment with fast-paced<br>action, a computer game must deliver a consistent and responsive experience.<br>However, this may be difficult to realize when a computer game is played over a<br>network connection because network environments introduce various constraints<br>such as an always limited amount of bandwidth that can be used to share<br>information, and a delay before information arrives at its destination, also known<br>as latency or lag. Any network architecture for a computer game implements a<br>trade between: consistency, responsiveness, bandwidth and latency requirements.<br>Finding the right balance depends on the type of computer game and the network<br>environment. This paper presents the network architecture implemented for the<br>first person shooter DOOM III. This architecture improves upon previous network<br>architectures used in the computer games Quake, Quake II, and Quake III Arena.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Introduction<br>A First Person Shooter (FPS) is a game where the player moves through a real-time virtual<br>environment, while looking at this environment from a first person perspective. The player looks<br>through the eyes of the avatar controlled by the player. All the player can see of the avatar, are<br>his hands and\/or the weapon which he holds. In a first person shooter the most important tasks<br>are staying alive and eliminating virtual opponents with a variety of weapons. First person<br>shooters are highly interactive and typically fast-paced, emphasizing speed and accuracy. A good<br>first person shooter is designed to immerse the player in the action.<br>Multiplayer gaming is about shared reality. Multiple players share experiences in a virtual<br>environment, and although looking from different viewpoints, everyone sees the same changes<br>and events take place within this virtual environment. Each player has his or her own computer<br>and these computers are hooked up to each other through a local network or the Internet. The<br>network is used to share information such that all players experience the same virtual<br>environment.<br>2<br>To immerse a player into a highly interactive multiplayer game environment with fast-paced<br>action, the game must deliver a consistent and responsive experience. It is very important that the<br>players receive direct and immediate feedback to their actions. It is also important that all the<br>players see events take place in the same way other players witness those events. However,<br>network environments introduce constraints that make it difficult to realize a consistent and<br>responsive game environment. First of all there is always a limited amount of bandwidth<br>available and only so much information can be sent over the network. Furthermore, information<br>sent over a network does not immediately arrive at the receiver. It takes time between one<br>computer sending information and another computer receiving the information. This is also<br>known as latency and in multiplayer games often referred to as lag [10]. Although the available<br>bandwidth of Internet connections has significantly improved over the years, latencies have not<br>improved as much. Even when fast glass fiber connections are used, a relatively large latency<br>cannot be avoided if people located in different parts of the world want to play with each other.<br>In multiplayer games there will always be individuals that feel the need to overcome lack of skill<br>with ingenuity, by exploiting bugs or holes in a network architecture, or by implementing various<br>cheats. When designing a network architecture it is important to consider the cheats to which the<br>system may be vulnerable. Another important issue is security [27, 28, 29]. Individuals may try<br>to take down servers or otherwise disrupt games. Perhaps even worse, individuals may try to use<br>the game as a tool to attack computers on a network or the Internet. A robust network<br>architecture can withstand attacks and abuse. Last but not least portability may play a role in the<br>design of a network architecture. Some network models are better suited for cross platform<br>multiplayer gaming than others.<br>The game state in a first person shooter is typically modeled as a list of game objects or entities.<br>Players, enemies, projectiles, doors etc. are all entities in the game. Instead of treating all of these<br>differently, as special purpose elements, it is convenient to bind them together into a system that<br>provides a common structure and common methods of communication. Class hierarchies and<br>functional components are typically used to model the different entities [5]. Networking in first<br>person shooters is all about synchronizing the state of multiple copies of the same game entities<br>such that all players experience the same changes and events in the virtual environment. Some<br>network models require all players to manage and maintain their own copy of all game entities<br>where the same rules and methods are used to advance the state of these objects synchronously.<br>Other network models continuously communicate changes to the state of entities over the<br>network.<br>1.1 Previous Work<br>Peer-to-Peer<br>The networking engine in the original DOOM (1994) is a peer-to-peer system. Each player in the<br>game is an independent &#8220;peer&#8221; running its own copy of the game. This peer-to-peer system can<br>also be considered a synchronous networking system. All players run their own copy of the game<br>synchronously. Periodically (every 1\/35th of a second), the input from a player (from keyboard,<br>mouse, etc.) is sampled and placed into a tick command. This is a simple structure which stores<br>how the player wishes to move: there are fields for forward\/backward movement, sideways<br>3<br>movement (strafing), turning, and actions such as &#8220;use&#8221; and &#8220;fire&#8221;. The tick command is<br>transmitted to all other players in the game. The networking engine periodically checks for<br>newly received packets. Tick commands from other players are stored in a buffer. When tick<br>commands from all players have been received, the game advances. The game advances<br>independently from generating tick commands such that a player may generate commands to be<br>used several ticks into the future, even though the game has not yet advanced to that point. As a<br>result the game itself will not slow down, but there may be a delay between pressing a key, and<br>the desired action occurring. The delay depends on the latency between players and the<br>playability of the game is dependent on the player with the slowest connection.<br>Fig. 1. Peer-to-Peer network with four players.<br>The advantage of synchronous networking is the simplicity of the system. The system is easy to<br>implement and only simple small messages are sent around to other players. However, there are<br>also several disadvantages.<br>All players have to maintain a perfectly synchronized copy of the game. If inconsistencies occur<br>between the copies of the game the players will start to play their own &#8220;version&#8221; of the game<br>which is no longer the same as the &#8220;version&#8221; of other players. In a complex game engine there<br>are many places where inconsistencies can be introduced. Even a single bit difference in a<br>floating-point number can escalate into huge changes in the game environment. To avoid<br>inconsistencies the game state must be maintained without relying on any frame rate or computer<br>hardware dependent input. For instance, the game state may be modified by introducing objects<br>that move and shake based on the volume of sounds in the environment. Inconsistencies can<br>easily be introduced if the sound volume in any way depends on a specific sound card or a<br>different sampling rate based on the speed of the computer. Reading back data from the graphics<br>card, for instance for hit detection, may also introduce inconsistencies because different players<br>may use different graphics cards that produce different results. Inconsistencies can also be<br>introduced by different drivers being used on various computers. A driver may for instance<br>change the floating-point rounding mode of the floating-point unit (FPU) during game play<br>which causes different results to be calculated on computers with different drivers. Uninitialized<br>variables in the game code can also introduce inconsistencies. Such uninitialized variables<br>should really be considered code bugs but during development they may occur frequently and as<br>a result the networking may break as frequently.<br>In a complex game engine the cause for a specific inconsistency is typically hard to find because<br>the time between the introduction of the inconsistency and the results being noticeable during<br>4<br>game play may be relatively long. If a single bit ends up being different between two copies of<br>the game it may take some time before this difference escalates into a noticeable but significant<br>difference to the players.<br>A synchronous network system is also not cross platform compatible. Players on different<br>platforms will not be able to play with each other. On different hardware different assembler<br>instructions may be used that produce (slightly) different results. Any such differences may<br>introduce inconsistencies. Even if the underlying hardware is the same, for instance when using a<br>combination of Microsoft Windows and Linux systems on x86 based hardware, inconsistencies<br>may be introduced. Different compilers are typically used on different platforms and floatingpoint assembler instructions may be rearranged differently during optimization. Different<br>floating-point instruction sequences usually produce results with different rounding, and such<br>differences can also easily introduce inconsistencies.<br>Another problem with a synchronous network system is that the responsiveness and playability<br>degrade quickly as the network latency of players increases. There is a full ping time (roundtrip<br>latency) between sampling the player input and processing the input in the game. As a result the<br>player only sees a change on screen a full ping time after issuing a command or pressing a key.<br>On a Local Area Network (LAN) this is not a problem because ping times are usually below 10<br>milliseconds. However, on the Internet ping times can easily go up to 100 milliseconds or more.<br>The responsiveness of the game is not good when there is 1\/10th of a second between sampling<br>input and visualizing a response on screen. On the Internet the ping times may also fluctuate or<br>there may be congestion and sudden stalls that further degrade the playability because the game<br>will stall as well.<br>In a game like DOOM III the game is updated at a fixed 60 Hz tick. Each player samples input at<br>this rate and in a peer-to-peer system tick commands would be sent to all other players. Even<br>though the tick commands result in rather small network messages, in a game with just four<br>players the amount of traffic being generated already exceeds the bandwidth available on a 56k6<br>modem. Furthermore, the bandwidth requirements increase exponentially with the number of<br>players in the game.<br>In a synchronous network system each player maintains a copy of the game and only tick<br>commands are sent over the network. Therefore all players have to start the game together at the<br>same time to be able to maintain a consistent copy of the game. New players cannot come and go<br>as they please. This forces the development of additional functionality for match making or a<br>lobby system [4], because players cannot simply search for an existing game and join at will.<br>Last but not least a synchronous network system creates opportunities for various cheats. A<br>player cannot modify the game state directly because that would introduce inconsistencies.<br>However, each player maintains a complete copy of the game and can use all kinds of<br>visualization cheats to look at things the player is not supposed to see.<br>5<br>Packet Server<br>The peer-to-peer network model can be extended with a packet server. This model is basically<br>the same as peer-to-peer model but with elements of a client-server architecture. Like the peerto-peer model each player individually keeps track of the game state. However, each player no<br>longer has a connection to all other players like in the original DOOM. In this model there is a<br>&#8216;packet server&#8217; running on the computer of one of the players. Everyone has one connection to<br>this packet server. Tick commands are first sent to this server and the server relays all tick<br>commands to other players. If one of the players has a high latency connection, only that player<br>will experience a less responsive game, and the packet server will continue to send (possible<br>duplicated) tick commands for that player to the other players. Using this model the players no<br>longer need a low latency connection to all other players. The down-side of using a &#8216;packet<br>server&#8217; is that the game cannot continue if the player that runs the &#8216;packet server&#8217; leaves the game.<br>This network model does, however, solves some of the problems of the peer-to-peer network<br>model but many of the other problems, as described above, remain.<br>Client-Server<br>The games Quake (1996), Quake II (1997) and Quake III Arena (1999) implement a so called<br>client-server network architecture. In this model one computer is a &#8220;server&#8221; and is responsible for<br>making all game play decisions. The other computers are &#8220;clients&#8221; and they are similar to dumb<br>rendering terminals. A client sends input such as keystrokes and view angles to the server, and<br>the client receives a list with entities to render. This network model does not suffer from desynchronized network games, that could occur from clients disagreeing with each other, because<br>the server is always the final authority. Players are also able to join and leave a game at any time<br>because the players do not need to maintain the full game state. The server sends the list with<br>entities to render as a sequence of game state updates also known as snapshots. Uncompressed,<br>these updates can be quite large and require a lot of bandwidth. To reduce the bandwidth<br>requirements the snapshots are delta compressed from the last acknowledged snapshot the client<br>received. Furthermore, the updates are sent infrequently, typically at a rate between 10 and 20<br>Hz. However, for full interaction a higher frame rate is required at the client. To present a<br>smoothly changing, interactive environment, the client interpolates between, or extrapolates from<br>the last two snapshots.<br>Without special measures this network model would face the same problem as the peer-to-peer<br>model described above when it comes down to the responsiveness and playability degrading as<br>the network latency of players increases. The client sends input to the server where this input is<br>processed, and the client only receives a response with the next snapshot from the server. In<br>other words, using this network model there would also be at least a full ping time between<br>sampling the input and seeing the results on screen at the client. To overcome this problem,<br>client side prediction of the player movement is used. The input is not only sent to the server, but<br>is also processed immediately at the client to move the view point and as such improve the<br>perceived responsiveness. However, the rest of the environment visualized at the client is still the<br>results of an interpolation between, or extrapolation from the last two snapshots. In other words,<br>the player moves in the (predicted) present and what the player sees on screen is from the past.<br>6<br>Fig. 2. Client-Server network with four players.<br>The client-server network model can also be considered an asynchronous network architecture.<br>The upstream and downstream communication at the client and server is different. Furthermore,<br>the player movement at the client is simulated in the present, while the game state maintained at<br>the server is in the past, and the state of the environment visualized at the client is from even<br>further back in the past. The network model used in the Quake series of games is very effective<br>and has been used in many games since. This network architecture is much better suited for<br>playing fast-paced first person shooters over the Internet than the peer-to-peer network model.<br>There are, however, still several problems.<br>While the client-server network model allows players to join a game in progress, the game<br>cannot automatically continue if the server runs on the computer of one of the payers and that<br>player decides to leave the game. One solution is to use dedicated servers that never shut down<br>(except for computer failures). However, if dedicated servers are not available it may be<br>necessary to implement server migration to allow the game to continue even if the player that<br>runs the server decides to leave the game.<br>With the client side prediction the player moves in the present while what the player sees on<br>screen is from the past. As a result the player may be shooting at an opponent which is visualized<br>at a position where the opponent was some time ago. However, the hit detection is performed at<br>the server in the future. In other words the player has to predict where any targets will be some<br>time in the future and has to lead such targets in order to hit them in the future. Even if a player<br>has to predict only a 100 milliseconds ahead this can be tricky and requires some practice.<br>Some games, like Half-Life, try to alleviate this problem by implementing so called &#8220;lag<br>compensation&#8221; [11]. The idea is to let a player shoot at opponents that are visualized at positions<br>from the past and when the server does the hit detection it will go back in time to verify whether<br>or not a target was hit in the past. For this purpose the server has to keep track of a history of past<br>positions of all possible opponents. This technique does not only add considerable complexity, it<br>also has several unwanted side effects. A player with a fast (low latency) connection will<br>frequently experience inconsistencies. For example, the player may get shot after the player has<br>moved safely around a corner. The worse the connection quality of the other players, the more<br>often this will happen. In other words a player is no longer in control of the quality of his own<br>game experience.<br>7<br>Lag compensation is also inherently flawed because it can cause events to happen that do not<br>reflect the shared reality. For instance, take two players, one with a very low ping time and one<br>with a high ping time. The players are circling around a tree, such that the tree always blocks the<br>line of fire from the perspective of the player with the low ping. The player with a high ping<br>moves in the present while looking at an opponent at a position from relatively far back in the<br>past. From the perspective of this player the tree does not block the line of fire. With lag<br>compensation the player with the high ping can now shoot and hit the player with the low ping<br>because the server does hit detection with opponents positioned in the past while keeping the<br>position of the player in the present. Obviously in this example the player with the low ping can<br>be shot which from the perspective of that player should not be possible. In this particular<br>example the problem can be alleviated by not only performing hit detection at the server using<br>the position of an opponent in the past, but also checking for a clear line of sight with the<br>opponent in the present. A hit is then only recorded when the opponent is hit in the past, and<br>there is also a clear line of sight in the present. Although the additional line of sight test may<br>make it less likely for players to notice inconsistencies in some situations, it by no means solves<br>the problem in that inconsistencies may still occur in other situations.<br>Even if lag compensation is considered better than the alternative, it only addresses part of the<br>problem. It is not practical for the server to roll back everything in time. So even if the positions<br>of opponents are rolled back in time for hit detection, all other interaction at the client is between<br>a player that moves in the present and an environment that is from the past, while the server<br>verifies all other interaction in the future.<br>In Quake III Arena the game code (which runs at the server) and the visualization and prediction<br>code (which runs at the client) are separate modules. These modules are often referred to as the<br>&#8220;game code&#8221; and &#8220;client game code&#8221;. Although these modules are separate, each must be fully<br>aware of the implementation of the other in order to keep the representation of the game<br>reasonably synchronized. Such a strong coupling between separate modules is undesirable<br>because it makes extending the game difficult. This separation, yet strong coupling also makes it<br>harder for developers that want to use the Quake III Arena engine to implement a single player<br>experience. Several times developers have released two executables. One executable for<br>multiplayer which is based on the original Quake III Arena source code with the separation<br>between the modules. Another executable provides the single player experience and bypasses the<br>separation which makes it easier to directly visualize things from the game code.<br>To present a smoothly changing environment the Quake III Arena client interpolates between, or<br>extrapolates from the last two snapshots. Such extrapolation can produce unrealistic results<br>unless the physics and game rules are taken into account. For instance, extrapolation of<br>trajectories without collision detection can cause objects to move into or through other objects or<br>walls. Proper extrapolation introduces additional complexity and more code at the client that<br>needs to be in sync with the code that runs at the server.<br>In a complex game engine interpolation can be difficult because the state of an entity can be<br>complex and proper interpolation is often expensive or ill-defined. For instance, a skeletal<br>animation system may be used for animating characters, and arbitrary bone modifications may be<br>applied to achieve specific effects. First of all the complete skeleton would need to be sent over<br>8<br>the network for proper interpolation. Furthermore expensive spherical linear interpolation<br>between quaternions would be required to interpolate between the skeletons from the last two<br>snapshots.<br>In Quake III Arena a snapshot for a client only contains the state of those entities that are in the<br>Potentially Visible Set (PVS) [34] of the client. Furthermore, the entity states in a snapshot can<br>only be delta compressed relative to the entity states from a previous snapshot. As a result the<br>state of entities that continuously leave and enter the PVS cannot be delta compressed. Whenever<br>an entity enters the PVS, it&#8217;s state has to be sent in full with the next snapshot. In an environment<br>with a lot of entities that need to be synchronized over the network this can cause a lot of<br>bandwidth to be consumed.<br>Most network traffic in Quake III Arena is generated by sending unreliable messages. There is<br>typically no point in resending the same snapshots if they are dropped because the information<br>they contain becomes out of date very quickly. However, reliable messages can also be used in<br>Quake III Arena for specific, usually infrequent, updates. The only way to send reliable<br>messages in Quake III Arena is through the use of server commands. These server commands are<br>string based and inefficient. However, it can be very convenient to synchronize a small part of<br>the game state through reliable messages. Using string based server commands like in Quake III<br>Arena introduces considerable overhead.<br>To write entity states to snapshots, Quake III Arena uses a fixed entity state structure with fixed<br>data fields. The advantage is that all entities have the same structure and a single optimized<br>routine can be used for the delta compression. On the other hand different types of entities may<br>maintain rather different state variables and developers often ended up re-using entity state<br>structure fields for different purposes on different entities. In a game with many different entities<br>that maintain completely different state variables it quickly becomes impractical to use a fixed<br>entity state structure for all entities.<br>The DOOM III network architecture presented here is similar to the network model of Quake III<br>Arena but tries to address several of its problems.<br>1.2 Layout<br>Section 2 provides an overview of the DOOM III network architecture. Section 3 describes the<br>data communicated between the client and server. Section 4 describes all forms of compression<br>that are used to significantly reduce the amount of data that needs to be communicated over the<br>network. Section 5 shows some of the implementation details. The results are presented in<br>section 6 and several conclusions are drawn in section 7. Suggestions for future work are<br>presented in section 8.<br>9<\/li><li>Network Architecture<br>Just like Quake III Arena, the network architecture presented here is based on the client-server<br>model. The server writes snapshots of the game state and sends these to a client. A snapshot for a<br>client contains the compressed state of all entities that are currently in the Potentially Visible Set<br>(PVS) [34] of the client. Each client samples input (from keyboard, mouse etc.) and sends the<br>player&#8217;s intentions to the server. Figure 3 shows an overview of the client-server architecture.<br>Fig. 3. Overview of client-server architecture.<br>Except for player input everything in a first person shooter is deterministic. Even random<br>number generators are pseudo random and always produce the same sequence of &#8220;random&#8221;<br>numbers based on an initial value. Furthermore the DOOM III game state is always updated at a<br>fixed 60 frames per second independent from the speed of the computer. As such the engine<br>always produces the same results based on the same player input. It makes sense to use this<br>determinism to replicate information at the client. To present a smoothly changing environment<br>the Quake III Arena client interpolates between, or extrapolates from the last two snapshots, and<br>client side prediction of the player movement is used to improve the perceived responsiveness.<br>The system presented here uses prediction on all entities in the PVS of the client to both improve<br>the responsiveness and to present a smoothly changing environment. This includes prediction of<br>the player movement because the avatar controlled by the player is also an entity in the PVS of<br>the client.<br>The server progresses the game without waiting for input from players. The server duplicates old<br>player input if no new input has arrived in time to process the next game frame. The client tries<br>to make sure the server always has new input to advance the game state at the server. As such the<br>time at the client is ahead of the server time. The client runs just far enough ahead such that input<br>from the player can be processed immediately at the client and can be sent over the network to<br>the server where it arrives before the server needs to process the input to advance the game.<br>Figure 4 shows a timeline with the server time, the client time, and the time of snapshots that<br>arrive at the client.<br>10<br>Fig. 4. Client-server timeline.<br>Ping times may fluctuate on the Internet. For this reason a client does not just run far enough<br>ahead of the server such that input arrives in time at the server based on the current or average<br>latency. The client runs a little further ahead such that input arrives in time even if there is some<br>fluctuation in the latency of network messages sent to the server.<br>The client is able to run ahead of the server by using prediction to advance the state of entities.<br>The server sends snapshots to the client at a rate between 10 and 20 Hz. While no new snapshot<br>has arrived the client predicts the state of entities on a frame to frame basis. Upon receiving a<br>snapshot the client overwrites it&#8217;s entity states with the entity states from the snapshot. A<br>snapshot the client receives is from at least a full ping time in the past relative to the current time<br>at the client. As a result the client temporarily moves back in time when it processes the<br>snapshot. The client then has to quickly re-predict ahead from this state up to the current client<br>time, from where the client can continue the prediction on a frame to frame basis. Figure 5 shows<br>the prediction at the client.<br>Fig. 5. Prediction at the client with a snapshot rate at 20Hz and a ping of around 80 milliseconds.<br>11<br>As stated above everything in a first person shooter is deterministic except for player input.<br>Fortunately the player movement as a result of the input is predictable to a degree. The game<br>advances at a fixed 60 frames per second and input is sampled at the same frequency. Players<br>typically do not tap keys 60 times per second and do not change their movement direction every<br>frame. As a result using the same input for several game frames is usually not too far off from<br>what really happened. Furthermore the server sends the most recent input from other players<br>with snapshots. This input from other players is used by a client to accurately predict other<br>players. The input is processed by a client in the same way the server does, and the same player<br>physics is used to move the predicted players through the virtual environment.<br>Unlike Quake III Arena there is no time difference between what the player sees on screen and<br>the player movement through the environment. Therefore the player does not need to lead targets<br>because the system does the prediction for the player. The server sends the most recent input<br>from other players with snapshots and the same game code (including physics) is used at both the<br>client and the server to move players through the environment. Therefore the system can<br>typically do better prediction of other players than the player is able to do by leading targets. The<br>Quake III Arena bots show that computer algorithms can be fairly good at predicting player<br>movement. Even when using weapons that fire slow moving projectiles the bots at a higher skill<br>level show exceptional accuracy when aiming. The bots in Quake III Arena use an<br>approximation of the player physics with collision detection to predict where players will be<br>some time in the future.<br>General prediction of all entities in the client PVS works well because the same game code and<br>algorithms (including physics) are used at both the server and the client to advance the state of<br>entities. This is also known as dead reckoning [9]. Unlike Quake III Arena, the game code,<br>which runs at the server, and the client visualization and prediction code are not in separate<br>modules. The same module is used both at the server to advance the state of entities, and is also<br>used at the client to visualize and predict the state of entities. The server runs the game code just<br>like in single player mode without modifications. The client runs the same game code to advance<br>the state of entities for prediction. Using a single module allows development of a single player<br>game or new features without being forced to make things work over a network.<br>12<\/li><li>Client-Server Communication<br>The User Datagram Protocol (UDP) [32] is used to send messages over a network or the Internet.<br>Because of the highly interactive and fast-paced nature of first person shooter games there is no<br>point in using a reliable protocol with guaranteed message delivery like the Transmission<br>Control Protocol (TCP) [33]. The server continuously sends the states of entities over the<br>network. Resending the same states when network messages are dropped is pointless because by<br>the time such messages do arrive (after resending them), the entity states they contain are already<br>out of date. With UDP, messages may arrive out-of-order with duplicates. Furthermore,<br>messages may not arrive at all but the content of messages that do arrive is never corrupted. To<br>deal with the characteristics of a network using UPD messages, the network architecture<br>presented here implements several layers on top of UDP as shown in figure 6.<br>Fig. 6. Network layers.<br>The message channel implements one connection, either from a client to the server or the other<br>way around, and provides functionality for sending both unreliable and reliable messages. These<br>messages are guaranteed to arrive in-order, without duplicates and their content is never<br>corrupted. However, the unreliable messages may be dropped while the reliable messages are<br>guaranteed to always arrive. Most data like snapshots and player input is sent over the network<br>with unreliable messages. Reliable messages are only used for certain acknowledgements and<br>small critical updates that need to be processed before any unreliable updates. The message<br>channel is designed to handle reliable messages that are very small compared to unreliable<br>messages. The presented network system produces a continuous stream of unreliable messages.<br>Snapshots are sent at 10 to 20 Hz from the server to the client, and player input is sent more<br>frequently from the client to the server. Because there is a continuous stream of unreliable traffic,<br>the reliable messages simply piggy back on unreliable messages. The message channel uses a<br>brute force approach to send reliable messages. Reliable messages are buffered and each reliable<br>message is sent with every unreliable message until the reliable message has been acknowledged<br>by the receiver. As such the message channel guarantees that a reliable message arrives before<br>the first next unreliable messages comes through.<br>This brute force approach to reliable messages works well. The client does not send reliable<br>messages frequently. When a reliable message is sent, the message is usually very small so the<br>13<br>brute force approach is not an issue there. Furthermore, the client sends unreliable messages at a<br>rate 3 to 4 times faster than the server sends unreliable messages. As such, there is no need for a<br>time-out on a reliable message from the server because if a reliable is not acknowledged by any<br>of the next couple of client messages, the message can be considered dropped and should be<br>resent anyway.<br>The message channel is &#8220;rate controlled&#8221; and can notify higher layers when the network<br>connection becomes satisfied and additional traffic would exceed the available bandwidth. The<br>message channel also breaks up large messages into packets if they would otherwise cause<br>fragmentation. Furthermore, the message channel keeps track of an unique identification for the<br>computer at the other end of the connection. The Internet Protocol (IP) port number cannot be<br>used as an unique identification because some routers may periodically change the IP port [6].<br>The message channel uses compression to reduce the size of all messages. Furthermore, the bit<br>message layer implements two forms of compression that are required to significantly reduce the<br>amount of data that needs to be communicated over the network. Before going into the details of<br>compression, the next section describes the data being sent over the network.<br>3.1 Unreliable Message Headers<br>Snapshots and player input are sent over the network with unreliable messages. All unreliable<br>messages from the server to the client and vice versa have a header. Figure 7 shows the header<br>for unreliable messages from the server to the client. Figure 8 shows the header for unreliable<br>messages from the client to the server.<br>Fig. 7. Unreliable messages header from<br>server.<br>Fig. 8. Unreliable messages header from<br>client.<br>The server uses an unique identification number for every game being played which usually<br>happens on a per map basis. This identification number is used to make sure the clients use the<br>right settings, and have the right map loaded for the current game. The server sends this game<br>identification number with every unreliable message. The server also sends the type of the<br>unreliable message.<br>The client also sends a header with every unreliable message. This header stores the sequence<br>number of the last received server messages and the game identification number. The server uses<br>the game identification number sent by the client to check whether or not the client is in the right<br>game. If the client is not in the right game the server sends an unreliable message to the client<br>with instructions on which map to load and additional settings. Unreliable messages are not<br>acknowledged, but the client sends the sequence number of the last received server messages to<br>14<br>allow the server to verify whether the client received the unreliable message with instructions to<br>load the right game. The client also sends an acknowledgement for the last received snapshot<br>with every unreliable message. This acknowledgement is used for the delta compression<br>described in section 4. Just like for unreliable messages from the server the client sends the type<br>of the unreliable messages.<br>3.2 Snapshots<br>The most important traffic from the server to the client is in the form of snapshots. Such<br>snapshots contain a collection of data but most importantly they communicate the states of<br>entities to a client. Figure 9 shows a snapshot and figure 10 shows how a snapshot goes through<br>the network layers.<br>Fig. 9. Snapshot Message. Fig. 10. Server to client snapshot pipeline.<br>Every snapshot message has a sequence number which allows the client to acknowledge the<br>snapshot for delta compression as described in section 4. Next the snapshot message stores the<br>game frame number and the game time when the snapshot was made. The snapshot also tells the<br>client how many user commands were duplicated since the last snapshot. If the client does not<br>predict far enough ahead and the client&#8217;s user commands do not arrive in time the server will<br>duplicate previous user commands. The client should avoid this. The number of duplicated user<br>commands is not used directly but can be displayed during development. The server also tells the<br>client how far ahead of time the user commands from the client arrive. This time should ideally<br>be close to zero, but always positive, and the client can adjust the prediction time accordingly.<br>The most important data in a snapshot is a set of delta compressed states of entities that are in the<br>PVS of the client. Unlike Quake III Arena there is no fixed entity state where structure fields<br>may need to be reused for different purposes on different entities. The network system presented<br>here uses a bit message to store an entity state. Entities can write any variables that need to be<br>synchronized to this state. It is even possible to change the structure of the state during game<br>play but this does decrease the performance of the delta compression.<br>15<br>Entities that did not change are not stored in the snapshot. However, the client still needs to<br>know which entities are considered in the PVS by the server. For this reason a bit string is stored<br>which tells which entities are considered in the PVS.<br>Aside from the entity states there is also one delta compressed state which is not tied to the PVS<br>and always stored in the snapshot. This state is used to communicate general game and player<br>state information. Furthermore a snapshot stores the most recent user commands from other<br>players that are in the PVS of the client. These user commands are used by the client to improve<br>the prediction of other players.<br>3.3 User Commands<br>The most important traffic from the client to the server is in the form of user commands. Such<br>user commands contain the intentions of the player. Figure 11 shows an user command message<br>and figure 12 shows how a user command message goes through the network layers.<br>Fig. 11. User Command Message. Fig. 12. Client to server user command pipeline.<br>With a user command message the client sends a time which represents how far the client<br>predicts ahead relative to the server. This time is not directly used by the server but can be<br>displayed at the server during development. A user command message may contain multiple user<br>commands. The message stores the game frame number of the first user command and the<br>number of user commands. The first user command is for the given frame number, the next for<br>the following frame etc. The message then stores the actual user commands. These user<br>commands are delta compressed in sequence. The second user command is delta compressed<br>relative to the first, the third relative to the second etc.<br>16<\/li><li>Compression<br>Snapshots only contain states of entities in the PVS of a client and snapshots are sent at a<br>frequency between 10 an 20 Hz. The snapshots still consume a lot of bandwidth without any<br>form of compression. Several forms of compression are required to significantly reduce the<br>amount of traffic.<br>4.1 Bit Packing<br>Bit packing is a form of compression where superfluous bits are removed from variables before<br>sending them over the network [3]. For instance, the health of a player may be stored in memory<br>as a 32-bit integer for computational efficiency. However, the health usually ranges from 0 to<br>100 and only 7 bits are required to store a health value. There is no need to send the remaining<br>25 bits over the network. By sending a health value over the network with just 7 bits no<br>information is lost while the amount traffic is reduced with more than 75%.<br>Variables can also be quantized to reduce the amount of traffic that is generated. For instance,<br>floating point values can be transmitted in a format which uses less bits by specifying the number<br>of bits used for the mantissa and exponent. In this case information is lost because the floating<br>point values are communicated in a format with less precision. However, for many variables the<br>reduced precision is not a problem. The positions of objects are sent over the network in full<br>precision because otherwise collisions may be missed during prediction. However, the velocities<br>of objects can usually be transmitted as 16-bit floats.<br>Angles in degrees are good candidates for quantization. The value of a floating point angle<br>ranges from 0 to 360 and the value is best represented with the same precision across the whole<br>range. As such an angle can be scaled to the range 0 to 65535 and reduced to a 16 bit integer.<br>When the value is unpacked it is scaled back to a floating point number in the range 0 to 360.<br>Sometimes it is also convenient to send an approximate direction over the network. For instance,<br>the initial direction for a particle effect does need to be communicated with full precision. A<br>normalized direction vector can usually be approximated with very few bits. For instance, just 3<br>bits for each coordinate axis.<br>4.2 Delta Compression<br>In a game like DOOM III there are many entities with many state variables in any given scene.<br>Bit packing alone is not enough to bring down the size of snapshots. All state variables can<br>change but typically only a subset of the variables changes over time. As such it makes sense to<br>only write state variable changes to snapshots. For this reason the network system presented here<br>uses delta compression. Bit packing is used before delta compression because only the changes<br>to the quantized variables need to be transmitted.<br>Two kinds of delta compression are supported. First of all variables can be delta compressed<br>relative to an initial or common value. If a variable has a specific value for most of its life time<br>the server and client can assume this value until it changes. Variables can also be delta<br>17<br>compressed relative to a previous value which is known to be replicated at the receiver. If the<br>sender knows the current value of a variable is already replicated at the receiver, the value does<br>not have to be transmitted again. The delta compression uses one bit to tell whether or not a<br>variable changed. If the value of a variable changed a single bit, set to 1, is written followed by<br>the bit packed variable value. If the value of a variable did not change only a single bit, set to 0,<br>is written.<br>In Quake III Arena entities can only be delta compressed relative to a previous snapshot. The<br>delta compression presented here works relative to a common base with entity states maintained<br>by both the server and the client. This common base contains states for all entities in the game.<br>Entities are delta compressed relative to this common state which allows proper delta<br>compression even when entities continuously leave and enter the PVS. After creating and<br>sending a snapshot the server buffers the snapshot. The client also keeps track of the recently<br>received snapshots. With each user command message the clients sends an acknowledgement for<br>the last received snapshot. User commands are sent at a higher frequency than snapshots so even<br>with packet loss most snapshots are acknowledged. When the server receives an<br>acknowledgement for a snapshot it applies the snapshot to its common state for that client. The<br>server then also sends a reliable message to the client telling the client to apply the same<br>snapshot to it&#8217;s common state. Reliable messages are guaranteed to arrive before any new<br>unreliable data, so the acknowledged snapshot will be applied at the client before any new<br>snapshots are processed. This way both the server and client maintain a synchronized common<br>base with entity states that can be used for delta compression.<br>Entities that have not change from the common state are not written to a snapshot at all to save<br>even more bandwidth. However, a client still needs to know which entities are considered in the<br>PVS by the server because the client should only render those entities on screen. Entities are<br>typically numbered and the server could write the numbers of all entities that are in the PVS to<br>the snapshot. In a game like DOOM III there can be many entities in the PVS in any given scene<br>and sending all those numbers would significantly increase the size of snapshots. Instead of<br>sending the numbers of the entities, a bit string can be written to a snapshot. This bit string has a<br>bit for each entity where bit offset denotes the entity number. A bit is set to 1 if the entity is in<br>the PVS of the client and a bit is set to 0 if it is not. With a maximum of 4096 entities in the<br>game this requires 512 bytes. However, as a player moves through the environment typically<br>only a few entities enter and\/or leave the PVS. As such this bit string can be delta compressed in<br>fixed chunks of for instance 32 bits. A 32 bit chunk is then only sent over the network if one of<br>the entities from that chunk entered or left the PVS. If no entities entered or left the PVS this<br>results in just 16 bytes being written to the snapshot.<br>4.3 Message Compression<br>The message channel compresses all reliable and unreliable messages. The delta compressed bit<br>packed data is not a stream of fixed length words. The delta compression introduces single bits<br>and the bit packed variables can use an arbitrary number of bits. As a result regular entropy<br>encoding is difficult because entropy encoders typically assume a word length of a fixed number<br>of bits.<br>18<br>The delta compression writes out a single zero bit for any variable that did not change. Because<br>only few variables change over time the delta compression introduces a lot of sequences of zero<br>bits. For this reason 3-bit word length zero based run-length compression is used. The<br>compressor reads 3 bits at a time and if the bits are not all zero the same bits are written out<br>without changes. If the 3 bits are all zero the compressor keeps reading words of 3 bits at a time<br>until they are no longer all zero. The compressor then writes out 3 zero bits followed by 3 bits<br>that represent the number of times 3 zero bits were read in succession. Using a 3-bit word length<br>results in a maximum compression ratio of 4:1. A different number of bits than 3 could be used<br>for the word length but for the DOOM III entities using 3 bits results in the best compression<br>ratios in practice.<br>The compression ratios for snapshots can generally be improved by writing entity class variables<br>to a snapshot in order of the frequency at which they change. This way the variables that change<br>infrequently are grouped together which results in long sequences of zero bits.<\/li><li>Implementation<br>Each entity class implements a WriteToSnapshot and ReadFromSnapshot member function.<br>These member functions write and read entity class variables that need to be synchronized from<br>the server to the client.<br>Write and read methods are used because this allows specific conversions to be implemented on<br>a per entity basis. For instance, a rotation matrix can first be converted to a quaternion before<br>writing the orientation to the snapshot. When the snapshot is read by the client the quaternion<br>can be converted back to a rotation matrix. Certain state variables may also be derived from<br>other state variables. Such derived state variables do not need to be synchronized and can be<br>derived in the ReadFromSnapshot method.<br>Instead of read and write methods, tables could be used with entity class variables that need to be<br>synchronized. Conversions and derived variables would need to be specified in these tables. A<br>table would then be used by generalized routines to write and read the state variables. This would<br>force these routines to know about conversions or derived variables that may be very specific to<br>just one type of entity. Such a coupling is typically undesirable. The system presented here uses<br>write and read methods for maximum localized flexibility.<br>class idMyEntity : public idEntity {<br>public:<br>virtual void WriteToSnapshot( idBitMsgDelta &amp;msg ) const;<br>virtual void ReadFromSnapshot( idBitMsgDelta &amp;msg );<br>virtual bool ClientReceiveEvent( int event, int time, const idBitMsg &amp;msg );<br>enum {<br>EVENT_FIRST = idEntity::EVENT_MAXEVENTS,<br>EVENT_SECOND<br>};<br>private:<br>int health;<br>}<br>19<br>void idMyEntity::WriteToSnapshot( idBitMsgDelta &amp;msg ) const {<br>msg.WriteBits( health, 7 );<br>}<br>void idMyEntity::ReadFromSnapshot( idBitMsgDelta &amp;msg ) {<br>msg.ReadBits( health, 7 );<br>}<br>The idBitMsgDelta class is initialized with an entity state from the common base. The class<br>writes or reads a bit packed and delta compressed message. The class also writes out a new entity<br>state which can be applied to the common state once a snapshot is acknowledged by both the<br>client and the server.<br>The server can also send reliable events to update entities or to initiate specific effects. The<br>server can send an event to clients for a specific entity by calling a ServerSendEvent method on<br>the entity. These entity events are not affected by the PVS of a client and will always be sent<br>over the network.<br>void idEntity::ServerSendEvent( int event, const idBitMsg *msg, bool saveEvent ) const;<br>The &#8216;event&#8217; parameter specifies the type of event. Each entity can handle an arbitrary number of<br>different events. The event parameters are written to an idBitMsg which allows the parameters to<br>be bit packed to save bandwidth.<br>If the &#8216;saveEvent&#8217; option is set then the event is saved for clients that connect late. Saved events<br>are buffered and also sent to any client that connects late so all clients always receive the events<br>no matter what time they join the game. Such saved events can be used for entities that exist<br>throughout the whole game and do not change continuously but go through a well defined<br>sequence of transitions. Whenever a transition takes place an event is sent to the client to execute<br>the particular transition.<br>To handle such events each entity class has a method which is called whenever an event arrives<br>at the client for an object of that entity class.<br>bool idMyEntity::ClientReceiveEvent( int event, int time, const idBitMsg &amp;msg ) {<br>switch( event ) {<br>case EVENT_FIRST: {<br>\/\/ read parameters from &#8216;msg&#8217; and handle event<br>return true;<br>}<br>case EVENT_SECOND: {<br>\/\/ read parameters from &#8216;msg&#8217; and handle event<br>return true;<br>}<br>default: {<br>return idEntity::ClientReceiveEvent( event, time, msg );<br>}<br>}<br>return false;<br>}<br>Even though the events are reliable the entity can still choose to ignore the event if it is from too<br>far back in the past. In DOOM III there is no functionality implemented to send unreliable<br>20<br>events. However, implementing such events can easily be done in the game code by writing the<br>events just once to snapshots. Such unreliable events can also be bound to the PVS of the client<br>if desired.<br>In Quake III Arena implementing and tweaking an entity that works over the network sometimes<br>requires changing almost a dozen source code files. With the network architecture presented here<br>there is no separation in modules. As such the implementation of everything necessary to<br>simulate and visualize an entity is localized and typically involves no more than two source code<br>files.<\/li><li>Results and Discussion<br>In DOOM III the bit packing typically reduces the amount of traffic with 10 up to 15%. The<br>reason for this relatively small reduction is that a lot of positions and orientations of entities are<br>synchronized as full 32-bit floating point variables without any reduction.<br>In theory the maximum compression ratio of plain delta compression is 32:1 because the<br>maximum size of variables used in DOOM III is 32 bits and the delta compression writes out a<br>single zero bit for each variable that did not change since a previous update. In practice the delta<br>compression does much better and reduces the traffic with 90 up to 100%. The reason for this<br>large reduction is that entities in the environment that do not change at all are omitted completely<br>from the network stream and no zero bits are transmitted. If entities that do not change at all<br>would still be synchronized the delta compression would turn updates for such entities into<br>sequences of only zero bits and the reduction in network traffic would only be 80 to 90%.<br>The 3-bit word length zero-based run-length compression has a theoretical maximum<br>compression ratio of 4:1. In practice the run-length compression reduces the network traffic with<br>15% up to 50%.<br>Unlike with Quake III Arena, developers are not forced to make all entities network capable. The<br>presented network architecture allows a single player experience to be developed independently,<br>without having to worry about networking. This is generally a big advantage. However, entities<br>developed for a single player experience may not be suitable or optimized for networking. This<br>may result in a fair amount of work when a developer tries to build a multiplayer experience<br>upon a single player game.<br>The bit packing is used to reduce the amount of entity state information being written to<br>snapshots. The number of bits used to synchronize integer variables can be decreased and even<br>the number of bits used for the mantissa and exponent of floating point values can be specified.<br>However, reducing the entity states on a bit level is not trivial and requires thorough knowledge<br>of the information being synchronized. For instance, reducing the number of bits used to<br>synchronize physics positions is usually a bad idea because predicted collisions may be missed if<br>positions are not synchronized with enough precision.<br>The DOOM III engine as a whole is more flexible than the Quake III Arena engine. There are<br>more different entities that can operate and change in different ways. To cope with this increased<br>21<br>flexibility the DOOM III network system is also more flexible than the Quake III Arena<br>networking. The additional flexibility comes with more choices to be made and as such it can<br>take some time to get familiar with all the different options. Synchronizing class variables on a<br>per entity basis also requires more programming than writing code to synchronize a single fixed<br>entity state. However, the additional flexibility is required because entities are versatile and may<br>have many different state variables that do not all fit well in a fixed state structure.<br>While no new snapshot has arrived, the prediction at the client is cheaper than advancing the<br>game at the server because only entities in the PVS of the client are predicted. However,<br>whenever a new snapshot arrives the states of entities in the PVS of a client are overwritten with<br>the states from the snapshot. The client then has to re-predict up to the current client time<br>because the snapshot contains entity states from the past. The snapshots are from at least a full<br>ping time in the past, and the client may need to re-predict quite a few game frames in one go.<br>Even though only entities in the PVS of the client are predicted, this prediction can be expensive<br>at times. Furthermore, the prediction becomes more expensive as the latency increases.<br>Generally the PVS is limited enough such that the prediction does not cause any slowdowns.<br>However, the multi-frame prediction happens whenever a new snapshot arrives, and snapshots<br>typically arrive at a lower frequency than the client renders images on screen. As a result more<br>processing power is required every few rendered frames which may degrade the display of<br>smooth motion through the virtual environment.<\/li><li>Conclusion<br>Any network architecture implements a trade between: consistency, responsiveness, bandwidth<br>and latency requirements. Finding the right balance depends on the type of game and the network<br>environment.<br>The network architecture presented here overcomes several of the problems of the network<br>architecture used in Quake III Arena. There is no server and client game separation which makes<br>development easier, and a single player game can be implemented without having to worry about<br>networking. There is no time difference between the player movement through the environment<br>and what the player sees on screen. Entities are not synchronized through a fixed entity state<br>structure but instead arbitrary entity state variables can be synchronized over the network. The<br>network system is also generally more efficient than the Quake III network system.<br>Even though the efficiency of the network architecture improved, multiplayer games in DOOM<br>III usually generate more traffic than in Quake III Arena. In DOOM III there are simply many<br>more entities with many state variables in any given scene and synchronizing all those variables<br>requires more bandwidth. For instance, while in Quake III Arena the lighting was baked into the<br>levels, the lighting in DOOM III is fully dynamic and every single light in the environment can<br>be changed at run-time and may therefore have to be synchronized over the network.<br>22<\/li><li>Future Work<br>Snapshots are delta compressed relative to a common base with entity states maintained by both<br>the server and the client. When a map is first loaded the common base is empty. As a result the<br>full state of any entity that enters the PVS of a client for the first time is sent over the network.<br>However, a lot of entities are loaded from a map file and they either do not change at all, or only<br>part of their state changes during game play. The common base with entity states could be<br>initialized with the states of entities from right after a map is loaded. These states are always the<br>same and as such the common base at the client and server stay synchronized when initialized<br>with these states.<br>In DOOM III reliable messages can be used to transmit events and small, but significant updates<br>of entities. However, some small updates could also be sent over the network with unreliable<br>messages instead. Such unreliable messages could be used for events and updates that are only<br>noticeable over a short period of time and do not disrupt game play if they never arrive at a<br>client. For instance, bullet impact effects on walls could be communicated with unreliable<br>messages. These effects disappear quickly and if some of these effects never arrive at a client it<br>does not disrupt game play. Support for unreliable messages is easy to implement. These<br>messages can be buffered in the game code at the server. All such buffered unreliable messages<br>are then written to the first next snapshot and the buffer is cleared. If the snapshot message is<br>dropped, the unreliable messages will never arrive at the client. However, packet loss is minimal<br>on today&#8217;s networks and the Internet, so most snapshot and unreliable messages will arrive.<br>All entities in the game are by default synchronized over the network when they enter the PVS of<br>a client. For certain special effects it may be convenient to support entities that only live at the<br>client. The server does not know about such client side entities and these entities are never<br>synchronized over the network. The client can use these entities to display additional changes<br>and events in the environment. Such client side entities can be derived from other entities that are<br>synchronized over the network. These entities can also be created from additional reliable or<br>unreliable messages sent from the server.<br>Not only the delta compressed states of entities that are in the client PVS are written to<br>snapshots. There is also one delta compressed state synchronized over the network which is not<br>tied to visibility. This state is used to communicate general game information and player state<br>information over the network. Instead of using a single state for this purpose, it may be<br>convenient to use multiple states for different purposes that are not tied to visibility. Using<br>multiple such states allows individual states to be omitted if they are not relevant at certain points<br>in time or if they are completely delta compressed away.<br>The client side prediction is implemented in the game code. As such developers can easily<br>disable prediction on certain entities or specific aspects of some entities. For instance, the<br>prediction of the position of opponents could be disabled and instead interpolation could be used.<br>This allows a &#8220;lag compensation&#8221; approach [11] to be implemented without requiring changes to<br>the network architecture. It is also possible to stop updating certain entities over the network at<br>some point where the client side prediction completely takes over the rest of the simulation. For<br>instance, the server could stop updating an enemy that dies and turns into a ragdoll. These<br>23<br>ragdolls are mostly used to present a realistic death animation and as such have no consequences<br>for the actual game play. No longer updating such entities can save a significant amount of<br>bandwidth.<br>Instead of a single snapshot stream the server can also send multiple snapshots to clients at<br>different frequencies. This allows different entities to be updated at different frequencies. For<br>instance, entities that are in the PVS but are very far away could be updated less frequently<br>because state changes of such entities are less noticeable to a player. Sending updates less<br>frequently obviously saves bandwidth. Certain entities can also be written to every other or every<br>third etc. snapshot to save bandwidth.<br>When a new snapshot arrives the states of entities at a client are overwritten with the states from<br>the snapshot and the client has to quickly re-predict up to the current time at the client. In<br>DOOM III this re-prediction is cheap enough to not cause any problems. However, if this reprediction turns out to be expensive at times the entity states can be advanced by taking larger<br>steps through time. Instead of advancing the states one frame at a time at 60Hz, multiple frames<br>could be merged to step through time more quickly. Obviously this will affect the accuracy of<br>the prediction. However, taking larger steps through time can be done on a per entity basis and,<br>for instance, only for entities where any prediction errors are not noticeable.<br>24<\/li><li>References<\/li><li>Networking and Online Games: Understanding and Engineering Multiplayer Internet Games<br>Grenville Armitage, Mark Claypool, Philip Branch<br>John Wiley &amp; Sons, April 2006<br>ISBN: 0-470-01857-7<br>Available Online: http:\/\/eu.wiley.com\/WileyCDA\/WileyTitle\/productCd0470018577,descCd-description.html<\/li><li>Real-Time Strategy Network Protocol<br>Jan Svarovsky<br>Game Programming Gems 3, 2002<br>Available Online: http:\/\/www.GameProgrammingGems.com<\/li><li>Bit Packing: A Network Compression Technique<br>Pete Isensee<br>Game Programming Gems 4, 2004<br>Available Online: http:\/\/www.GameProgrammingGems.com<\/li><li>General Lobby Design and Development<br>Shekhar Dhupelia<br>Game Programming Gems 4, 2004<br>Available Online: http:\/\/www.GameProgrammingGems.com<\/li><li>Component Based Object Management<br>Bjarne Rene<br>Game Programming Gems 5, 2005<br>Available Online: http:\/\/www.GameProgrammingGems.com<\/li><li>Overcoming Network Address Translation in Peer-to-Peer Communications<br>Jon Watte<br>Game Programming Gems 5, 2005<br>Available Online: http:\/\/www.GameProgrammingGems.com<\/li><li>A Reliable Messaging Protocol<br>Martin Brownlow<br>Game Programming Gems 5, 2005<br>Available Online: http:\/\/www.GameProgrammingGems.com<\/li><li>Event Ordering and Congestion Control for Distributed Multiplayer Games<br>Chris GauthierDickey, Daniel Zappala, Virginia Lo<br>May 14, 2005<br>Available Online: http:\/\/citeseer.ist.psu.edu\/724490.html<\/li><li>Dead Reckoning: Latency Hiding for Networked Games<br>Jesse Aronson<br>Gamasutra, September 19, 1997<br>Available Online: http:\/\/www.gamasutra.com\/features\/19970919\/aronson_01.htm<\/li><li>A Look at Latency in Networked Games<br>Jonathan Blow<br>Game Developer Magazine, July 1998<br>Available Online: http:\/\/www.flipcode.com\/cgi-bin\/fckb.cgi?showLink=246<br>25<\/li><li>Latency Compensating Methods in Client\/Server In-game Protocol Design and Optimization<br>Yahn W. Bernier<br>Game Developers Conference, 2001<br>Available Online: http:\/\/www.gamasutra.com\/features\/gdcarchive\/2001\/bernier.doc<\/li><li>Prediction techiques in computer games<br>Joakim Bech<br>Master Thesis, Supervisor: Lennart Ohlsson, May 2005<br>Available Online: http:\/\/graphics.cs.lth.se\/theses\/projects\/pticg\/<\/li><li>The TRIBES Engine Networking Model<br>Mark Frohnmayer, Tim Gift<br>Game Developers Conference, pp. 191-207, 2000<br>Available Online: http:\/\/www.gamasutra.com\/features\/gdcarchive\/2000\/frohnmayer.doc<\/li><li>The Quake 2 Networking Data Flow<br>Q2DP<br>March 1998<br>Available Online:<br>http:\/\/www.gamers.org\/dEngine\/quake2\/Q2DP\/Q2DP_Network\/Q2DP_Network.html<\/li><li>The Quake3 Networking Model<br>Brian Hook<br>Book of Hook, April 2004<br>Available Online:<br>http:\/\/www.bookofhook.com\/Article\/GameDevelopment\/TheQuake3NetworkingModel.html<\/li><li>Unreal Networking Architecture<br>Tim Sweeney<br>Epic MegaGames, Inc., July 1999<br>Available Online: http:\/\/unreal.epicgames.com\/Network.htm<\/li><li>A Distributed Multiplayer Game Server System<br>Eric Cronin, Burton Filstrup, Anthony R. Kurc<br>Electrical Engineering and Computer Science Department University of Michigan<br>UM EECS589 Course Project Report, May 2001<br>Available Online: http:\/\/warriors.eecs.umich.edu\/games\/papers\/quakefinal.pdf<\/li><li>An Efficient Synchronization Mechanism for Mirrored Game Architectures (Extended<br>Version)<br>Eric Cronin, Burton Filstrup, Anthony R. Kurc, Sugih Jamin<br>Electrical Engineering and Computer Science Department University of Michigan<br>In Kluwer MTAP, 2003<br>In Proc. NetGames2002, April 2002<br>Available Online: http:\/\/warriors.eecs.umich.edu\/games\/papers\/mtap-tss.pdf<\/li><li>A Distributed Architecture for Interactive Multiplayer Games<br>Ashwin R. Bharambe, Je Pang, Srinivasan Seshan<br>School of Computer Science Carnegie Mellon University Pittsburgh, January 2005<br>Available Online: http:\/\/www.cs.cmu.edu\/~ashu\/papers\/cmu-cs-05-112.pdf<br>26<\/li><li>Aspects of Networking in Multiplayer Computer Games<br>Jouni Smed, Timo Kaukoranta, Harri Hakonen<br>Proceedings of International Conference on Application and Development of Computer<br>Games in the 21st Century, pp. 74-81, Hong Kong SAR, China, November 2001<br>Available Online: http:\/\/staff.cs.utu.fi\/~jounsmed\/papers\/AspectsOfMCGs.pdf<\/li><li>A Review on Networking and Multiplayer Computer Games<br>Jouni Smed, Timo Kaukoranta, Harri Hakonen<br>University of Turku, April 2002<br>Available Online: http:\/\/staff.cs.utu.fi\/~jounsmed\/papers\/TR454.pdf<\/li><li>An Experimental Estimation of Latency Sensitivity In Multiplayer Quake 3<br>G.J. Armitage<br>CAIA Technical Report 030405A, April 2003<br>Available Online: http:\/\/caia.swin.edu.au\/reports\/030405A\/CAIA-TR-030405A.pdf<\/li><li>Dissecting Server-Discovery Traffict Patterns Generated By Multiplayer First Person Shooter<br>Games<br>Sebastian Zander, David Kennedy, Grenville Armitage<br>NetGames, October 2005<br>Available Online: http:\/\/www.research.ibm.com\/netgames2005\/papers\/zander.pdf<\/li><li>Towards a General Model of First Person Shooter Game Traffic<br>Philip A. Branch, Grenville J. Armitage<br>Swinburne University of Technology, Melbourne, Australia, December 2005<br>Available Online: http:\/\/caia.swin.edu.au\/reports\/050928A\/CAIA-TR-050928A.pdf<\/li><li>Quake 3 Packet and Traffic Characteristics<br>M. D. Pozzobon<br>CAIA Technical report 021220A, December 2002<br>Available Online: http:\/\/caia.swin.edu.au\/genius\/021220A\/<\/li><li>Enemy Territory Traffic Analysis<br>J. Bussiere, S. Zander<br>CAIA Technical Report 060203A, February 2006<br>Available Online: http:\/\/caia.swin.edu.au\/reports\/060203A\/CAIA-TR-060203A.pdf<\/li><li>Designing Secure, Flexible, and High Performance Game Network Architectures<br>K. Jenkins<br>Gamasutra, December 2004<br>Available Online: http:\/\/www.gamasutra.com\/features\/20041206\/jenkins_01.shtml<\/li><li>Security Issues in Online Games<br>Jianxin Jeff Yan, Hyun-Jin Choi<br>The Electronic Library, Vol. 20, No.2, 2002<br>International Conference on Application and Development of Computer Games in the 21st<br>Century, Hong Kong, November 2001<br>Available Online: http:\/\/homepages.cs.ncl.ac.uk\/jeff.yan\/TEL.pdf<br>27<\/li><li>Security Design in Online Games<br>Jianxin Jeff Yan<br>The Chinese University of Hong Kong<br>Proceedings of the 19th Annual Computer Security Applications Conference, IEEE<br>Computer Society, December, 2003<br>Available Online: http:\/\/homepages.cs.ncl.ac.uk\/jeff.yan\/acsac03.pdf<\/li><li>Cheat-Proofing Dead Reckoned Multiplayer Games<br>Eric Cronin Burton Filstrup Sugih Jamin<br>Electrical Engineering and Computer Science Department University of Michigan<br>In Proc. ADCOG 2003, January 2003<br>Available Online: http:\/\/warriors.eecs.umich.edu\/games\/papers\/adcog03-cheat.pdf<\/li><li>Internet Protocol, RFC 760<br>J. Postel<br>USC\/Information Sciences Institute, January 1980<br>Available Online: http:\/\/www.rfc-editor.org\/rfc\/rfc760.txt<\/li><li>User Datagram Protocol, RFC 768<br>J. Postel<br>USC\/Information Sciences Institute, January 1980<br>Available Online: http:\/\/www.rfc-editor.org\/rfc\/rfc768.txt<\/li><li>Transmission Control Protocol, RFC 761<br>J. Postel<br>USC\/Information Sciences Institute, January 1980<br>Available Online: http:\/\/www.rfc-editor.org\/rfc\/rfc761.txt<\/li><li>A Survey of Visibility Methods for Networked Games<br>Matthew M. Trentacoste<br>Department of Computer Science University of British Columbia, 2002<br>Available Online: http:\/\/www.cs.ubc.ca\/~mmt\/538-final-paper.pdf<\/li><\/ol>\n","protected":false},"excerpt":{"rendered":"<p>To immerse a player into a highly interactive game environment with fast-pacedaction, a computer game must deliver a consistent and responsive experience.However, this may be difficult to realize when a computer game is played over anetwork connection because network environments introduce various constraintssuch as an always limited amount of bandwidth that can be used to&#8230;<\/p>\n<p class=\"more-link-wrap\"><a href=\"http:\/\/merserver.com\/index.php\/2022\/10\/20\/the-doom-iii-network-architecture\/\" class=\"more-link\">Read More<span class=\"screen-reader-text\"> &ldquo;The DOOM III Network Architecture&rdquo;<\/span> &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-317","post","type-post","status-publish","format-standard","hentry","category-gamedev"],"_links":{"self":[{"href":"http:\/\/merserver.com\/index.php\/wp-json\/wp\/v2\/posts\/317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/merserver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/merserver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/merserver.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/merserver.com\/index.php\/wp-json\/wp\/v2\/comments?post=317"}],"version-history":[{"count":1,"href":"http:\/\/merserver.com\/index.php\/wp-json\/wp\/v2\/posts\/317\/revisions"}],"predecessor-version":[{"id":318,"href":"http:\/\/merserver.com\/index.php\/wp-json\/wp\/v2\/posts\/317\/revisions\/318"}],"wp:attachment":[{"href":"http:\/\/merserver.com\/index.php\/wp-json\/wp\/v2\/media?parent=317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/merserver.com\/index.php\/wp-json\/wp\/v2\/categories?post=317"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/merserver.com\/index.php\/wp-json\/wp\/v2\/tags?post=317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}