Learn Game Engine Programming

This is a list of self-learning resources for game engine programming. It is not exhaustive, there are many more things to learn, but it will get you started. The content is organized sequentially, but the order is not strict, feel free to jump around.

1. Programming Basics

Engines are mostly written in C++ because it maps somewhat directly to how the CPU works, which allows to achieve high performance.

2. Programming Best Practices

C++ is a huge language with many parts and features that can be used (and misused) in many different ways. Handmade Hero teaches low-level C-style code, whereas general C++ books teach more abstract paradigms such as object-oriented programming. Some programmers have very strong opinions about the right way to do things. Engine programmers tend toward low-level code. However, you will likely encounter all kinds of code through your career.

Further resources:

3. Algorithms and Data Structures

Algorithms and data structures are fundamental to solving problems with code. They are used everywhere in engines. You need to know their characteristics.

Further resources:

4. Computer Architecture and Performance

Engine programming requires a good understanding of how computers work in order to achieve the high performance required for real-time interactive games.

These resources cover the basics broadly:

The other resources listed below dive deeper into specific topics.

Assembly, which you do not necessarily need to know how to write, but at least to read in order to verify that the compiler did what you expect with your code:

Data-oriented design, a programming approach that takes advantage of the way that modern CPUs work, in particular with respect to caching:

Parallel programming, which becomes increasingly important as CPUs get more cores:

Advanced resources if you want to further specialize in optimization:

Misc useful links:

5. Math

Some parts of an engine use math, such as rendering and physics. The most important fields are trigonometry, calculus, and linear algebra. Only resources at a level above high-school are listed here.

While it is useful to learn these topics eventually, some find it better to learn them when the necessity becomes manifest in practice. If that is your case, come back here later as needed.

Calculus:

Introductory linear algebra:

Rigorous linear algebra:

Numerical algorithms:

6. Engine Programming

With the fundamental knowledge learned so far, you know enough to finally consider engines.

General

Rendering

Rendering is one of the most important parts of an engine. There are often specialized roles for rendering, as opposed to generalist engine programmers. However, even as a generalist, you need to know the basics.

Introductory resources:

Reference that covers a lot of topics:

Resources for path tracing, useful to understand how rendering works by doing it all in software, without using the GPU:

Online tools:

To use the GPU, you need to go through a graphics API. OpenGL and Direct3D 11 are the easiest to start with. Their successors, Vulkan and Direct3D 12, are more complex, but these are what modern engines use because they allow building multiple command buffers in parallel with multriple threads. Below are resources for these APIs.

OpenGL:

Direct3D 11:

Vulkan:

Direct3D 12:

To understand the abstractions provided by the graphics APIs and use them most effectively, it helps to also learn about how GPUs work:

Physics

The most relevant field of physics for games is classical Newtonian mechanics, in particular rigid-body dynamics.

Chris Hecker has a list of resources: Physics References: An Annotated Bibliography for Rigid Body Dynamics.

Introduction to dynamics:

In-depth dynamics:

Collision detection:

General introductory physics resources, not meant specifically for games or simulations, but with high quality explanations:

Networking

What is Rollback Netcode? by Muno illustrates rollback netcode using gifs. It gives an intuition for some of the problems that networking can face in games.

Glenn Fiedler wrote many articles about networking in different series.

Libraries

There are notable libraries known to be used by some engines. They satisfy requirements such as ease of integration, ease of debugging, good performance, …

7. Starting on Your First Job

You do not need to know everything about engines to start working as an engine programmer. And when you start, you will then be learning even more on the job.

Mike Acton gives his advice to new engine programmers in his talk Solving the Right Problems for Engine Programmers.

An engine can be a very large program, and learning your way around your company’s engine can be intimiading. Jeremy Ong gives advice in Grokking Big Unfamiliar Codebases.

Jeremy Ong also gives an overview of the important lenses through which he evaluates engines: How I Evaluate Game Engines.

Misc links

FAQ

Q: How were the resources listed here chosen?

A: I used many of the resources myself when learning. Some have been recommended by other people, in which case I check that they are relevant, that they meet quality standards, and that they fill an obvious gap. I avoid adding many redundant resources, if I find a better one I replace the previous one.

Q: Is engine programming right for me?

A: If you just want to make games, you can use an existing engine such as Unreal. On the other hand, people drawn to making engines are in it for the pleasure of low-level programming, of knowing how everything works, of doing things themselves, and of achieving high quality results. You may find the resources listed here useful even if you do not plan on becoming an engine programmer.

Q: Who wrote this page?

A: I’m Radek Jurga, I work as an engine programmer. I studied physics and then learned programming on my own, using many of the resources listed above. I initially wrote this page for a friend who I was mentoring. At the time, he was a physician, and using this guide he succesfully changed career to AAA game development. I joined the same studio and we now work together. This page is online in the hope that other people will find it useful too.