When starting to optimise in unreal it's a good idea to have a workflow and process to follow.
My Process
It's important to take metrics using the inbuild tools and other software like render doc to record and pinpoint areas of improvement. Use the unreal profiling tools to identify which parts of your game are causing the most strain on your CPU and GPU.
Take metrics. The first is to just keep your focus on Frame Render Time rather than the framerate itself. You can use commands such as 'Stat unit', stat fps, stat gpu, stat game and profilegpu to get an idea of what is causing the possible bottleneck. Set up a Notion page or whatever your project is using and make it accessible to everyone. Record everything here and document when large batches of assets were added and built etc.


The GPU visualizer and Statistics are your friends
When building a scene it's important to check the GPU visualizer (ctrl,shift and ,) regularly to see where the resources are being used and how you can manage them better.

Statistics (Tools > Audit > Statistics) gives you an in-depth review of all the assets in the scene, you can check a lot of important information here very quickly and is an absolute must for scene optimization.
Remove all of the unnecessary work first, then start to try to make the slowest function faster.

The Buffer Visualization will give you a quick overview of all render elements.
Light Complexity: check for too many overlapping lights

Lightmap Density (Red being a larger texture and blue is smaller)

Shader complexity. Check for overly complex Materials. Red is usually an issue. (This tree has some problems... )

Quad Overdraw. Multiple polygons are all overlapping and being rendered within the same quad, too much overlapping translucency or lack of LODs and maybe some distance culling can help
Assets
Optimize Your Assets: High-quality assets can add a lot to your game's visuals, but they can also slow down performance. Use Unreal Engine's LOD system to reduce the number of polygons in your assets when they're far away from the player, and use textures with lower resolutions to reduce the GPU load.
Ways to optimise assets after ingestion:
- Use Mip Maps and Texture Groups correctly.
- Maximum Texture Size will set a new in-game resolution.
- Edit selection in Properties Matrix. (Great for bulk changes)
- Reduce the poly count on assets in the engine by using Mesh details/ Reduction Setting / Percent Triangles

Duplicate Mesh Assets within the same sub-Level
Usually, when building out a scene after blocking, you'll be using lots of the same asset. This will add lots of draw calls and start to affect performance. Using the in-editor 'Merge' tool is great for creating collections of assets that you know will need to be placed around for set dressing. But also consider using 'Hierarchical Instancing'. I would recommend always keeping a backup of the un-optimized level or keeping the original assets set to invisible and hidden in gameplay. This is to avoid any unnecessary work when you're asked to change something on the level you just finished optimising. ><
Culling
Culling is a technique that prevents objects that are not visible from being rendered, which can help reduce the number of draw calls and improve performance. Use techniques like occlusion culling, frustum culling, and distance culling to optimize your game's performance. This can be done in a culling volume or individually in the asset's details panel.
Master Materials and Material Functions
Set them up as early as you can with the project. Optimise them and use them efficiently on all assets. Making one change in the master material will affect hundreds of assets. Yes, you'll be unpopular as the shaders will need to recompile but it's better than having to manually change hundreds of materials over and over.
Polycount and Texture Sizes
It's great creating 8k textures for beautiful 200k poly assets, but is it coherent with the game's release platform? Is it a character, hero asset, Mid-ground prop or a background environment dressing? Set up some standards and a pipeline to follow for artists at the start of the project.
Tip. Background assets might not ORMS texture. If you can't see a difference then it's probably a big performance boost right there.
LOD Coloration
I don't use this often but it's a good habit to get into. It allows you to visualize the LODs in your scene to see objects missing LODs and switch between LODs too quickly or not quickly enough.
Check the Lighting
Lighting can have a significant impact on your game's performance. Project requirements will be specific but dynamic moveable lights are expensive and you should try to use baked lighting where needed and reduce the amount of real-time lighting needed. Creating a sub-level set as a lighting scenario is a great way to avoid the use of dynamic lights and still have two static states. Depending on the project there will be various solutions. You could have a moveable dynamic light moving with the character, or use a trigger box activation when a player teleports into a location. Think about why you need dynamic lighting and shadows and is there a way to fake it?
Doing a lighting bake can help increase the frame rate.
Rebuilding Reflection Spheres can remove artefacts from the level and ensure that all lighting components are within the same map.
Level streaming and Sub-Levels
Level streaming is a technique that allows you to divide your game world into smaller, more manageable chunks. This can help reduce the amount of memory your game needs to load and can improve performance by only loading the necessary parts of the game world at any given time. It also allows several members of the team to work on individual sublevels without version control issues.
Usually, I set up a level using these sub-levels where applicable:
- SL_Mesh
- SL_Lighting
- SL_Env
- SL_Anims
- SL_Audio
- SL_FX
Post-Process Volumes
Post-process effects like bloom, motion blur, and depth of field can add a lot to your game's visuals, but they can also start to impact the performance.
Use LODs for Particle Effects
Particle effects can be very taxing on your GPU or CPU, especially when there are many of them on screen at once. Check the materials and textures and use LODs to reduce the number of particles that are rendered when they're far away from the player.
Blueprints
Use Blueprints Efficiently: Blueprints can be a powerful tool in Unreal Engine, but they can also slow down performance if not used efficiently. Use blueprint nativization to convert frequently used blueprints to C++ code and optimize them for better performance.
My fail-safes
At this point, if you've done all this and you're still getting low frame rates or rendering issues you would normally be in trouble. But before hitting the panic button try these to identify the issue:
- Create a new level and add the assets back in. Did you know that if you have two editors or the same project open you can just cut and paste into new maps?
- Turn off the visibility of items in the details panel, or remove them.
- Check project settings. Not seeing any bloom... is it turned on?
- Is the project broken? Copy the Contents folder into a new project and test again.
Good Luck! ><