Tip: Easy method to display different geometry and materials on specific hardware

For anyone looking for a straightforward way to display different geometry and materials on say ES 2.0 vs ES 3.0 devices, here is how we did it.

Benefit: Assets can be optimized for specific hardware, so you don’t need a one-size fits all approach
Drawback: This disables the LOD system, so only one level of LOD is visible at all times

Here’s the magic command: r.forceLOD can be used to strictly enforce a specific static mesh LOD level globally (I assume this was used for testing purposes only at Epic).

We use +CVars=r.forceLOD=0 on all metal/ES3 level devices and +CVars=r.forceLOD=1 for all lower-end devices in our DefaultDeviceProfiles config.

LOD 0 meshes are use lit materials and cast shadows, and use additional effects such as normal maps and metallic effects. LOD 1 meshes use unlit materials and pre-baked lightmaps (polycount isn’t an issue so we didn’t change meshes, but that could be done) with no shadow casting.

This can be as granular as you need; additional LOD levels can be created and used that could be optimized for even lower-end hardware or for more advanced effects on the high end.

The downside here is that it overrides the LOD system, so only 1 level of LOD is visible at all times, and no transitions are possible between LOD levels. In our case we use a fixed camera and all geometry is at relatively the same distance from the camera, so additional LOD levels aren’t required. For games that need to use LOD transitions to optimize distant objects this method would not be ideal.

Oh great. Subscribing to this so i never forget.
Hopefully Epic devs will leave this nice thing in.

And indeed most games on mobile have topdown (or isometric/side cameras), its because tiny screens, 3d controls are hell with touch interface.
Originally we did some LODs for meshes but it does not improve a lot, limiting number of alive actors on map however made our bottom device to get into 50-60fps from mere 25.
All while lod or no lod had effect of 5 or so fps.

For mobile games handling well what game loads and destroys has much bigger impact on fps.

True, although it depends on the game. Our game is very simple in terms of logic, so the main optimizations came from material and mesh optimization (we were GPU bound). For ES 2.0 devices we saw the biggest improvement by switching materials from lit/shadow casting to unlit/fully rough (went from 10fps on iPhone 4S to 30-40fps).

For ES 3.0 devices we can now basically use the full UE4 material path, with roughness, metallic, normal maps and dynamic lighting with shadow casting enabled without affecting the ES 2.0 assets.

ES 3.0 is great, but that limits number of target devices a lot. We do current game for current medium range device. But next project probably will have es3 version.

Also i am not sure if its just our optimization, or epic did a lot of under the hood magic and everything runs much better on mobiles now in 4.7.

Yeah, 4.7 was a great update, and 4.8 is looking really good too. What techniques did you find most helpful when you were optimizing your game?