Game engines have become increasingly complex and feature filled. However, at its
core, they are fairly simple to comprehend and understand. The game engine is a
microcosm of an operating system - managing resources and coordinating execution. The
main difference is that game engines are optimized for an active cycle, one where
computation is continuous and timing does in fact play a part. There are a number of
shared resources including the render targets, but otherwise a number of different
processes can be in play. The individual game just specifies a single startup process
but then can load or unload different startup processes. A scheduler can help manage
and balance the resource usage across multiple threads.
Since core simulation and rendering loop processes are repetitive, we define these
processes as a graph of producers and consumers which will allow the scheduler to
understand synchronization points to better balance execution. Processes are
responsible for allocation and release of the resources that they request and load.
These are the core systems which need to be implemented for the engine.
- The many systems of a simulation must be coordinated in execution. We define
orchestration as running the game loop and managing all the different systems which
goes into creating the end experience for the user.
- The world must be simulated in order to create an immersive experience. We have to
define the component entity model which we will expose as the interface for
interacting with the engine, but can also be used as the basis for all game
- The world must be rendered to the user. We need to define a number of primitives to
be rendered including meshes and particle effects and the corresponding system for
managing shaders and the data buffers being composed and sent to the GPU each frame.
- User interface
- While the user interface is not strictly necessary, it is an invaluable debugging
and development tool. We would also like to implement complex interfaces in our use
of the engine.
- Input devices - We want to manage all the different input devices
which a user can use. The more immersive or complex the environment is, the more
useful additional methods of inputs can be. Having a flexible system allows user
customization and a better experience.
management - Large number of objects need to be loaded and managed
to create an immersive experience. These resources need to be properly cached and
evicted when necessary. Different capabilities of different computers will change the
constraints for our resources and need to be managed.
- Networking - Large scale games have networking as a requirement.
The simulations we wish to create also need to be networked and thus this is a
- Serialization - We need to be able to save and load state of the
- Packaging - For distributions, we need to be able to package our
assets and properly distribute updates.
In addition to the engine, we must develop a set of tool to support development.
- Lots of edge, content generation, erosion model, photometry, etc.
- Not a lot of middle wear, system are independent.
- Sound propagation is maturing
- Crude incentive models, low fidelity.