In the second of my two-part article on managing the milestone development process, I discuss the reasons why a milestone may be rejected and how to handle the situation. You can read part…
If you previously followed Code Build Opt Part 4 then you have yourself a fantastic project that incrementally links and everyone is happy… there is a gremlin in this machine however.…
In performance-sensitive applications like games it is crucial to access data in a cache-friendly manner. Especially when dealing with a large number of objects of the same type, e.g. individual…
Stephen Hill and Daniel Collin 1. Introduction With the complexity and interactivity of game worlds on the rise, the need for efficient dynamic visibility is becoming increasingly important. As luck…
One of the main complaints about the STL is the perceived lack of memory efficiency. In this article I’ll present a simple pooled allocator for use with the STL containers that allocate single…
Obligatory Introductory Parable I really like Sushi, it’s tasty and convenient. I like the immediacy of being able to go into a Sushi restaurant complete with conveyor belt and being able to…
I wanted to expand on something I thought of while writing my thoughts on the SceneTree. Before I made the argument that transform update and animation should not be tightly coupled with…
(This is the second part of a three part series, here is the first part. )At this point we've established for the vast majority of objects in our world, a SceneTree implemented as a straightforward…
(This is the third and final part of a three part series. Part 1. Part 2. )We've established that a generic tree implementation is not a good choice for implementing the SceneTree data structure and…
This article explains how to set up a vector math library that performs mathematical operations on arbitrary sized float arrays or vectors. It can handle aligned and unaligned pointers with minimal…
I was kindly invited by Wolfgang from Confetti FX to speak at the FMX 2013 conference about physically based shading (within the scope of the Real Time…
Audio has been a neglected area of our game engine for a long time. Except for a few tweaks, we have essentially used the exact same code for all our games. A pretty simple channel pool with pitch…
In the last installment of this series, we talked about handles/internal references in the Molecule Engine, and discussed their advantages over raw pointers and plain indices. In a nutshell, handles…
Having finished the third part of this series about data ownership, we will turn our attention to performance optimizations and data layout again in this post. More specifically, we will detail how…
As promised in the last blog post, today we are going to take a look at how Molecule handles internal references to data owned by some other system in the engine. First, a quick recap of reasons why…
I’ve been thinking about the representation and loading of game data recently. This has largely been the result of stumbling upon a variety of blog posts and libraries such as:…
Some random rambling on the topic of returning error codes. Recently I've been fixing up a bunch of code that does things like void MutexLock( Mutex * m ) { if ( ! m ) return; ... yikes. Invalid…
One task that is pretty common in game development is to transform data according to some sort of hierarchical layout. Today, we want to take a look at probably the most well-known example of such a…
In the past few posts, we’ve been looking at Intel’s Software Occlusion Culling sample. This post is going to be a bit shorter than the others so far. This has two reasons: first, next…
Last time, we ended on a bit of a cliffhanger. We’ll continue right where we left off, but first, I want to get a few things out of the way. First, a lot of people have been asking me what…
Two posts ago, I explained write combining and used a real-world example to show how badly it can go wrong if you’re not careful. The last part was an out-of-turn rant about some string and…
This post is part of a series – go here for the index. Rants are not usually the style of this blog, but this one I just don’t want to keep in. So if you’re curious, the actual…
Ever wanted to know which parts of your codebase that keeps you from reaching the nirvana of 60 fps smoothness? Tired of not being able to pinpoint and replicate the use-case which causes your game…
Hello everyone. I wanted to show you something I’ve been working on last couple of FAFFs. The purpose of this post is to interest some of the technical types among you. If you don’t…
Recently, I was talking with some of colleagues about the issue with data initialization when booting your game. Mostly the issue with globals, and rules about how to shut them down, order of…
This is really more of a follow on from my previous article, Preparing for Parallelism. Some of the comments wanted more explanation, and an example of what I actually mean about the likes of…
There has been a lot of recent discussion (and criticism) on Data Oriented Design recently. I want to address some of the issues that have been raised, but before that, I’ll start with this…
CppClean attempts to find problems in C++ source that slow development particularly in large code bases. It is similar to lint; however, CppClean focuses on finding global inter-module problems…
Simpler programs are better programs. Today's target: strings. In this post I will show you three ways of improving your code by simplifying your strings.1. Use UTF-8 everywhere When I issue…
I want to back up and talk a bit about how threading should be used in modern games and what makes good or bad threading design in general. Games are sort of a weird intermediate zone. We aren't…
Motivation Recently, I worked on a code-base where everything was referenced by strings. It was quite expensive as you can imagine, so to avoid the cost of string comparison, hash values(ints)…
As promised last time, today we will see how pool allocators can help with allocating/freeing allocations of a certain size, in any order, in O(1) time. Use cases Pool allocators are extremely…
An operating system’s success is inextricably linked with the number and quality of applications that run on top of it. Linux and its variances between distributions, however, present ISVs and…
A vector field is a function that assigns a vector value to each point in 3D space. Vector fields can be used to represent things like wind (the vector field specifies the wind velocity at each point…
In my previous article about Warcraft I talked about the beginnings of a series that would come to define Blizzard Entertainment and lead it to being one of the best-known and most-loved game…
Back before the dawn of time, which is to say when PC games were written for the DOS operating system, I got to work on a game called Warcraft. I get to lead a project! While I had developed several…
... But didn't know to askMany intelligent, knowledgeable, and well-intentioned people tried very hard to help me make the switch to git, and I am grateful for their efforts. They helped a lot, even…
I’ve been writing about the early development of Warcraft, but a recent blog post I read prompted me to start scribbling furiously, and the result is this three-part, twenty-plus page article…
Porting your game to Native Client and Android just got a lot easier. The new OpenGL portability library ‘Regal’ emulates legacy GL features such as immediate mode and fixed function…
Most game programmers are familiar with the typical ‘game loop’. It’s usually broken up into two key stages, and looks like this: From a performance perspective, this is…