Every game engine, from the simplest to the most complex, requires some
means of updating the internal state of every game object over time. The state
of a game object can be defined as the values of all its attributes (sometimes
called its properties, and called data members in the C++ language). For example, the state of the ball in Pong is described by its (x, y) position on the screen
and its velocity (speed and direction of travel). Because games are dynamic,
time-based simulations, a game object’s state describes its configuration at one
specific instant in time. In other words, a game object’s notion of time is discrete
rather than continuous. (However, as we’ll see, it’s helpful to think of the objects’ states as changing continuously and then being sampled discretely by
the engine, because it helps you to avoid some common pitfalls.)
In the following discussions, we’ll use the symbol Si(t) to denote the state
of object i at an arbitrary time t. The use of vector notation here is not strictly
mathematically correct, but it reminds us that a game object’s state acts like
a heterogeneous n-dimensional vector, containing all sorts of information of
various data types. We should note that this usage of the term “state” is not
the same as the states in a finite state machine. A game object may very well
be implemented in terms of one—or many—finite state machines, but in that
case, a specification of the current state of each FSM would merely be a part
of the game object’s overall state vector S(t).
15.6. Updating Game Objects in Real Time 917
Most low-level engine subsystems (rendering, animation, collision, physics,
audio and so on) require periodic updating, and the game object system is no
exception. As we saw in Chapter 7, updating is usually done via a single
master loop called the game loop (or possibly via multiple game loops, each
running in a separate thread). Virtually all game engines update game object
states as part of their main game loop—in other words, they treat the game object model as just another engine subsystem that requires periodic servicing.
Game object updating can therefore be thought of as the process of determining the state of each object at the current time Si(t) given its state at a
previous time Si(t−∆t). Once all object states have been updated, the current
time t becomes the new previous time (t − ∆t), and this process repeats for as
long as the game is running. Usually, one or more clocks are maintained by the
engine—one that tracks real time exactly and possibly others that may or may
not correspond to real time. These clocks provide the engine with the absolute time t and/or with the change in time ∆t from iteration to iteration of the
game loop. The clock that drives the updating of game object states is usually
permitted to diverge from real time. This allows the behaviors of the game objects to be paused, slowed down, sped up or even run in reverse—whatever
is required in order to suit the needs of the game design. These features are
also invaluable for debugging and development of the game.
As we learned in Chapter 1, a game object updating system is an example of what is known as a dynamic, real-time, agent-based computer simulation in
computer science. Game object updating systems also exhibit some aspects of
discrete event simulations (see Section 15.7 for more details on events). These
are well-researched areas of computer science, and they have many applications outside the field of interactive entertainment. Games are one of the
more-complex kinds of agent-based simulation—as we’ll see, updating game
object states over time in a dynamic, interactive virtual environment can be
surprisingly difficult to get right. Game programmers can learn a lot about
game object updating by studying the wider field of agent-based and discrete
event simulations. And researchers in those fields can probably learn a thing
or two from game engine design as well!
As with all high-level game engine systems, every engine takes a slightly
(or sometimes radically) different approach. However, as before, most game
teams encounter a common set of problems, and certain design patterns tend
to crop up again and again in virtually every engine. In this section, we’ll
investigate these common problems and some common solutions to them.
Please bear in mind that game engines may exist that employ very different solutions to the ones described here, and some game designs face unique
problems that we can’t possibly cover here.
0 Comments
Please Comment for any further query :