Unity HDRP Rendering on Steam Deck

Recently I released a demo of my game Eternal Knight on Steam, currently built with HDRP in Unity 2023.2.20f1 and both the DX12 and DX11 graphics API’s in that order. I’ve very heavily optimized my scripts yet I can barely break 30 FPS on a SteamDeck model 1010.

The game stays consistently above 120 FPS on my Windows 10 PC, with a 180hz monitor at 2560 x 1440, an i7 8700K 3.7 GHz CPU, 64 GB RAM and an NVIDIA GeForce RTX 3080 TI.

I’ve also tried Unity 6000.0.12f1, experimenting in all different configurations with the Resident Drawer + GPU Culling, Spatial-Temporal Post-Processing, adding Vulkan to the graphics API as the 3rd option after DX12 and DX11. Nothing seems to improve it and per the following profiling of the game I’m fairly certain It’s GPU-bound.

So with that, I’d first like to know, has anyone been able to successfully achieve a decent frame rate on SteamDeck with HDRP in Unity 2023 or Unity6? If so, can you advise any specific configuration(s) that were the silver-bullet to get a decent frame rate? For the record the build installed on the SteamDeck is a windows build, it is not a native Linux build, which I have yet to try as it will take many hours to switch over the project and perform the importing as my project is massive.

It’s a very rough comparison, but according to my search the Steam Deck GPU kind of compares to a 1050Ti, your 3080Ti is marked as 5x more performant on benchmarks : UserBenchmark: Nvidia GTX 1050-Ti vs RTX 3080-Ti
CPU side, your desktop it about half more performant.

So, it isn’t that much of a surprise that the steam deck is struggling.
It could be worth it to dig deeper in the renderloop hierarchy to see if there is any part that is particularly heavy. Try to lower quality settings, even make a dedicated HDRP asset for Deck.

I’m unsure about other HDRP games released on Deck, as potentially everything is “compatible”. But I’ve played Lego Builder’s Journey (which is a good looking game, but not ultra heavy on visuals), that has a “normal” and “high” quality selection at lunch, one being URP and the other HDRP. iirc the HDRP option was barely running at 30fps.

1 Like

Thanks for the prompt reply Remy. I do happen to have a 1080 TI on hand on another PC, so although that’s got more power than the 1050 TI it should give me another device to test against as it’s much easier to test changes on a PC running the editor than to do builds and deploy them to the SteamDeck.

I’ll have to do another build and redeploy to get those readings, but as I recall the Bloom was the top of the list when I drilled down into it. So tomorrow I can post some screen shots of those numbers and also try turning off bloom to see if there’s a significant improvement. It would be a shame not to have bloom though on SteamDeck, especially since I’m using HDR colors with high intensities in some cases.

In my prior tests I did indeed create a dedicated HDRP asset and experiment with reducing a many of the settings. To be honest there are so many settings that it takes significant time just to try all the combinations and deploy a build to the device, so I was hoping for some specific guidance on known problem areas for the SteamDeck if possible.

Here’s a screen shot of the Dynamic Resolution section I had set up on the SteamDeck HDRP asset. As I stated previously it didn’t seem to help, not did reducing the Max Shadows on Screen (which usually has a big impact).

Here’s some of the other settings as well:

I’m grateful for your help, hopefully there’s something here that can get me going. For the record, I loaded Elden Ring on the SteamDeck and it runs quite well. While I realize that’s another engine (I’m guessing FromSoftware’s proprietary) I’m hoping Unity HDRP can hang too, especially with all the new Unity 6 improvements.

Turned off a ton more stuff and did another build, here’s the profiler.
Here’s the breakdown of the rendering loop:

Does this indicate that STP isn’t actually working? This looks like the TAA on the camera, which does in fact have DLSS enabled, so should be bypassing the TAA I thought?

Here are my project settings for reference:







bump… any help, please??

I haven’t used stp before, but I guess it need you to write your own custom logic to perform upscaling like other upscale method. You can check the example code ther: GitHub - Unity-Technologies/DynamicResolutionSample: A drop-in dynamic resolution script

Thanks for the link, never heard of ScalableBufferManager before, rather confusing that it isn’t listed anywhere in the DLSS or STP documentation, unless I overlooked it. Sure would be nice to have a sample of STP, but I’ll test this out and see what happens.

It is mentioned in the dynamic resolution doc page that it isn’t automatic, and you need to write a script to handle it. There is even an example script provided :
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@12.0/manual/Dynamic-Resolution.html

Beside from this, disable anything that you don’t use in the rendering of your game, like transparent depth pre and post passes, SSS, some water features …
In addition to the max shadow count, you can also lower the shadow atlas resolution and individual shadows resolutions.

The full profiler is a bit hard to reed from the screenshot, if possible, can you save the profiling information and share it ? (top right in the profiler window)

Well shoot, I guess I did overlook it, thanks for the clarification.

Absolutely, I was wondering if there was an export feature, wasn’t aware of that either, I’ll get that to you shortly.

Here’s the profiler binary export, this is in Unity 6000.0.12f1, I tired 6000.0.13f1 but it crashes immediately on startup. I’m unable to upload this file because it’s 145 MB when compressed, so here’s a dropbox link, hopefully you can access it.

https://www.dropbox.com/scl/fi/e0zsj6eeh2o7l2qb0pulo/steam-deck-08-07-24.zip?rlkey=m8ny151rgkf97x29gkbrpuewv&dl=0

I implemented the DynamicRes script in the SteamDeck build in which I just took the profiler readings. I placed the script on the camera and left the default public variable settings as is. I did not see a tangible improvement in the frame rate and it’s difficult to tell if it’s actually doing anything, I’ll keep digging though.

One thing that might help is “Small Screen Percentage” under GPU resident drawer, this culls some objects based on how much of the screen it takes up regardless of the LOD settings.

Setting it to 2-5% should be largely unnoticeable.

You may also want to change some of the default postprocessing settings? The quality settings do a bit but there’s also some additional settings in the default global profile.

I haven’t used HDRP in a while as i use URP but in URP you can set the default profile per platform and quality setting.

Thanks for the response. I’ll toy with the “small screen percentage” as I had just left it at the default of 0. In regards to the global profile, what I have there is very much custom and intentional for the look and feel of the game.

This doesn’t really show the details here, but this gives you an idea of what we are using and what we are overriding. I suppose anything not explicitly overridden here though would still be executing. I’m guessing I should be digging into the render debugger to see what’s actually running though given that the PP is a combination of the default profile and this global profile.

I’m pretty sure you can set the default profile per quality setting. For my game I aim to have a “Stemdeck” quality setting to make it easy.

And in doing so lower the quality of some effects for steam deck. Like for example down sampling settings and such.

Yeah, I see what you mean right here:

I’ll give that a shot as well, thanks.

Turned off as many potentially omittable PP effects in the global volume profile, turned off many settings in the Graphics > Frame Settings under Rendering and Lighting as well, barely made a dent unfortunately, still at 50 ms just for rendering.

Here’s a link to the profiler data:

https://www.dropbox.com/scl/fi/z4ka0hsx7aoyutwrquv1e/steam-deck-08-09-24.zip?rlkey=5ybfz7ptioshwymmrvv0fa59k&dl=0

Question what kind of build are you using on steamdeck? A linux build or a windows build with proton?

Also based on the profiler you’re CPU bound not GPU bound?

I’ve only tried the windows build with proton, I’ll give the linux build a shot if that will improve performance. I hesitated trying that because switching platforms takes so long but it’s definitely worth a try. Should I also enable Vulkan when I do?

You’re right, I misrepresented the issue, I see it’s CPU bound, but I was considering it from the perspective that it’s the render pipeline work being done in the CPU which is killing frame rate, not my custom scripts. But definitely not GPU bound, my mistake.