How do I prevent reprojection being triggered? (halving FPS in SteamVR + openXR on PC)

Unity 2021.3.5f1, URP forward, openXR 1.4.2 Single Pass Instanced, Ryzen 3700X CPU, 5700XT GPU. Profiled from standalone build with the profiler running in Editor.

I am running a Valve Index at 120 FPS for my game, but at some point it falls back to 60 FPS. Later it recovers to 120 FPS.

My idea was that it would just look at the previous frame time, and increase the FPS as soon as possible. But in the profiler I can clearly see it takes multiple frames (~50 - ~100 frames) before 120 Hz is recovered. But as soon as a single frame is too slow it will fall back to 60 FPS (well not directly but after ~8 frames…)

  1. Are there any settings I can set in Unity to influence this behaviour? (asking players to set values in SteamVR after installing does not seem like a viable option to me)

  2. The green part at 60 FPS is mainly the XRBeginFrame → WaitForRenderThread and takes >9 ms, so it could return to 120 FPS with some frame time to spare. Or am I missing someting?

  3. What is the Yellow spike [CPU :“WaitOnSwapChain”/ GPU : “PlayerEndOfFrame”]? Are these spikes the cause of the 60FPS fallback? How do I prevent them?

  4. The Green spikes are mostly just longer “XRBeginFrame”. Sometimes there is a PlayerEndOfFrame and/or Gfx.UpdateAsyncReadbackData on the renderthread during part of this time. But sometimes the renderthread is empty. How can I stop these spikes?

Some of the higher blue spikes are caused by Physics processing 2 steps in a single frame to catch up, I think I can fix (prevent) this.

I fixed this, but I am still left with the “random” Yellow and Green spikes. Screenshot on a Green spike, with max 1 physics step per frame. This green spike does not have anything visible in the render thread. The frame before and after this frame also don’t show anything special.

8386500--1106184--upload_2022-8-24_13-38-17.png