Red Orchestra 2: Heroes Of Stalingrad/LevelDesign/OptimizationGuide
Recommended Reading
If you are new to optimizing in general for Unreal 3 games please have a look through the below web pages so you are up to speed with the grunt work.
Introduction
The purpose of this document is to give information on the guidelines used to optimize the maps inside RO2. These guidelines worked for us. If you are a community level designer and/or artist you may find this document useful. This document will cover the various approaches and the reasoning behind decisions so that the reader may be able to avoid pitfalls when making levels for Red Orchestra 2.
Preliminary Work
There is a small amount of setup work that must be completed.
RODebugPosedPlayer
We have made a tool for level designers and artists that are used to gather statistical data about maps called Posed Players. The purpose of the Posed Player is to have a placeable actor to simulate a player in a scene. It has the capability to be used as a camera during profile stage. All of which I will go over now.
Actor In Tree
The RODebugPosedPlayer actor is found at Actor -> RODebugPosedPlayer
Properties
- Pose: The pose, or stance, the posed player will be in when spawned
- Weapon: The weapon the posed player will be using when posed
- Pawn Type: German or Russian
- Can Possess: Allows the user to possess this posed player using the PossessPosedPlayer console command
- Description: Small description on what this posed player is - OPTIONAL
Available Poses
The pose will not make a difference in regards to performance and optimization. It was added so if you wanted to stage a scene for screen shots or something along those lines, this allows you to put the posed player into various positions.
Can Possess
Placing RODebugPosedPlayer Actor in Map
Posed Player Placement Guideline
- Expected player count is 64 player which would be the worse case scenario in regards to performance
- Use Can Possess on posed players that have vantage view on a particular high traffic area/areas of performance pits
- Any particular player SHOULD NOT see 100% of the map nor players
- Place the actors where players will be
- Do not unnaturally bunch up the posed players
- Distribute the posed players evenly across scene
- More actors near objective spaces, spawn areas, and known fight spaces
- Position RODebugPosedPlayers ~16 Unreal Units above surface to avoid posed player clipping/failure to spawn
Create a NEW sublevel
Naming the Sub Level
Give the sub level a name. It really doesn't matter what you call it as long as you know what it is.
Setting Streaming Method
We always use Always Loaded so that every time the persistent is loaded, so is this sublevel. Done this way there is no need to have Kismet handle it.
Options:
- Kismet- Used when you want to use a Kismet node to stream in the sub level.
- Distance- Used when you want to use a certain distance.
- Always Loaded- Used when you want the sub level always loaded when the persistent is loaded.
Making New Sub Level Current
Make the new sub level current and we are ready to start placing actors.
Results
Doing the Profile
I will document what was done at TWI. Our profiling parameters and data gathering points were specific to our needs for our designs.
Profiling Machine Hardware Specifications
These are the specifications of the test machine used at TWI
- Intel Quad 2.40GHz
- 4GB RAM
- ATI Radeon HD 5800
- Test Done on High Settings
Console Commands
- SpawnPosedPlayers
- PossessPosedPlayer
Polling the Results
- Location @
- Frame Time
- Game Time
- FPS
- Draw Time (ms)
- GPU Time (ms)
- DrawPrimitive Calls
- Triangles Drawn
- Static Mesh Tris
- Skel Mesh Draw Calls
- Per Object shadows
- Preshadows
- Adjusted FPS