It’s time to take an in depth look at what Unreal Engine, after it’s been out of pay-to-access for a almost a year, still doesn’t do right. Grab some popcorn, a drink and sit down, because this isn’t going to be an easy ride.
Editor: Asset Importing
The ideal approach here is to do this asynchronously. Try to validate that you can import this file as early as possible, then create a memory-only asset for it with temporary data, attempt to import in background and finally once done importing replace the temporary data with the imported one – if an error appeared during importing due to corrupted data or similar, mark the asset as corrupted. At no point should it crash or freeze the workspace and you should be able to use the asset immediately.
Epic Games decided that the above approach did not fit their needs. Instead Unreal Engine freezes until the asset is completely imported, sometimes this can last over an hour or more. Not only that, but the failure case can happen at the end of the waiting time.
Import happiness. Import failed.
Editor: Moving and Deleting Assets
For some reason, Unreal Engine has trouble with the concept of Unique Ids. It needs to load each asset and check all other assets if they are using this one asset. This leads to long move and delete times and also to unnecessary memory usage – sometimes even so much that it causes the System to close Unreal Engine by itself. Be warned when you try and move what you think is 400mb of Assets next time.
Psh, why would you want to use your system? These 400 mb of Assets that need to be moved are much more important, let me eat all the available RAM.
Materials have lots of issues. Lots of them. If Materials was a car, you’d have sold it already and got a new one. Let me list the issues up:
- Documentation is sometimes missing or wrong. Best example is the RotateAboutAxis node.
- Material Functions are useless, they could easily be replaced by a flag called “Usable as Node” in a Material, which makes the Material Attributes a Function Output (optionally, defaults to on). One Asset Type and you’ll be able to use all those fancy materials in your landscape material right away without recreating them as a Material Function.
- Some Nodes do not work on Material Attribute structures or vectors.
- No support for Integers or Matrixes. Not really much of a deal, but would be nice to have.
- Control Structures are almost not supported – loops don’t work at all.
- No Text editor, only visual node playground. (This is most likely due to Unreal Engine not having an intermediate shading language.)
Lesson one for Shaders: It should be based on an actual shading language.
Editor: The User Interface
It’s ugly, but that’s acceptable. The thing that is wrong with it though is that there is too much going on. Many of the windows try to unnecessarily grab your attention by looking fancy. Windows does this right, Visual Studio does this right, Unity does this right, Unreal Engine needs to follow suit. Fancy may be good for an end customer, but for an Editor it’s just not needed.
Second issue is that most of the elements are weird to control – which might actually stem from Slate/UMG. The vertical bar in the image to the right for example controls how much text you can see versus how easily you can change the option. What spoke against just making those elements be aligned to the right, cutting off the text where needed?
Don’t have a touch input device? Doesn’t matter, have a huge ass UI anyway. – Epic Games
Editor: Shader Compiling
If a flagship Engine wants to do something wrong, this is definitely not what it should do wrong. A single Material can (when Unlit) already need 68 shaders to be done with compiling. Even more fun when you editor a Material Function and it just says that it needs to recompile 10000+ Shaders. And all other shaders that you need to be compiled right now just get added on top of that. Cancelling that task? Impossible. Not even the Engine manages to do it, so it just queues up the work again if you do another change – sometimes you’ll end up with shaders being compiled that are so outdated that it bugs the Material editor into thinking that this is the new preview shader. (I reported this, apparently “it can’t happen” – 100% reproducible too)
[grabs coffee] “Is it done yet?” “Nope.” “Okay.” [slurp]
Unreal Engine only support per-object Z sorting for Transparent objects, not per triangle. This leads to odd results unless you use a solution like Temporal AA with Masked Dithering – an ugly hack to something that could have been solved by spending 5 minutes on Google to see if someone else might have solved this issue. And would you look at that, an engineer from NVidia did solve this issue. You can find the Feature Request here.
Transparency! Something we’d all wish to have from the government, but nooo, that would be revealing state secrets.
You only have two options here: FXAA and Temporal AA. FXAA is like Vaseline smeared on your screen and Temporal AA has massive artifacts on moving scenes. A wish for an alternative would be SMAA, it provides equal if not better results than Temporal AA almost being equal in quality with Multi-Sampling.
Rendering: Level of Detail Transitions
Unreal Engine currently doesn’t support dithered LoD transitions or blending between two LoDs. Both would be massively better visually than what is there right now, it looks silly and is so out of date – popping in and out of existence.
Pop goes the Level of Detail. Did we learn nothing from the mistakes of others?
Tessellation, a topic i barely know anything about. But it should technically (from my understanding of the documentation) be possible to just turn it off on the fly. Instead, Epic Games responded that it might crash the Engine. How… I mean why? Tessellation is something you should be able to toggle off an on on the fly – even the DirectX demos in the SDK are capable of this.
Have you tried turning it off and on again? What do you mean that might cause the end of the world? Just turn it off and on again! [white noise]
Rendering: Custom Scene Captures
Scene Captures are basically useless right now – you can only capture Color information, nothing else. Extending them from C++ is also a nightmare, because their rendering path is inside the engine instead of inside the class – a big red flag if I’ve ever seen one. I’ve filed a Feature Request for this here.
Cameras and SceneCapture. I wonder how many people got confused by how weirdly Unreal Engine handles this.
It just had to be here. Unreal Engine, as nice as it manages to make everything look, does not support many types of shadow casters. Cascaded Shadow Mapping only gets you so far before you have to find another solution and with SceneCaptures being useless, you’re either bound to use one of the high-end solutions or figure out an ugly hack.
Point Lights for example have a shadow resolution that is barely useable for a game. Changing options seems to not affect Point Lights so the only solution left is to use Distance Field shadows instead. Downside is that Distance Field Shadows perform worse on low-end platforms.
If all you see is a shadow, try moving the camera. Optionally, increase the shadow resolution if at all possible.
Engine: Streaming Assets
Unreal Tournament, Paragon, ARK, etc – all have the same issue. Turn your camera too fast and the game hangs because the Engine unloaded assets and now has to load in assets again before it wants to continue rendering. Basically, the worst case of hitching your game ever has. If the streaming was done right, it would take the lowest possible LoD until it can load a higher LoD. Additionally, never ever freeze if you can’t load something. Continue or crash if it’s a fatal error.
“Hey Frank.” [Frank turns around and freezes mid-turn for a few seconds] “Yeah?”
Engine: CPU Usage
Okay, yes, it’s a modern engine. But does it truly need near to 100% of the CPU to render an empty level? At not even close to 40 fps?
There is massive need for performance improvements on both the Editor and Shipping side as it is shippable but doesn’t even get close to the performance you get with Unity or a similar engine. Unity manages 100 fps+ with a massive world (Example: The Forest) and still has room for more – Unreal Engine doesn’t even manage that on a basic Terrain (Landscape as it’s called here).
[changes graphics settings] Huh, still only getting barely 40fps. Must be CPU-bound.
I know, this is supposed to be about Unreal Engine. But the Launcher also needs a bit of love. Namely: Who’s shitty idea was it to have the launcher auto-run when the Editor starts? Not only does it lengthen the already long load times for a project (I’m at 44 minutes just to load a project now), it also puts additional stress on the system. It’s also ugly as a rotten walnut and takes forever to start. Not forever as in boot times, forever as in “it’s been 5 minutes where the hell is the launcher”. It could basically be considered forced Adware, as it presents ads for UE4, Fortnite, UT, ARK, Shadow Complex and Paragon whenever you launch it – like the Battle.Net launcher but worse. Solution to this seems to have a batch file run in background that keeps killing the Launcher.
Who needs a launcher, especially for Software? The Software should be able to just start, it’s software not a game. And even games shouldn’t need one.
The Bright Side
For all that Unreal Engine does wrong or can’t do (yet), I have to give it props for one thing it does right:
There’s no “Made with Unity” in the free version.
Xaymar signing out.