About Me
I've been creating levels using the unreal editor since 2001. I have worked on 2 professional titles and have modded for about 6-7 games.
Optimizing UE3 Levels:
Intro:
Optimizing levels has come a long way since Unreal Tournament 2004 so I decided to write up a short tutorial on a number of the changes as most of them aren't obvious and some aren't even used by Epic. This tutorial isn't to cover every technique that could be used in UT2004 but more about the things that are new for UT3.
Memory:
Backfaces:
Backfaces are surfaces that will never be seen by a player. When building levels for UT3 many surfaces will end up being covered by a static mesh or will have a side that faces away from the player at all times. Obviously you will not want that surface to be eating up memory it doesn't need to or reference textures that will never be seen. This is probably one of the easiest ways to optimize the memory of your maps and will also help a lot in the rendering side of things. In your generic browser open the engine package and look for a material named remove surface material. Now go into your level and select all of your backfaces and apply this material. This will pretty much tell the game to ignore this surface, no lightmap will be applied, any surface that has this applied will not be rendered. If you were to look at it in game all you would see is a solid black surface. You don't need to change the lightmap size or disable any other settings for it as the remove surface material does it all for you.
LightMaps:
Although an obvious thing for many mappers lightmaps can really eat up quite a bit of memory. You will almost never need to use a lightmap setting below 8. Another good thing to do is to go through your level and select surfaces that really don't have a shadow cast on them, or in other words a surface that is just dark or very bland in lighting. Most surfaces like this can be changed to a much higher lightmap such as 32, or 64.
Asset Usage:
When you are done with your level go into the primitive stats browser and look for static meshes that you are only using 1-3 times. If you find ones that are only used a few times see if it's really important that the mesh is even there or see if it can be replaced by a very similar mesh, or be removed all together. This is not extremely important but if you really want your map to have less memory loaded at any given time this could become useful. You should also go through your level and check to make sure that textures are not only being loaded once for any area that it's not all that important to utilize it.
Rendering:
DynamicShadows:
DynamicShadows should be disabled on every surface that a dynamic light will never touch. Even if a surface is not receiving a dynamic light but has acceptdynamiclights enabled it degrades performance.
Terrain:
When you create a terrain in UT3 it will LOD at ceatain distances, and while this is a good thing in some instances it has been found that disabling LOD settings in the Terrain will actually make them run faster then to have it enabled. UE3 requires more to calculate the LOD process than it does to render the terrain full quality the entire time. To disable it set both LOD settings to the same number.
SpeedTrees:
Turn off occluding on all speedtrees. Also be sure to turn off collision for speed trees if you can't reach or shoot through the tree at any time.
StaticMeshes:
An important feature that should be used when working with static meshes is the cull distance. If your working on a UT3 level it would probably be best if you just select all static meshes and tell it to cull at the same distance then go through the level and make sure things aren't popping out too soon. For smaller static meshes you can generally set it to a much smaller cull distance while the larger static meshes you might want to just leave at 0.
Another important feature in the static meshes is the occlude option. You may think that it is best to leave all static meshes to occlude but not rightly so. Make sure that all static meshes do not occlude except for the very large static meshes. If a static mesh is too small to occlude anything than turn it off. This is more to just take some calculating off of the engine as it no longer has to decide if a static mesh will occlude.
All static meshes should have CastDynamicShadows set to false. Unless your using a mover or specifically want a static mesh to cast a dynamic shadow than this should be disabled. This doesn't disable casting shadows, just dynamic ones.
Just like with Surfaces StaticMeshes should have AcceptDynamicLights to false if the static mesh will never get touched by a dynamic light.
Just like with UT2004 collision should be disabled for static meshes that can not be touched or shot through by a rocket or other projectiles.
Lights:
You really shouldn't need to put dynamic lights into your level.
Dynamic lights come at a huge rendering cost and can make the difference of
getting below 5 FPS with dynamic lights to 40-50 without them depending on the complexity of your level. If you really must use dynamic lights than remember that
the more static meshes with in the range of the dynamic light the slower it will render.
Misc:
Any material or static mesh that uses an unlit material should have
acceptlights, acceptdynamiclights, and castdynamicshadows disabled
entirely.