Entity Position Interpolation Code
Source code for a position interpolation class, together with a small
Windows test program.
Download: epic-latest.zip (2006-10-28)
Interpolation and Extrapolation of Game Entities
The code is now available on GitHub, too. github.com/jwatte/EPIC
When writing a networked game, you quickly run into the problem
that, on client B, when you get data from client A, that data will be old, because
of the transmission latency inherent in any networking. On a LAN, you may get away
with using the old data as-is, but when playing on the general Internet, you want
to display a guess of where the player might be right now.
There are various ways of doing this. The simplest way is to just
read the position and velocity of the entity update packet, and forward the position
of the entity by the velocity in the packet to the current time. The main draw-back
of this approach is that the entity on screen will jump around ("snap" or "lag") for
each update packet you get, because there are discontinuities in the interpolated
position.
A better method involves interpolating between the last position
you actually rendered the entity at, and some position derived from the last update.
Because we are drawing the entity forward extrapolated to our current time frame,
the actual position we get out of the update will need to be extrapolated by the
time until the next update, to give us a point to aim for. This method is implemented
in the template class Extrapolator which is included in the EPIC download.
Source code and project files are included for Visual Studio 2003 and Visual
Studio 2005; you can probably modify it to run with other compilers with little work.
The extrapolator class should build on any modern compiler (including Linux/GCC) but
the demo application is a Win32 application.
The code from EPIC is released under the MIT license, which means that it's Open
Source, and also that you can use it in commercial products without any risk of
"tainting" your code. All you have to do is agree to not sue me over this code (and
agree that your customers also can't sue me), and include a small copyright notice
in any credits or documentation page accompanying your code.
You can contact me as hplus0603 on the site
GameDev.Net.
|