Every year at Quakecon, id Technology Magician John Carmack gives the keynote address. As I did last year, I’m going to watch the whole speech and make a few notes and observances along the way. Unlike last year, the speech is over three hours long. So This might take a while. As of this writing, I haven’t listened to the whole thing yet.
Here is the full speech. I’ll link to individual timestamps below.
This video thumbnail is better than last year’s. It sort of looks like he’s about to cast magic missile.
My overly brief review of Rage is here.
It’s interesting to hear him talk about the game so openly. Most companies do not do this. Most companies tell their programmers to keep shut, and send out shills to say things like, “We’re very happy with how Shoot Guy III is performing and have full faith in the development team.” Then they lay off half the team, cancel Shoot Guy IV: Shoot Harder, and assign the remaining personnel to making a crappy movie tie-in. Honesty is antithetical to people who want to steer the conversation, and it’s only because Carmack has so much pull that he can make this happen.
I’d love to have a more open, honest dialog between the people who create the product and the people who consume it. I understand why this doesn’t happen, but I think the benefits would outweigh the downsides. Our current culture of spin, deliberate “leaks”, and managing access for puff-piece exclusives is bad for everyone. Changing this would require changing the culture that underpins the business, so I’m not holding my breath.
I’m just saying: From an engineering standpoint there’s incredible value in being able to look at a mistake and saying “We screwed up”.
Carmack apologizes for the PC problems at the launch of Rage. Half of all PC players couldn’t play the game? I didn’t realize it was that bad. This might have been the first time I didn’t get an id title at or near launch, so I missed out on these problems. As I understand it, id was doing their internal testing on graphics drivers that their customers didn’t have, and Carmack goes on to explain how they made that mistake.
Having played the game well after launch, I didn’t see most of these problems. I will say that while it’s tough get consumers to understand why “runs smoothly at 60fps” should be a selling point, it really does make a difference to gameplay. I don’t think I can reliably tell the difference between 30fps and 60fps, but I can feel uneven framerate and hitching.
He’s talking about the fact that Doom 3 weighs heavier on your graphics card than Rage, even though Rage is seven years newer, which is more than an entire graphics generation ahead.
Most people just think of graphics cards as just this single spectrum of power. More expensive card = more power. But depending how you divide things up, there are three different aspects to the power of your card: Memory is a measure of how much texture data you can use, which lets you have larger resolutions and more detailed textures. Speed is obviously a measure of how fast the thing can draw pixels, which directly impacts the framerate. Throughput is how fast the card can talk to the rest of the computer, which is either irrelevant or critical, depending on the type of rendering being done. If the scene has a lot of dynamic, changing stuff in it (like many animated figures) then it might need a ton of throughput. If it’s mostly a static scene (a Minecraft world with monsters turned off) then it might need almost nothing. Throughput is generally driven by bus size, which you might recognize as a bunch of inscrutable and unexplained acronyms if you’ve ever shopped for a graphics card: PCI, AGP, PCIe, etc. Drivers also impact just how quickly the data can be moved from main memory to the graphics card.
On the PC, different cards have different strengths in these three areas. On the consoles, throughput isn’t as much of an issue since the GPU isn’t a graphics “card”, but just another processor that shares a common pool of memory with everything else. It’s the difference between a couple of office workers collaborating through the internal company mail system versus those same two people being in the same cubicle farm. They might be slow employees, but they don’t have to worry about waiting for things to go through the mail. Again, this is either critical or irrelevant, depending on what you’re trying to do.
When Carmack talks about “passes” he’s talking about rendering passes. Doom 3 does a lot of rendering passes, which is why it burns more GPU power than Rage. In a single-pass environment, you send a polygon off to the graphics card to be drawn. Then it’s done, and you move onto the next one.
In a multi-pass environment, you will need to draw the same polygon many times. In the original Quake, the game would draw all of the walls at full brightness. Then it draws them again, but instead of rendering the textures (riveted metal, blood-stained stonework, etc) it drew the patterns of light and darkness that formed the shadows. By blending these two passes together, you wind up with walls with light and shadow.
It gets more complicated. There are “texture passes”, where you send a polygon once and the GPU blends several textures together at render time. Think of this as a painter making a single brush-stroke on canvas. Imagine if they could somehow load their brush in such a way that they could paint with two distinct colors at the same time, in the same stroke. This is faster than making multiple strokes, but there’s usually difficult and chaotic limits to how many texture lookups you can do at one time. (How many different colors of paint you can stack on the brush.)
If you run into this limit, then you end up needing to do multi-pass rendering. That’s where you send the exact same polygon off for rendering a second time but with different texture values. That would be like lowering your brush, cleaning it off, and then repeating the exact same stroke with different paints.
Maybe one graphics card lets you use eight different paints in a single stroke. Another only allows four at a time. Your project requires seven. For best performance on all systems you need to have two different rendering pipelines: One that does the whole thing in a single pass, and another that does it all in two.
He says that Rage draws everything in one single pass, with a pre-pass.
I don’t know what a “pre-pass” is, but I imagine it’s lighter than just a regular rendering pass. So Rage draws the whole world in a single rendering pass, or perhaps one and a half, if we want to acknowledge the pre-pass thing with a hand-wave.
Doom 3 does a pass “per light”. Back when I was fiddling with the Doom 3 editor, the docs clearly warned against having too many lights hitting the same surface at the same time. Play through the game yourself and you’ll see how many surfaces are lit with just a single spotlight. The whole game was speckled with spotlights that rarely touched one another. This is why. You need to do a separate rendering pass for each light hitting a single polygon. If a nutjob level designer aims four lights at a wall, then the game will need to render that wall four times.
This is very different from lighting systems of old, where it didn’t matter how much lights interacted. They were pre-calculated, so all lighting arrangements had the same render cost. The drawback was that the lights were fixed and you couldn’t move them around as the game was running.
Okay, so now we’re 1,300 words in and we’re at the eight minute mark of his talk. Let’s hope I don’t need to cover the next three and a half hours at the same level of detail.
C++ is a wonderful language for making horrible code.
Silver Sable Sucks
This version of Silver Sable is poorly designed, horribly written, and placed in the game for all the wrong reasons.
Silent Hill Origins
Here is a long look at a game that tries to live up to a big legacy and fails hilariously.
The product of fandom run unchecked, this novel began as a short story and grew into something of a cult hit.
Starcraft: Bot Fight
Let's do some scripting to make the Starcraft AI fight itself, and see how smart it is. Or isn't.