Orphus system

Cheb's Home Page

Cheb's Game Engine Quake II facelift
Штошник на ушах


Multiplayer over Internet and pitfall of floating-point physics

To this topic my attention was attracted by wistful consequences of attempt to play Quake III through Internet. I now have a cable ISP, and the bottleneck of dial-up connection is history...
No, I can't complain for gameplay itself. Playing in team with real humans is much more interesting, than with bots. But at end of the month, after calculation of the traffic...
Of course, I suspected, that Q3's information flow is heavy, but whole fifty US dollars for just few days of harmless entertainment... This is obviously too much!

Client-client vs. client-server

    How worked the multiplayer in past days (beginning from Grandfather Doom, and ending with Duke Nukem and its clones)?
    All computers, after they establish the connection, simultaneously loaded game level, and they all waited until slowest one will finish loading. Then they begin game (also simultaneously), sending each other only information of player movement control, i.e. which keys were pressed, and how much mouse was moved.
    With all this, game engine worked only on integer mathematic, and due this, when identical player control command info affected identical physical game worlds, these game worlds worked on all computers synchronously.

    That was typical client-client architecture. Its great advantage, in comparsion with modern client-server one, was much lesser network traffic: after all, when there are only two players, only information about states of two objects travels through network. Not as in modern games: players, plus herd of monsters, plus flying missiles, plus elevators, and even plus blood splashes...
    Unfortunately, disadvantages of that architecture were great too (let's set aside for now question about speed difference between floating point and integer on modern processors): At first, all players were forced to enter game level simultaneously, you couldn't join skirmish when it was in progress.
    At second, if there were any interferences or errors in the information flow, then all computers became "out of sync" and game was untimely finished.
    At third, game world couldn't advance to next game tic until all control information from all players was received. It caused significant degradation of game smoothness, depending on number of players and overall quality of all their connections (and there is no one ideal thing in this world, including computer networks)

My suggestion: let's breathe new life into this cadaver!

Well... returning to things, I wrote about in the preface: Let's Q3 play the capitalists (or those fortunates, who has lot of neighbors-gamers in one LAN)
My suggestion, on other hand, is for those, who want to write games that will be suitable for common people not burden with extra money or luck.

Now, what we start with?..
A). We will build game engine only with integer mathematic. Isn't very easy to write such code, and run-time calculations aren't too fast... On other hand, physical game world takes not too much percentage of processor time.
B). We'll add support for home-bred networks, like: three computers connected by COM and LPT ports, one of them is connected by modem or Inet with fourth and fifth ones... In real world in general, and particularly in Russia often appear even more interesting things.
C). We'll return to client-client architecture, but with many significant improvements (see below). But in this case, nothing can prevent us from choosing one of computers to be the "server". But, unlike modern servers, it will only coordinate the game process, not hold the game physics solely and feed clients with states of visible objects as true servers do.

How to do it:

A). We'll add possibility of forward interpolation (prediction) of entire game world. I.e., if client not receives another information packet with opponent data, it not freezes, but at first remembers game world state (for all objects), and calculates next game tic using predicted opponent data.
After next game tics, when delayed packet comes, client restores that remembered game world state (for all objects!), and quickly calculates all these tics, but now using real opponent data.
As result, significantly increases load of physic algorithms for all clients, if there is just one low quality connection in network (but this is question of physic algorithms efficiency), but dramatically decreases information content, flowing through network, thus saving user's money, or just allowing to play by very bad phone line, that not allows playing modern client-server games because of low bandwidth.
Disadvantage of this architecture is that it becomes much harder to write program. Beside saving bandwidth, advantages aren't too big, but nevertheless, they are significant. Because it allows using in the game a various objects with very complex behavior algorithms, that are impossible to interpolate forward (predict) in the traditional client-server architecture.
B). We'll add possibility to join game in progress. Although it seems impossible, really it's very simple.
Let's assume, that a new client connects to functioning game network. Pseudoserver finds client that has best (or cheapest) connection with the new joined one, and gives him command: connect this one.
Network member does next two things in order to connect the new client: at first, it makes a game world snapshot, and from this moment, begins to record opponent data of all other network members. Then it begins transmitting that game snapshot to the new client. Snapshot may be quite heavy, and transmitting can take some time (a minute, for example). After snapshot was transmitted, the new client creates a whole game world using it. Ok, but it is absolutely obsolete...
At second, the network member begins to transmit to the new client the opponent data, that it recorded all this time, and does it with maximum speed, that connection bandwidth allows. The new client processes that opponent data as fast as it can, and after some period of time it becomes synchronized with all other computers in the game session.
Then it can join game by adding own player object.
That's all. We got the possibility to join game in progress. Though, not instantly, as in client-server architecture, but we all know, that there no such thing, as free cheese...

People!!! Don't be lazy! Criticize this article; mail me your opinion! Because in the dispute births the truth...