Search public documentation:


Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 Home > Performance, Profiling, and Optimization > Content Profiling and Optimization > Optimizing Content for Splitscreen

Optimizing Content for Splitscreen

Document Changelog: Created by Daniel Wright.


Note: This page is targeted toward current generation consoles like Xbox 360 and PS3, the tradeoffs may be different on other platforms.

Splitscreen hits the rendering thread hard since twice as many things have to be drawn. There are two main costs on the rendering thread: the number of primitive components that have to be considered for rendering or "Processed Primitives", and the total number of draw calls used to render visible meshes which is "Mesh draw calls" in the stats. Not all draw calls are equal however. Particle draw calls are ~3x more expensive than static mesh and BSP draw calls, and dynamic objects like InterpActors, KActors and SkeletalMeshActors are ~2x more expensive than static mesh and BSP draw calls. Mesh emitters generate a draw call per particle so they tend to be the most expensive assets in a given scene.

The best stats for seeing how splitscreen is going to perform are accessed via 'stat splitscreen' on the console while in splitscreen. This works in PIE, you just have to enter 'debugcreateplayer 1' to enter splitscreen. You can either have two controllers connected or use 'ssswapcontrollers' to switch input to the other player. Here are the stats from a Gears 3 SP level before optimization:


The above stats resulted in a 50ms rendering thread time on Xbox 360. In order to get this down to the target of 33ms in splitscreen, they need to be about:

  • 1600 for Mesh draw calls
  • 1700 for Processed primitives
  • 150 for Particle draw calls

Find the Most Expensive Components

First you will need to know which parts of a level are over budget. This can be done by playing through in PIE or Xbox splitscreen with 'stat splitscreen' enabled, and comparing to the targets above.

For static mesh actors, the primitive stats browser is probably the best tool. Note that you can sort by bounding radius to quickly find the smallest meshes in a level. You can also multi-select rows and press enter to select all relevant actors.

For particles, you can gather stats about which emitters and particle systems are the most expensive by entering the 'TRACKPARTICLERENDERINGSTATS' console command, then playing through the level, then entering 'DUMPPARTICLERENDERINGSTATS'. The command will dump out two spreadsheets to the local logs directory with particle stats.

Scale Content Down for Splitscreen

The best method is MaxDrawDistance on primitives or using cull distance volumes setup aggressively. MaxDrawDistance can cause popping, but it is less likely to cause issues than setting detail mode because the meshes will always be rendered from up close. The downside of MaxDrawDistance is that it only reduces the 'Mesh draw calls' stat and not the 'Processed primitives'. UDN doc on setting up cull distance volumes here: VisibilityCulling.

The next best method is setting a component's DetailMode to High, which will cause it to not be rendered at all in splitscreen. This can be set by right clicking -> LOD Operations -> Set Detail Mode -> High. You have to be careful when using this however to not cause noticeable artifacts due to either the mesh leaving a dark spot in the lightmap or creating a hole through which characters will pick up outside lighting. You can preview what will show up in splitscreen either by going to View -> Detail Mode -> Medium or by going into PIE and entering 'debugcreateplayer 1'. Removing components in this way is the most effective for performance, because it reduces 'Processed primitives' and 'Mesh draw calls'.

Particle emitters (columns in Cascade) have a new property called MediumDetailSpawnRateScale. This can be used to either reduce the particle count in splitscreen, or to disable the emitter altogether if set to 0. Mesh emitters generate one draw call per particle, so scaling down the particle count on these will have a big impact. On any other type of emitter, there will only be a decent performance saving if MediumDetailSpawnRateScale is 0.