Now we'll
take a moment and talk about client prediction. And what a clever
but nasty beast this is. In the cases where both the client misses
a packet from the server, and the time between getting normal
gaming packets, (think about it - the server may only be running
at 10fps, but that doesn't mean you want the client side representation
to), the client needs to be doing something to make it look like
it IS still getting data. So we predict the world and events in
it. Since we know what's going on with the client's player - after
all, we are right there at the input point right? - we can predict
what he is going to do. If he fires a weapon, we can show it on
screen, since that's what we know he's going to do. We can also
predict - to a lesser degree - what the other players are doing,
at least to complete out any animations they may be in, if they
are dropping still have gravity performed on them and so on. Now
of course this only works for a time measured in seconds, but
usually that's enough for the packet system to come back on line,
and start re-receiving stuff from the server, at which time the
client can correct itself for any events that it predicted wrong.
At the best, it's totally on target, and you will never have known
that you were missing data. At middle, the client is a bit out,
so it starts correcting via a smoothing operation, that way no
one 'snaps' really obviously to a new location. And at worst,
you are dead via an attack you didn't even see, since it occurred
while you were missing packets. However, there is no way around
this situation so it's something that has to be lived with, and
it's better than jerky motion and snapping updates.
However,
what do you do if you miss a baseline packet? IE one that has
a new object in it that wasn't there before? You've missed all
the information that came down initially, but you will be getting
updates from that point on. Well, to be honest - thats the
trick isn't it? I've given away most of the tricks of the trade
already, but some must remain. I'll give you a clue though; it
is possible to fix a situation like this :)
In every
type of game there are some packet types that WILL require a guaranteed
delivery. So be prepared to create some kind of structure to cope
with this, because UDP doesn't. But be sure you dont use
it too much or you will end up back with the same problems that
TCP/IP has.
Online
Cheating. There are a few ways to try to deal with this, but be
warned, what's man-made is man-hackable. This is not so much a
big deal at big frag fests since all the matches there are moderated,
but it can have an impact on those that qualify for these fests.
And of course, it just plain sucks to be playing on a server where
someone is unbeatable because they are cheating. Cheating can
occur in many ways, modifying the client to never display walls
in the game, adding lights or white skins to other players, displaying
a local map (if you want to get really ambitious), modifying your
aim so it's always dead on other players, or simply firing a weapon
at an opponent with deadly aim the moment they are in sight. All
of these are hacks to the client end of the game, and when done
properly, are pretty un-observable back at the server. There is
some stuff you can do, checking the accuracy of each player and
dumping those that go over a certain scale. You may lose some
really good players that way, but it's unlikely that anyone can
get over an 80% hit rate all the time. All the checks of the client
in the world can really be gotten around since the result of the
check has to be returned to the server at some point, and if it's
intercepted there and replaced with what the server expects, the
server is fooled. Using the result to decrypt the data that comes
from the server is possible, but again, it's done on the client
side and with enough patience and a good dis-assembler it can
be gotten around. Client integrity is the key here, and keeping
it the aim. The Quake 1 & 3 solution, that of a virtual
machine, where instead of the client loading the game up the client
'builds' or 'compiles' the game it's going to run via instructions
from the server, is a good start, since re-writing someone else's
compiler is beyond all but the very best of hackers. God knows,
writing it in the first place is a nightmare I wouldn't want to
contemplate. But it is within the bounds of possibility. All the
games developer can do is make it as difficult as he possibly
can for the budding hacker and be content with that.
Last
thoughts for Developers.
Peter
Lincroft who was involved with X Wing vs. TIE fighter had
an article in Game Developer Magazine and did a talk at GDC last
year about his experiences with net gaming, and I'd like to reiterate
some of his idea's here for completeness sake.
When testing
a game, make sure you find a really horrible ISP to do some real
Internet testing. Most games get built and tested to start with
on the internal LAN at the developer's offices. This isn't really
a fair test, since LAN's rarely drop packets and have great PING's.
Find a bad ISP and do some REAL testing. This really works wonders
for you later.
Emulate
Internet conditions. Stick some code into your code base that
emulates packet dropping. Have it settable so you know at what
point your game is going to break down - is it 10% drop out or
30%? These are things you should know so you can automatically
drop someone from a game if this occurs. Something to bear in
mind here is that the Internet doesn't typically just drop one
packet. Usually they occur in batches, so don't just dump one
at a time, do them several at a time.
Remember
your server is going to be sending out far more data than each
client has to worry about. If client messages are around the 2k
mark a second, and there are 10 clients, then the server is banging
out 10x2k packets, which is 20k. Be sure that the communications
infrastructure you are using is capable of supporting this.
Well there
you have it, some ramblings and thoughts on Networking 101 for
Games. I've probably made some mistakes, but the gist of it should
be sound. Have fun out there, and be amazed it works at all. :)
Big thanks
must go to James Monroe for adding any inaccuracies this article
may have. Blame him and send him mail for any mistakes instead
of me.
- Jake Simpson is a code monkey for Raven Software. He's badass.