So I started a new mobile project in 2020.1 with Universal RP.
While prototyping and setting up basic systems I did my first build and deployed to mobile. I was very disappointed when almost an empty scene with very basic post processing (just a color lookup) couldn’t keep 60 fps on mobile.
My previous project could run at 60fps with post processing so I decided to investigate.
It turns out that the performance was going downhill since Post Processing Stack V2 was introduced.
I’ve tested these scenarios:
Unity 2018.4.3f1 built-in renderer:
Standard shader
Standard + Post Processing Stack V1
Standard + Post Processing Stack V2
Mobile Bumped Diffuse
Mobile Bumped Diffuse + Post Processing Stack V1
Mobile Bumped Diffuse + Post Processing Stack V2
Unity 2020.1.0a13 built-in renderer:
Standard shader
Standard + Post Processing Stack V1
Standard + Post Processing Stack V2
Mobile Bumped Diffuse
Mobile Bumped Diffuse + Post Processing Stack V1
Mobile Bumped Diffuse + Post Processing Stack V2
Unity 2020.1.0a13 Universal Render Pipeline with built-in Post Processing
Lit
Lit + Post Processing enabled
Simple Lit
Simple Lit + Post Processing enabled
Test scene looks like this:
I tried to keep the quality and player settings as close as possible between projects. All materials use Diffuse + Normal maps. All PostProcessing profiles are only using a 16 LUT for color grading (StackV2 and URP versions set to Low Definition Range).
I’ve run the tests on Xiaomi Mi A1, and I’ve also checked on Nokia 6.1. The results were basically the same:
Oldest Unity 2018 works best with oldest Post Processing Stack V1. Switching to Post Processing Stack V2 results in FPS dropping by 10-15 (below 60).
Unity 2020.1 is visibly slower than 2018 using any Post Processing. I assume that a bit more complex scene, and it will be visibly slower without Post Processing as well.
Unity 2020.1 with URP and built-in Post Processing is the worst.
Wasn’t URP supposed to have like better performance than everything else?
How come that a 2-3 year old Unity runs better on mobile than anything currently does?
What’s up with PP Stack V2 being so much worse than PP Stack V1?
How come I can’t run the simplest scene with the simplest color grading at 60 fps on mobile?
I have so many questions and so much frustration…
What’s going on?
It is better performance but the settings in URP are not the same as the settings in other pipelines so it will run slower if you do the same settings. You should perceptually adjust them to look the same, then it will run faster. If it doesn’t run faster, Unity considers it a bug.
Pretty sure its a problem on your camera or post effects or setup.
Which SRP options do you have to “perceptually adjust”? There are not that many options, I turned everything off or dropped as low as possible for the tests. Are there any other places I should check for options?
Make sure only one volume is in scene for testing. It can be easy to layer them these days (for example a sneaky default Unity one might be present too).
Sorry, I’m not exactly sure how to enable depth pre-pass? Is that the “Depth Texture” checkbox in the URP profile asset?
I tried to enabled it just now - the FPS with post processing remained the same. The FPS without post processing dropped below 60, so it doesn’t seem feasible to keep it 60+ with DepthTexture and PP enabled.
And by the way when the Depth Texture checkbox was disabled in URP profile asset, the Depth Texture option on the camera said “On (Forced due to Post Processing)”. So it seems it was being forced all along.
Also, for some reason even if I disabled Post Processing on the camera, the “On (Forced due to Post Processing)” doesn’t change.
There is a need for some serious improvements right now with mobile in general, but especially with mobile VR. It is very hard to get post processing working with mobile VR, and even harder to get it working at a high frame rate. Some people suggest not using any post processing, but post processing really helps certain visuals.
Similarly, mobile VR has the option to use Multipass, Single Pass, or Single Pass Instanced. However, Single Pass Instanced in nearly completely broken, and Single Pass does not work with most post processing on mobile. So mobile VR developers are largely stuck with Multipass, which is the least performant option.
And has anybody ever gotten Vulkan to work with any Android device? I have not. I would love to be able to use Vulkan with mobile VR like the Oculus Go and Quest.
To be honest I’m completely baffled. For several years SRP is one of the main buzzwords at any Unity event and there are tales of PC grade graphics available on mobile. Yet I create an empty scene with the cheapest post processing option and performance plummets through the floor. How come this wasn’t discovered and fixed ten times over?!?
How come Post Processing Stack v2 runs 10 fps lower than v1 out of the box on an empty scene, yet it becomes the standard for all Unity versions forward like everything is fine?
I still wonder, why everyone are think that URP is a mobile optimized render pipe? Yes you can run boat demo on super phones at 30fps, but its’ mean nothing.