Forum Discussion

GamerReality's avatar
GamerReality
Start Partner
2 months ago
Solved

My project runs on Quest 2 at 18 FPS (GPU-bound), no matter the scene or XR Rig

Our game's Quest performance has always hovered around 36 fps while in development, which I've come to find out was due to high batch counts and complex lit material shaders on every object.

But now that I'm back to testing optimization on Android, I've noticed terrible frame rates (10-18) no matter what I disable in the scene. I've even opened up the DemoScene from XR Interaction Toolkit, and it experiences the same unknown GPU-bound issue.

 

Context about my project:

  • Unity 6.0.59f2 running on a Windows 11 PC.
  • Open XR project targeting a Quest 2 and SteamVR release.
  • I have a ton of packages from the Unity Asset Store that I'm using to build the rig, environment, or mini games. I've kept them up to date, checked that they were Unity 6 compatible, and removed any unused packages.

 

Things I've checked:

  • I've used the What If analysis from the Quest Runtime Optimizer tool to find out that the one blank scene I was testing in had a total GPU Frame Time of 0.342 ms. Maybe you can help identify anything in the Renderdoc.
  • Every little setting in Project Settings to be set up the recommended way.
  • The only warnings left in my Meta Project Validation are about depth and opaque textures being on, which are required for Stylized Water 3 (an asset that supports Quest) to run. Also, one more warning about Screen Space Ambient Occlusion but from checking everywhere, that feature is off or deleted.
  • Memory Profiling. RAM usage in these empty test scenes is at 1.54 GB and I've sat in the scene for 20 minutes before without it crashing or getting slower like a RAM overflow would do.
  • There is no spamming of logs, warnings, or errors during runtime on the quest. I checked by turning on Script Debugging and connecting the editor's console to the headset's output. All I found were some regular logs on startup.

 

Suspicious things I've noticed that only happen in my Quest builds (testing in-editor lacks these issues and runs above 50 fps):

  • Dynamic Resolution falls to 0 for my game. But I'm curious if this is the reason for making foveated rendering glitch out so much so that the screen becomes super pixelated in vertical strips across the screen.
  • Only when building will I be notified of shader errors from packages we've been setting up like GPU Instancer pro, Microsplat, and InfiniCloud. I mostly stop the errors by deleting sample packages that we didn't need or in one case commenting out a line of code with an error about fog in the universal render pipeline asset or something.

 

Please help, I've worked on this for four days, and I'm at the end of what I know to try.

  • GamerReality's avatar
    GamerReality
    2 months ago

    Thanks for the quick reply. I was able to get my empty scene to run at 60 fps on my Quest again after these changes (I did them one by one and they each had a positive impact):

    • Turned off 4X MSAA and disabled the anti-aliasing feature in the camera. I read on the Stylized Water 3 Discord that this was causing glitches with their asset on Quest for some people.
    • Turned off Stylized Water 3 features on the URP-Performant-Renderer asset I'm running on Quest.
    • Deleted the Screen-Based Ambient Occlusion setting from my other PCVR Universal Renderer Data profile.

     

    In the default Unity XR toolkit scene, it hits 72 fps, but sometimes dips to 55 in a CPU-bound way. That might be from building the APK as a development build with script debugging enabled both in the build settings, though.

4 Replies

  • That sounds really rough, sorry that is happening. A few quick sanity checks you might try:

    - Check that Quest store apps run normally first, just to rule out a headset or thermal issue.

    - Was the project originally a URP project? If it was converted, that can sometimes cause odd rendering issues. In Project Settings > Quality, make sure your Mobile URP Asset is selected for Android and you’re using the lowest quality level.

    - Turn off allpost-processing or extra renderer features (SSAO, bloom, custom passes). Quest can’t handle full-screen effects very well.

    If all else fails, create a brand new empty URP/OpenXR project and do a quick APK test to standalone, if that runs smoothly, something in your main project, like a package or render setting is dragging performance down.

    I’m also using Quest 2 with Unity 6, and standalone runs fine here. If you want, I can share my project/quality settings so you can compare. Just let me know what you need to see.

    • GamerReality's avatar
      GamerReality
      Start Partner

      I realized that none of the screenshots successfully uploaded in my original post, so I'll include them here as they go over everything I've looked through. At this point, I think you're right that it's some URP or post processing setting that's sneakily turned on and I can't find out how to turn it off.

      I have full faith that this should run just fine with Unity 6, and I want to thank you for your reply!

       

    • GamerReality's avatar
      GamerReality
      Start Partner

      Thanks for the quick reply. I was able to get my empty scene to run at 60 fps on my Quest again after these changes (I did them one by one and they each had a positive impact):

      • Turned off 4X MSAA and disabled the anti-aliasing feature in the camera. I read on the Stylized Water 3 Discord that this was causing glitches with their asset on Quest for some people.
      • Turned off Stylized Water 3 features on the URP-Performant-Renderer asset I'm running on Quest.
      • Deleted the Screen-Based Ambient Occlusion setting from my other PCVR Universal Renderer Data profile.

       

      In the default Unity XR toolkit scene, it hits 72 fps, but sometimes dips to 55 in a CPU-bound way. That might be from building the APK as a development build with script debugging enabled both in the build settings, though.

  • After days of troubleshooting, I can imagine you are ready to be done with the hunt for the culprit. 

    I am glad you are making headway and found some good results. I would like to mention that 60 FPS on an empty scene might not leave you much room to be able to develop your app. Ideally you should see 72 FPS on an empty scene. 

    I uploaded a couple of screenshots to my google drive, in case you would like to compare the settings now or in the future if it comes up again. Cesar's Google Drive - Unity6.2 Settings.

    With these settings (active hand tracking + Interactable in the scene) I am getting a steady 72 fps in the standalone build.

    I did notice a few differences between your setup and mine, though it could just be due to Unity version changes. From what I could see in your screenshots, one of your custom package renderers seems set as the default URP pipeline (In Graphics). I’d try switching back to the standard one, just in case it’s overriding performance settings. It’s also worth deleting higher-quality tiers you’re not using, so the project can’t default to them accidentally.

    I hope these help, and if you need anything else let me know.

→ Find helpful resources to begin your development journey in Getting Started

→ Get the latest information about HorizonOS development in News & Announcements.

→ Access Start program mentor videos and share knowledge, tutorials, and videos in Community Resources.

→ Get support or provide help in Questions & Discussions.

→ Show off your work in What I’m Building to get feedback and find playtesters.

→ Looking for documentation?  Developer Docs

→ Looking for account support?  Support Center

→ Looking for the previous forum?  Forum Archive

→ Looking to join the Start program? Apply here.

 

Recent Discussions