Ok, took a little longer than I thought but here it is for you EvilHobo.
First of all, I was pleasantly surprised when I opened the map in the editor because you've done a lot of things right. I also like the amount of research and detail you've put into the map, so kudos for that.
This might seem a little unorganized but I'm writing these down as I see them. Bear with me and feel free to ask about specifics or why I said something. Also, I apologize if this doesn't make sense to anyone other than EvilHobo but I felt it was best to post it out in the open so other mappers could contribute. Here goes...
This is all from RO-Kriegstadt_Beta2.rom file.
First thing I did was check the overall stats for the map to get a sense of what I was looking at. I can safely say that you've gone overboard in quite a few places but don't worry, they can be corrected! Leningrad_Beta2 was also quite bloated, probably even more so!
Total Brushes: 3383
Total Staticmeshes: 4191
Total Anti-Portals: 26
Total Emitters: 26 (including 3 FireLarge emitters)
Fog Distance: 20500 UU
Average StaticMesh Triangles: 60k (max 120k at bridge)
Average MaxTextures: 125 (max 200 or so)
Particles: 50-175
TerrainSectors: (450 max)
Terrain Triangles: 15k average, 75k max
StaticMesh Triangle ms: 3 - 5
BSP Render ms: 0.5 - 1.5
Setup ms: 5
Traverse ms: 4 - 5
This is just a rough estimate but here's what I would be concerned with in general. I'll give you a list of specific offenders near the bottom of the post.
Your biggest problems with performance are most likely coming from the very high BSP and SM counts. I would aim for a goal of 2000 brushes and no more than 3000 staticmeshes.
Anti-Portal number is fine, although some of them could be improved in various ways, more on that in a bit.
26 emitters is normally fine but in your map this is too many. The reason for this is that almost all of your emitters can be seen from great distances and also create a lot of overdraw (eg. the dust emitters).
Fog Distance is a good number I think, no issues there.
Staticmesh triangle count throughout the map is really low actually, but they take a lot of time to render because there's an insane amount of them coupled with the fact that you've used a high number of different statics (eg. using 5 tree meshes when you could get away with 2). The bridge area will need some work because 100k SM triangles is pushing it when you have so much else going on as well.
MaxTextures is a little on the high side, 100 unique textures in view at once should be the end goal. This can easily be corrected by removing unneeded statics and textures that are only used a few times in the map. This will also help cut down on the size of the map greatly.
For the most part your terrain is fine, however, in some places you have up to 450 terrain sectors! This is really a high number and it is caused by the setting TerrainInfo > TerrainSectorSize: 8. I could attempt to explain what TerrainSectorSize does but UDN already has a section on it that does a pretty good job. Basically the terrain is being culled in blocks of 8 in your map when it should be in blocks of 32 or even 64 so the engine doesn't have to keep track of so many sectors being culled/rendered. I would test out different numbers with "stat all" on and see which gives you the biggest FPS boost. You can judge the performance by looking at the Terrain Render ms number as well.
http://udn.epicgames.com/Two/LevelOptimizationTerrain.html
Your terrain is a little on the detailed side for a map of this size but you can't change that now so I would suggest using it to your advantage. For example create more shell holes with terrain, more small clumps in the street, alongside buildings, etc. This will make the map look more detailed and cost nothing more towards your performance. You can also use terrain to reduce the number of brushes and statics in the map. For instance you could cover the base of some planted trees to get rid of the base tree-pot static or cover a sidewalk brush with terrain debris and then delete it. Lastly, 5 terrain layers is probably perfect for the map, no need to reduce those.
Ok, now onto the specifics. Let the fun begin!
(note: to find a specific actor use the "Search for Actors" function (binocular icon top left under "Build")
-
Cull distances! One of the biggest things hurting your map at the moment is the lack of cull distances for high-poly statics! I know it's a ton of work to check each individual staticmesh and place a cull distance on it but this step will greatly improve the performance of the map, especially around the bridge area.
- Remove collision on all objects that will never collide with the player. This means building facades, high windows, emitters, bushes, etc! For example, find StaticMeshActor4670. This staticmesh doesn't have a proper collision model made for it which means collision is handled on a per-poly basis! That means all 3000+ triangles are being considered for collision when this particular mesh isn't even in the play area. On top of that this mesh doesn't have a cull distance set so players have to render it for extended distances. Set the cull distance to 14000 and all of the collision fields to False.
- Very few of your emitters have cull distances, make sure those are set! Also, your main smoke emitters have 20 particles each, you can get away with just 10.
- StaticMeshActor42 has an improper texture set to it.
- Delete StaticMeshActor16 (hidden under terrain).
- StaticMeshActor3100 and StaticMeshActor3098 are too high poly for outer meshes, use a 2D facade instead. There's also a ton of this type of mesh used outside the play area, I would replace them all with 2D meshes.
- Brush146 isn't needed, you can cover the exposed bits with terrain and delete it.
- StaticMeshActor1020 is embedded into the terrain too much, I would delete it or move it out so it can be used as cover.
- StaticMeshActor1649 are some stairs that lead to a blocking volume. Block the stairs with something.
- You have 48 SMs in your SkyBox, you should combine the building facades into one and turn the collision off.
- AntiPortalActor26 doesn't really cull anything so you could delete it. Same thing for AntiPortalActor14, AntiPortalActor3. All the rest look ok but you should really extend them downwards another 1000-2000 UU to make sure they occlude everything.
- Delete StaticMeshActor1231 (outside play area/hidden). Also, this mesh is very high poly and has an un-optimized collision mesh so you may want to replace it throughout the map.
- StaticMeshActor1488 is a tree type that is only used 4 times in the entire map. I would replace it with another, more commonly used tree.
- StaticMeshActor980 can't really be seen from the play area, you can delete it (along with a few surrounding statics).
- StaticMeshActor667 cannot be seen. Delete it and the 4 closest roof meshes.
- StaticMeshActor4286 and all matching statics (white factory door, used only 4 times in the map) should be deleted or replaced with more common statics.
- Find StaticMeshActor4304 This type of chair is only used 11 times, consider replacing it.
- Delete StaticMeshActor4270 (hidden).
- You've used a blank grey texture for the outer BSP walls that cannot be seen by players, which is good but there are still many that remain textured (including roofs and other areas). Remember to keep setting them to Unlit.
- Find StaticMeshActor952. This cart is only used twice in the map and is fairly high poly so I would delete/replace it.
- Find StaticMeshActor2583. Although these building arch statics can be seen from a great distance you can safely set the cull distance to 8000 or so because they blend with the grey concrete wall.
- Brush4343 and the two beside it could be combined into one without losing any detail.
- Go into Wireframe mode and take at look at the Hotel objective. You should notice just how many staticmeshes are being rendered. Be sure to put cull distances on all of them! Do the same for each building and your map will run a lot smoother. Someone looking at the Hotel from down the street shouldn't be forced to render all the decoration statics inside.
- Find StaticMeshActor877. The one side of this mesh is meant to be against a wall so make one out of BSP to cover the holes.
- Try to combine (preferred) or simplify the broken wood statics because you're using ton of them throughout the map. If players won't notice them they don't really need to be there (eg. StaticMeshActor532).
- Personally I would replace all of your portal textures with a solid grey/black texture instead of the transparent blue because it causes a lot of rendering issues/hall of mirror errors when viewing from the editor. Just personal preference I guess but if you want to change them simply select one and press Shift + T to select all the matching textures in the map.
- As I mentioned before you have a ton of textures and statics that are used only a few times within the map. Select a SM, right click > Select > Matching Static Meshes and see how many there are (F4). If it's less than 15 or so consider removing or replacing them with a more common mesh.
- The custom graffiti texture can be DXT1 with Alpha instead of DXT5. You also could have gotten away with it being 512x64 but no big deal.
- Use the "InUse" tab of the Texture Browser and look for textures with less than 15 instances in the map. Try to remove some that you don't need.
- Find Brush372. What's going on here? Replace all of these zone portal brushes with a single rectangle one. This will help cut down on total brush count and is probably the reason why this zone isn't working.
- Find Brush139. I would highly recommend not using this method/shape for BSP subtractions. This can cause BSP errors. Stick to using Spheres if possible.
- A lot of your buildings have a ton of separate window meshes and BSP cutouts. I suggest that you increase the destruction on these buildings so you don't need to have so many windows. You should also continue to combine the statics wherever possible. This is probably the biggest contributor to the bloated SM count in the map.
- I notice that none of your custom statics have collision meshes or proper Material usage, so I assume you don't have a 3D modeling program? I would strongly recommend getting access to Maya or Max because your building meshes are unoptimized. To see what I mean find StreetRubble1 and click the little + sign beside "Materials" at the very bottom of the SM Browser. You'll notice that there's 97 different materials being used (!!!) for that one mesh even though you're only using 2 texture types. This is a problem with creating combined statics from within the editor. Additionally all of your meshes are using per-poly collision instead of an optimized collision mesh (usually created in a 3D app).
- Find StaticMeshActor10049, only two instances. Remove/replace.
- Russian Spawn 7 is fairly exposed but even worse is the fact that there's absolutely no BSP occlusion. Always hide your spawns behind some form of BSP block so that AFK, newly spawned players, and idle vehicles are hidden from view of other players in the battlefield. I suggest making that small mound of rubble much larger and sticking a BSP block inside. Always make sure your spawns are behind BSP to help keep the network traffic down.
- Find Brush1309 and delete this group of brushes (hidden).
- A lot of your destroyed vehicle meshes are only used a few times. Try to remove some and reuse the rest as much as possible. To make each one look like a new mesh you can cover half of them with terrain, have one on fire, etc (for example there's 4 Tiger meshes on Danzig but nobody really notices because none of them really stick out).
- Delete StaticMeshActor2598 (hidden).
- Find Brush2423 and delete this group (hidden).
- Find StaticMeshActor1493. This rubble mesh is fairly high poly so you might want to replace it with the rubble pile from Leningrad (also has a better collision model).
- Find Brush2944. I can just imagine the nightmare this building must have been with all the BSP holes it probably created. You should turn this into a staticmesh asap because it's probably causing a few holes still (and using a lot of brushes).
- Find StaticMeshActor1513. All of these bushes should have shadows turned to False and set to Unlit/ScaleGlow 0.5 (or you can just try turning the AmbientGlow up to 30 or so). Either method should stop half of the leaves from being blackened.
- Find StaticMeshActor1477. This type of tree is quite high poly for such an open area, consider replacing it with a lower poly model if you can.
- Find Brush1493 and delete this group of brushes. I understand that you're using these to create statics from but they should be cleaned up once the map is ready to be released. If you need to save them just create a test map and transfer the brushes there.
- Find Brush3082. This group could be combined into a single brush. Turn them into Addition brushes and then use the intersect tool to create the builder brush shape.
Phew, ok I've got school tomorrow so I need to stop. This map really reminded me of what I went through to create Leningrad so I hope you can learn something from my mistakes.
I believe Leningrad_Beta1 had about 10 000 individual statics mostly due to all those blasted windows! For your next beta version I would try to really focus on optimization because I think the gameplay is fairly good at this stage (even though I haven't played the map or RO much lately). I cannot stress how important combining statics and putting proper cull distances on everything is for optimization! This alone will increase the FPS and allow you to add more detail into the map.
If you want to decrease the size of the map and make it more enjoyable for players who have precaching turned off go through the map and remove any unnecessary textures/statics that are only used a few times. There's not really much sense in forcing everyone to load up a toilet mesh if it's only going to be used in two bathrooms off in some far corner of the map.
I hope this helps. If you, or anyone else, have questions or want me to clarify something let me know. Obviously I didn't list everything here but this should give you a good idea of what to look out for when optimizing the map. Once again, great work on the map EvilHobo and sorry for creating a ton of new work for you to do.