Forum Discussion

🚨 This forum is archived and read-only. To submit a forum post, please visit our new Developer Forum. 🚨
Ttakala's avatar
Ttakala
Honored Guest
10 years ago

Another judder datapoint: sometimes DX9 is better than DX11

My standalone application (Direct HMD access) was suffering from very annoying judder in Windows 8.1 which I tried to fix by trying several different combinations of Nvidia drivers, 32/64-bit builds, and DX9/11. Finally I found out that switching to Windows 7 and using a Unity standalone DX9 build solved the judder. My Win7 install had GeForce 311.06 drivers (I didn't try other drivers in Win7). The computer is equipped with Geforce GTX 660.

What is alarming is that in Windows 8.1 I did not find any satisfying ways to fix the judder. The judder is gone if I disable vsync via OVRManager.capiHmd.SetEnabledCaps(), but that introduces a slightly noticeable motion-related rendering artifact when compared to the working Win7 DX9 solution that has vsync on. Disabling time warp in Win8.1 also fixes the judder but this is not an acceptable solution cyber-sickness wise.

Here are the different configurations that I tried in Win8.1 to no avail (different combinations included):
    DX9 and DX11 Unity standalone builds
    32- and 64-bit Unity standalone builds
    Nvidia 344.75 and 347.52 drivers


My application congruently reached the following FPS:
Standalone (deltaTime-based FPS calculation)
- Vsync on: 75 FPS, massive judder
- Vsync off: 200 FPS, no judder
Unity Editor (FPS reported by Unity stats)
- Vsync on: 60 FPS
- Vsync off: 280 FPS

It would be great if there was a way to make my application to work in Win8.1 without judder but with vsync enabled.

I'm using Unity 4.6.2, and for some of the DX11 builds I tried both enabling and disabling the "D3D11 Force Exclusive Mode" in Unity Player Settings.

2 Replies

Replies have been turned off for this discussion
  • Try doing this in one of your scripts' start methods. It will disable "Just-In-Time" TimeWarp, where we spin-wait until a few milliseconds before scanout to perform rotational correction. In many cases that wait can make you miss the frame deadline.
    OVRManager.display.distortionCaps &= ~(uint)0x1000;
  • Ttakala's avatar
    Ttakala
    Honored Guest
    "vrdaveb" wrote:
    Try doing this in one of your scripts' start methods. It will disable "Just-In-Time" TimeWarp, where we spin-wait until a few milliseconds before scanout to perform rotational correction. In many cases that wait can make you miss the frame deadline.
    OVRManager.display.distortionCaps &= ~(uint)0x1000;


    Unfortunately that did not make a difference. I inserted your code line in Start() (I tried it both in a "Default Time" script and another that is executed before OVRManager). Also I did not notice a difference when I tried toggling the setting in run-time.

    I tried this in Win8.1, Nvidia 344.75 drivers with the following combinations:
      DX9 and DX11 Unity standalone builds
      "D3D11 Force Exclusive Mode" on and off