Project Optimise Tool (Unreal Engine) : How To Use

This tool helps you find potential problems and optimisations in your projects. It’s built using the Unreal Editor Utility Widgets, so it’s easy to set up and use. The tools don’t look like much visually, because I wanted to keep them self-contained and as light as possible, so no textures or external references. 

Below you can see it in action (Searching for all static meshes in my project that do not have any collision set):

Check out the links below if you need to setup the tool in your own Unreal Engine 5 project. Something that’s quick and easy to do:

Blogpost for setting up from Itch.io - Video for setting up from GITHub

 

HOW TO Use THE TOOL

At the time of writing this there are 6 categories that you can look into for potential problems and optimisation opportunities. You can access these via the What To Look At dropdown:

  • Static Meshes

  • Skeletal Meshes

  • Materials

  • Textures

  • Sounds

  • Misc

 

Under each of these categories, there are buttons relating to them, that run scripts. When you click a button it will run a search of your project for the relevant issues and fill a list below of anything it finds. Remember these scripts don’t actually edit anything, they only load assets and show you information. It’s up to you to decide what to do with them! Below you can see me running static mesh scripts for No LODs and then No Collision.

 

A couple of quick things that are useful are:

  • Total Number - When you run one of the buttons, there will be a total number of potential issues found at the top, as you can see below. This can help give you a quick read of the situation.

 
  • Quick Navigate To Asset - On the rows that generate in the list, you will see a folder with a magnifying glass. Clicking on that will find and select the asset in your content browser. Alternatively, double-clicking on the thumbnail icon of the asset will open it up directly so you can edit it. This is really useful as it makes getting to the asset to fix/asses the problem much faster.

 
  • Ignore Asset - On the left side of the rows you will see the Ignore button. All this does is hide that row. Even though something is flagged it doesn’t mean it is actually a problem for example you may purposely want an asset to have no collision. So I found this button useful when looking through assets to be able to quickly ignore a row, allowing me to more easily concentrate on the others. The row will appear next time you run the button again.

 

Quick Functionality run-through:

So I’ll quickly run through the different scripts to give you an idea of what they do and how they might be useful to you.

Static meshes

No Collision - This logs any static meshes that have no collision primitives setup (You might get some false positives with assets using custom collision or complex collision, but those are probably worth looking at for optimisations anyway). I find this useful for quickly finding assets that should have collision for example floors, walls and other key assets.

No LODs - This returns a list of static meshes which have no LODs set up at all. Generally, everything in your game should have at least a couple of LODs, so this can be a good way to find some optimisation opportunities.

X or More Materials - This can help you find static meshes which are greedy because they have a large number of material IDs. It returns a list of static meshes with material IDs that number more than the value you set on the button. For example, all static meshes which have 3 or more materials. You can change the amount to check against by moving the slider in the lower half of the button. Having lots of separate materials IDs is sometimes necessary on an asset but if you can reduce the number and keep the quality you are after then it will be more optimised.

X or More UV Channels - This can help you find static meshes which have a larger number of UV channels and are worth looking at. Generally, the fewer UV channels you use the more optimised your asset will be. In most cases, you will have 1 or 2. The first is your assets texture UVs and the second is lightmap UVs if you are using baked lighting. So if we search for 3 or more UV channels we can identify some potential optimisation opportunities. Just remember some assets may be using those extra channels in their materials. So always double-check before you consider removing them.

(NEW) Missing Materials - You can use this to search your entire project for any static meshes that have missing materials. This is a good one for helping find problems in your project.

(NEW) X Or More Verts - You can use this to search your project for any static meshes that have above a certain number of vertex. You can dynamically change the number on the button to search for what you want e.g. 100, 1,000, 10,000. This is a useful one for helping find optimisation opportunities in your project.

 

SKELETAL meshes

No LODs - This is used to find skeletal meshes that have no LODs at all. Similar to the static meshes, really everything should have a couple of LODs to keep your project optimised and this is a great way to find those problem assets.

Missing Physics Assets - This probably isn’t something you will encounter a lot but we can use this script to find skeletal meshes that do not have any physics assets plugged in. Not having a physics asset can cause a range of problems including; ragdoll issues, hit reg problems, shadow problems as well as some potential visibility issues.

X Or More Materials - This allows us to list skeletal meshes which have X or more material IDs. Similar to the static mesh version of this script, large amounts of material IDs can add extra performance costs. So where possible we want to keep the amount down to stay optimised. You can change the amount to check against by moving the slider in the lower half of the button.

(NEW) Missing Materials - You can use this to help find skeletal meshes that have missing material problems.

(NEW) X Or More Verts - You can use this to search your project for skeletal meshes that have above a certain number of vertex. You can dynamically change the number on the button to search for what you want e.g. 100, 1,000, 10,000. This is useful for helping find things to optimise in your project.

 

MATERIALS

Using Translucency - This generates a list of materials using Blend Mode::Translucent. Translucency tends to be expensive and so the idea behind this is to be able to help quickly identify materials that we could optimise. Looking through the list to see if there is anything that doesn't need to be translucent or could potentially be adjusted to instead use Blend Mode::Masked.

Using Two-Sided - This logs materials which are set as two-sided. This is an optimising check, as two side materials are more expensive. This is an interesting one to look through, as you might find for example that the distance bushes in your game recently got changed to be camera facing so now they do not need two-sided checked anymore. Potential for a few easy optimisation wins here.

Missing Phys Mats - This script looks through your project’s materials and checks if they do not have any physical materials plugged in. I’ve found this one super useful, as it’s really easy to miss or forget to do when you’re making a new material/material instance. This is useful to get fixed because if for example, you’re doing footsteps or bullet impact sounds based on physical materials, without a phys mat plugged in you would get no sound or the default material sound, rather than getting the full experience you want to give the player.

List All Master Mats - This is an interesting one, it will list all Materals (not material instances). Material instances are cheaper/more optimised than materials. So the idea with this is that you can look through and see if there are any materials that share similar functionality that you could instead turn into a materials instance of one of the other materials instead.

 

TEXTURES

Non-Power Of Two - This generates a list of any textures that aren't using a size which is a power of 2 e.g. 32, 64, 128 etc. If a texture isn't a power of 2 then it causes issues with compression. So it's worth looking into any textures in this list to see if you can get some easy win optimisations.

Has size X - This script creates a list of all textures that are of a certain size. You can use the slider at the bottom to increase/decrease the size you are looking for. I have been mainly using this searching for larger texture sizes e.g. 512 upwards. Then looking through the list to see if there are textures that do not need to be as high. For example, a smaller asset that is never seen up close probably doesn’t need to have a 2048 texture size. You can use this to help fine-tune and optimise your project. A good general rule of thumb is that you want to keep your texture sizes as low as possible without sacrificing visual fidelity.

 

SOUND

Missing Sound Class Asset - This script returns a list of all sound cues that have no concurrency asset plugged in or have no concurrency override set. This is more of an optimisation check as it’s good to have concurrency limits in place in your sounds. You can set concurrency as local (per actor) or global and is definitely something to look into if you haven’t heard about it before.

Missing Attenuation Settings - This returns a list of all sound cues which have no attenuation asset plugged in or have no attenuation override turned on. I’ve found this is an important one for finding potential bugs, especially if you are making a multiplayer game. If you use the standard play sound at location function in Unreal and the sound you selected has no attenuation setup, that sound will play for everyone in the entire game. I’ve made that mistake before, not great!

Missing Concurrency Settings - This returns a list of all the sound cues that have no sound class asset plugged in or sound cues that are using the default sound class from the engine. Firstly, not having a sounds class plugged in means that your sound can’t be considered when affecting specific audio types e.g. turning down only the UI volume or only the music. Then secondly, it’s good practice where possible to use your own assets rather than pulling from engine content (You can just duplicate and rename the engine asset into your project). A good reason to do this is because when you cook your project you can set it to not include engine content, which makes for a smaller quicker cook, but you can’t do this if you are using engine content as it will cause errors in-game.

 

MISC

Unused Project Assets - This script can take a while to complete and will freeze your project while it loads assets to check references, so make sure you save everything before you use it. It goes through your project and logs any assets which have zero references e.g. aren't being used in any levels or by any other assets. This script is a good example of why these scripts only log and do not edit. You might find that you have a lot of assets that aren't currently being used but that doesn't mean you want to automatically delete them. That’s why I chose to log and let you decide what to do with the information.

Project Redirectors - If you’re using source control and moving assets around you can create a bunch of redirectors. It’s good practice to fix-up these. This is a nice quick way of identifying any around your entire project and worth running every so often.

OUTRO

I made these scripts for my own projects to help find problems I didn't know existed as well as potential opportunities for optimisations. The idea is that we can catch smaller issues that aren't obvious and bring up the overall sturdy-ness and quality of our games to stop that death by 1000 bugs concept. If you want to see when I release updates or new tools give me a follow on Twitter.

Remember these scripts are free so give them a go and I hope you find them useful. If you have any ideas for extra functionality which might be useful, give me a shout, and maybe I can add it to the tool!

Also if you are into Unreal Engine, you might find my Quick Dev Tips useful. It's a series of quick bite-sized game development tips and tricks videos, focused around UE4 / UE5.