You need to learn deeper
My goal is to be a good game developer, and the means for it are very diverse. Most people say: "specialize in a field so you can be useful", which is kinda true in the industry. If you're an AI expert or something you probably have precious skills that others won't have.
But here's the thing: Being "just" an AI expert doesn't have much sense. Games are creative projects and they are a big mix of tons of artistic and technical fields. I think it is really important to better understand how everything fits together, whatever your part of the project is, and especially if you work alone or in small teams (obviously).
Now a little disclaimer: This is not meant for people who just want to get started in game dev. This is meant for people who already made games, and are starting to realize that they actually need more knowledge on some things to be able to realize their projects properly. This post is only about the programming side of things, which is one of the crucial elements you need to master in order to push your projects as far as you want. I plan on writing a separate post for game design informations later.
Really, most of the things that happen in a game engine are obscure to most of us. They are obscure, but they are extremely important. If you want to make great things, you have to understand and even master what you are using. And this may be harder than you think:
- Do you know the maths behind vectors and matrices? Would you be able to program yourself a lite transformation pipeline?
- And what about graphics programming? Do you know how vertex are processed? Would you be able to write a simple soft renderer? (3D using the CPU)
- When you're using high level languages (especially untyped), are you sure what you do is compiled in an efficient way?
Even if you don't like programming that much and only want to make games, problems requiring knowledge of the lower level notions will come sooner or later. If you develop a game by yourself you will have to write shaders, hack physics to have enough performance, and other tricks.
There are countless scenarios where all sort of knowledge is important and my point is: You have to learn how these things work. You can't just stop at the first thing you've learned. Try lower level languages, look how physics engine are built, and understand graphics pipeline. Read open source code and see how games are developped by others
Here is a list of things I have recently worked on, or that I plan to work on, which I think are really important to become a better game developer:
- Make a software renderer - This is really useful to understand all the concepts of vertex transformation, perspective projection and so on. There is this tutorial which can be a good start.
- Go over OpenGL (or DirectX) as far as you can because it is kind of the central point of modern 3D games. At the bottom of this post is a link to a list of graphics programming books. I was also pointed to open.gl which is a pretty good getting started in openGL, abstracted from platform details.
- Gameobject hierarchies: There are different ways game engines are implemented, but all of them have a way of organizing game objects. This is a central piece of the way your game will be developped, so it may be a very valuable thing to experiment with. Maybe build your own quick scene graph, or try to build an Entity System?
- Physics engine - While it is near impossible to write a competitive 3D physics engine alone, you can always read how they work or maybe for a simple alternative, build yourself a 2D engine. At least read the doc of the physics engine you are using, because if not used properly these things can kill the performance of your game or generate weird bugs.
- Using a very low level language like C++ is a good experience to have, it makes you understand more deeply how things are managed (for example memory allocation) and how your code affects that. It may be nice to create a project with that, just for the programming experience
- As a more general computer science foundation I'd advise you to give a look at Nand 2 Tetris which is a really really awesome project by MIT - The goal is to understand how computers, operating systems and programming languages are designed, by creating all of that yourself. If you've always felt like you miss a part of the picture, this course provides every level of zoom from basic electronics to high level scripting language. This is not game development related but understanding your platform is always a good thing to do.
There are many other things useful to study not mentionned here. At the top of my head:
- Network Programming
- Operating Systems (how they work and how to work with them)
- Gameplay Scripting (for game engines)
Here are also some additional links I think are very good:
Game Programming Patterns A sort of online book written by a guy that tries to go over some widely used game programming concepts. Some may be obvious to you, some new, depending on your experience. Always good to check.
The computer graphics library By Fabien Sanglard is a pretty big list of graphics programming book. If you ever need more information about graphics programming this place is probably a good start. He also writes great game engine code reviews on his blog that are worth checking out.
Books for Game Developers In the same kind as the previous link, a pretty big list of books for game development and related fields.
If you can manage to get a good knowledge (and experience, which is the most important of course) of all these things, then you are well armed for projects. You can always specialize later if you want.
As many say, tech isn't everything. But it ain't nothing either. Elegant and powerful technology leaves place for as much elegant and powerful game design. The more your tech is well designed, the better you will be able to experiment with your gameplay.
If you think there are other things important to learn for us please tell me in the comments. I'm always looking for new things to learn