Like many I have been striving to get the best out of my MSFS VR setup from day one. Things are in a fairly good place, but despite having a powerful system I still don’t understand what is going on with stutter.
Or, at least, I thought I didn’t.
Stanley Tucci, the American actor, to the rescue.
Tucci has a series on the BBC at the moment called Searching For Italy—it’s a foodie travelog, and being a Tucci fan I had to tune in. Immediately I was struck by how jerky the video sequences were—when the camera was moving or panning. And I knew what I was seeing—judder.
In telly world stutter occurs when the framerate is too low. It is particularly evident when there is fast moving action—there aren’t enough frames to render the fast action smoothly—it jumps from one frame to the next. But the key thing here is that the jumps are consistent, because the FPS is consistent, and the effect is akin to a ‘flickering’ of the image edge where it is moving quickly.
Judder is when the FPS doesn’t match the refresh rate evenly and the display time of frames becomes uneven, and while it can look like stutter, it is more pronounced and inconsistent.
So are my issues in fact more to do with judder and not stutter?
I can eliminate stutter as defined above by having a high enough framerate, although at a cost to graphics fidelity. And what remains does look more like judder.
If it was then matching FPS with refresh rate should deal with that—I couldn’t reach the lowest refresh rate of 72hz, but that’s fine—I just needed an even fraction, like half or a third.
But this wasn’t the first time I’d looked at this and previous attempts at matching FPS and refresh rate did not yield much.
But Tucci’s foodie series made me think that it should, so I took another look.
One of the things I tried first was to deliberately mismatch FPS and refresh rate—sure enough, with a maximized mismatch, I could observe excessive ‘judder’. But matching the two, like before, still left some obvious judder.
My suspicions fell on the Nvidia vsync configuration parameter.
I had this set to ‘on’ because that was what was being recommended by the various YouTubers. But I hadn’t actually read the documentation for that setting—and it states that it can cause ‘stutter’ when the frame rate is below the refresh rate—which for MSFS is the case no matter how I have it set up.
So I turned it off and tested with a matched frame rate and refresh rate. Sure enough there was an observable improvement.
There were two other settings of interest also—Fast and Adaptive—and I would say that they seemed to improve things further. Fast is an enhanced version of ‘off’ and Adaptive is a version of ‘on’ without the low FPS side effects. But vsync ‘on’ is intended for when the FPS is higher than the display refresh rate, so I have stuck with off/fast.
This has left me with only certain combinations available—for example, 30 FPS with 90hz/120hz, or 40 FPS with 80/120hz. These were implemented by capping the max frame rate.
They all check out, but with the obvious comprises—30 FPS leaves me with some ‘stutter’, but a level that is acceptable. 40 FPS eliminates stutter but costs in terms of having to dial back the graphics fidelity.
Does it eliminate judder completely? No, it doesn’t. But analyzing the FPS with CapFrameX suggests why—even when capped at an achievable rate, FPS still bounces around, dipping above and below the capped amount resulting in a degree of mismatch with refresh rate and so low levels of judder at times (or in extreme circumstances).
Some other observations:
The higher I push the frame rate and so the demand on the system, the greater the variation in FPS—at 40 FPS the improvement is still clear, but not quite as good as 30 FPS.
The greater the ratio of FPS to Refresh rate the better. A high refresh rate tends to ‘hide’ any mismatch with a low FPS on its own—because the level of resulting unevenness is smaller. But then 120hz costs in other ways—more demand on the system, and it sucks the Oculus battery dry in about an hour.
The Nvidia control panel allows you to cap the FPS, but for me that needs a MSFS restart each time. So I used the Riva Tuner Statistics Server for testing—this allows changes to the max FPS on the fly.
Also, I use the OpenXR Toolkit FSR scaler to lower the load on the system.
Of course, as we frequently see with MSFS, what works for some doesn’t work for others—there are just too many variables. But it works for me and I’d be interested in the experiences of others.
Spec:
3080ti
11th Gen i9
64 GB
References: