Lessons from Senua's Saga: Hellblade 2 - a milestone Unreal Engine 5 release on PC
Developers can learn a lot from what it gets right - and wrong.
Senua's Saga: Hellblade 2 is the most visually accomplished game released in 2024 to date, and for me it represents the most significant Unreal Engine 5 release next to Epic's own Fortnite. As well being a game with fascinating technology in its own right, with so many developers jumping on the UE5 bandwagon it seems inevitable that Hellblade 2 will be instructive for future developers. There's a lot that the game gets right which ought to be copied wholesale, while other elements might be best avoided.
Let's start with a strongly positive element, and that's the user experience you'll notice when first starting up Hellblade 2. Before the game starts, you have the chance to change important presentation options, including sound and display settings. It can be frustrating when a game starts with incorrect default settings, forcing you to break out of a cutscene or intro section to correct them, so this is a nice way to handle it.
Offering the chance to change settings also buys time for a shader compilation step, which proceeds in the background. On a PC with a fast Ryzen 7 7800X3D processor, this step took around 40 seconds - so it finished before I was finished tweaking the settings. On a lower-end Ryzen 5 3600 machine, shader precompilation takes longer, around 90 seconds, but it was still unobtrusive. This step is critical for many modern games, especially Unreal Engine 5 titles, and seems effective in Hellblade 2's case to prevent the stutter and frame-time spikes that often accompany just-in-time shader compilation. Given the many UE5 tools for collecting shaders, this ought to be achieveable for other titles too, and precompiling as many shaders as possible is a lesson worth learning.
Beyond getting this critical shader precompilation step right, the presentation of the options menu is also a great blueprint for other developers. Like my favourite ports, Senua's Saga has a real-time graphical preview that works in a cool way: you can scroll over to an option, say global illumination, and then hit the preview button. The background menu turns transparent and you can see the game rendering in real-time, with the menu option isolated. As you change it, you can see the effect of the change in real time. UE5 developers could and probably should straight up copy this menu idea from Ninja Theory, or at least provide a preview window or a transparent menu background to make the effect of settings tweaks obvious.
Ninja Theory even went a step further by including the time it takes, in milliseconds, to render the frame for the GPU and CPU when changing options. You can also see VRAM usage and the frame-rate and frame-time of that frame with pure v-sync enabled. This is crucial, as it helps users learn which graphical options have a CPU and/or GPU impact, and whether their particular system is currently CPU or GPU limited. If you are targeting 30fps, you want the CPU time and GPU time to both be below 33.3ms to ensure proper frame delivery, while for 60fps both need to be below 16.6ms.
As an example, let's look at a computationally expensive setting like reflection quality. You get more RT reflections on rough dirt on high, lose them on medium, and then lose all reflections out of screen space on low, and all the while you can see the cost in milliseconds changing. This system also helps users identify options that have a performance cost but have little effect on visuals, like volumetric quality - where my PC produces 27ms frame-times at high and only 23.5ms frame-times at medium, while the actual visual difference is minimal.
I love this millisecond meter and think every developer using UE5 should look to copy it directly or conceptually. I just wish that Hellblade 2 allowed the meter to be toggleable while playing the game, as its performance metrics could provide even greater insight into what component of your PC is limiting performance: CPU or GPU.
Another element developers should look at copying from Senua's Saga are the granular options that PC users are afforded. V-sync is very well done, for example, offering a choice between full-rate, half-rate, third-rate and quarter-rate varieties. This is useful if, for example, you're on a 120Hz screen, as you can then lock to 60, 40, 30 or even 20fps. Ninja Theory also supports dynamic resolution scaling, which in my experience helps a lot - particularly on lower-tier GPUs targeting higher resolutions. DRS is rare on PC in general and especially so in Unreal Engine 5, as public branches of the engine don't officially support it, so it's a welcome surprise here.
Finally, there are plenty of upscaling options available, including all of the common reconstruction techniques and the two frame generation techniques from AMD and Nvidia. In general, Ninja Theory is hitting all the right notes in the graphical options menu - and other developers of UE5 games should take notes.
This game does a lot right for the user experience in UE5 which a huge amount of Unreal Engine games manage to do poorly. Still, it could be improved upon - and a good example of this is how the graphics menu locks users out of settings combinations that should be technically possible. For example, DLSS 3 frame generation can run with any upscaler or anti-aliasing technique, but the menu only shows DLSS frame generation when you select DLSS image reconstruction - so you can't used DLSS 3 frame generation with TSR, FSR2 or XeSS.
In a similar vein, dynamic resolution scaling is only permitted with Unreal Engine 5's TSR upscaling, though every single image reconstruction technique in the game - be it XeSS, DLSS or FSR2 - supports dynamic resolution in their SDK. These are small nitpicks, but they stand out when the menu does so much else right. On a practical level, I know a lot of Intel or Nvidia users would love to combine XeSS or DLSS with dynamic resolution scaling to get the best balance of performance and fidelity on their hardware.
Another menu nitpick isn't limited to Hellblade 2. In short, there's no way to turn on hardware Lumen, which Unreal Engine natively supports. Instead, software Lumen is used universally on all platforms no matter the settings and, as my friend and colleague John showed in his Hellblade 2 tech review, this means quality can be lacking as screen-space tracing is used extensively. The majority of UE5 games released to date do not offer the ability to toggle hardware Lumen either, just like Hellblade 2.
While allowing for both hardware and software paths of Lumen necessarily requires more QA time to check that it looks and performs as expected, I still heavly recommend that all UE5 games allow for user choice there as long as it is reasonable. Hardware RT is the future of the industry at this point, so even if certain graphics hardware might struggle with the increased quality now, users of the future playing a gorgeous game like this one will be grateful for its inclusion. Having forward-looking graphical options on PC, especially ones so readily available with a checkbox in the engine, should always be a priority for games that put such a great emphasis on the their visual fidelity on PC.
Keeping within the game menu here, there are also no controls for many of the game's post-processing effects. I know that Hellblade 2 is going for a specific artistic vision, but at the end of the day this can be as much a question of accessibility as aesthetics. Ninja Theory definitely understands this, as they put motion blur control in the accessibility options in Hellblade 2, but they don't allow the user to toggle similarly obfuscating effects like depth of field or chromatic aberration. This game is different than others in that it has a constant depth of field and strong chromatic aberration even in normal gameplay, which can cause issues for some players. Therefore, having these options available without putting the onus on users to mod the game in some capacity would be a step forward.
As with post-processing, Hellblade 2's field of view and ultrawide aspect ratio are fixed and cannot be changed in-game. It's easy to get the game running in 16:9 with simple modding, but again this ought to be an in-game option - even one that comes with a warning that performance may suffer and some unintended jank may be visible behind the black bars. I think most users are OK with this kind of a trade-off, even if it goes against the artistic intent of the creators, if they can play comfortably on their monitor without motion sickness issues.
Moving beyond the menu and graphics options, drawing cross-game conclusions about performance is a bit trickier - but aspects of Hellblade 2's performance profile can be generalised across all Unreal Engine 5 games. For example, every UE5 game ought to handle shader compilation in a similar way to avoid performance hitches like Hellblade 2 does. However, Hellblade 2 does still suffer from what I like to call traversal stutter, which triggers frame-time jumps when you move across an invisible boundary in the game world and data is lump loaded and deloaded.
On the relatively low-end Ryzen 5 3600, this leads to obvious and distracting stutter in places, and this is also true (if reduced in magnitude) on faster CPUs like the Ryzen 7 7800X3D. Hellblade 2 seems to have less traversal stutter than other UE5 titles, so it's hard to fault the developers given how universally it plagues UE5 titles - even if it doesn't affect the Xbox Series X version whatsoever. Given that, we know it is possible to sidestep the issue, and I would encourage the UE5 developer team to examine how and when loading and deloading is occurring so as to reduce or eliminate traversal stutter and prevent this common frustration.
Another potential source of frustration for some users in Hellblade 2 concerns memory management. In short, users with graphics cards equipped with 8GB or less of VRAM will often see large frame-time spikes when certain events occur. For example, in the game's opening running on an RTX 4060 8GB graphics card at 1440p, a wave crashing down on Senua causes a huge frame-time spike - and we see similar issues throughout the game, including just before you take control of Senua after a cutscene. Tellingly, these spikes don't take place on the RTX 3060, which is slower overall but does come equipped with 12GB of VRAM. Other 8GB graphics cards exhibit similar issues, though cards with higher PCIe and memory bandwidth - like the RTX 2070 Super or RTX 3070 - suffer from proportionally smaller hitches.
While all 8GB cards suffer to a certain extent, disruptive to the gameplay and narrative, there aren't many good solutions to solve these frame-time spikes. You can drop textures to low and set the game to 1080p, which reduces the spikes to a small blip on the frame-time graph, but obviously this comes with a large impact on visual fidelity. Even with the VRAM meter in the graphical menu, a casual user with an 8GB GPU would most likely would have no idea where these hitches are coming from - and the situation ought to be improved, especially given how the vast majority of GPUs in the Steam Hardware Survey have 8GB of VRAM or less.
This level of hitching is unfortunately going to be the baseline experience for a lot of customers, so users need to either be equipped with better information in the settings menu to avoid bad performance or the game should be better profiled on mainstream hardware to avoid these issues altogether and ensure the game is the focus, not its performance.
To sum up then, Hellblade 2 is a great PC release that does a lot well, including its user experience and graphical options menu, but it also comes with some unexpected restrictions and performance concerns that disproportionately affect users of mainstream graphics hardware. Good and bad, other UE5 developers can learn a lot from this game on PC.