Analysis of Epic Citadel from a Graphics Programmer's Perspective
I might be a little late to the game, but I found Epic Citadel quite an amazing work of engineering and art. Here, I’ll breakdown some of the engineering aspects I’ve noticed that makes something like this possible:
- Textures, textures, textures! The lighting is static, and baked-in very nicely to textures. The texture detail on models is quite high: an exception is some of the outdoor areas, where they use repeated textures to save memory. For lighting in these areas, they may have 2 textures and blend them together (lightmaps), or perhaps just use custom textures for the patches with shadows. My guess would be lightmaps - one of the new features in Unreal Editor 3 was support for generating lightmaps. For performance, I would be extremely surprised if Epic was not using texture compression with PVRTC.
- Minimal pixel shader usage. I couldn’t even tell if there was a posteffect render stage. Pixel fillrate for mobile devices is not spectacular, I didn’t notice any bumpmapping. They get away with this because of using fixed light sources, and so they probably do high quality raytracing when they do texture burn in.
- Semi-stateless particle systems - animated trees don’t need to be animated if out of view. The state of animation can probably be found just by solving for time - the trees had an oscillating path, as well as the birds, and perhaps the water. Fully stateless particle systems are nice because you can update in a closed loop on the GPU without transferring to the CPU. This probably isn’t done on mobile devices, and it’s generally nicer to interact with the particles, so instead it’s probably implemented using ARM’s SIMD vector intrinsics called Neon.
- Billboards - whispy trees viewed from afar appear to be billboards when close up. Billboarding is a very good technique for introducing visual complexity to your scene without dramatically increasing vertex count.
- “Low” FPS. I don’t have a camera fast enough to measure FPS, but I suspect it is closer to 20 than 30. If your scene doesn’t change much, it doesn’t matter as much! There is a certain amount of egoism involved in having your game run at 30 or 60 fps. Above 60fps, and not only will most monitors not actually display higher frame rates, but you perceptually wont be able to notice the difference (unless its something like a spot-the-screen-flash-black game). At SIGGRAPH 2010 Dmitry Andreev presented an interesting paper where he used some vision/image processing algorithms to provide smart interpolation between frames. He was able to upsample from 30 to 60 fps quite well. How much FPS correlates with game enjoyment is an interesting question, and probably depends on content. I remember playing UT99 very successfully at around 12-20 fps back in the day…