Poor mans G-Sync/Freesync

I remember an old thread over at nogripracing where people discussed how to achieve smooth gameplay with minimal input lag in rFactor and what gave the best results was Vsync ON and cap the framerate to your monitors frequency -1. But this would give you a skipped frame once every second so it turned most people off.
Now with new technology we can cap the framerate at a much higher precision (down to 3 decimal points) which in theory will eliminate this problem.

I came across a thread browsing the guru3d forums last night and a guy named RealNC made a great guide on the subject.

Credit goes to RealNC over at guru3d.com
Here is the actual thread https://forums.guru3d.com/threads/the-truth-about-pre-rendering-0.365860/page-12#post-5380262
I highly recommend reading the entire thread for more insight.

You want to use RTSS (Riva Tuner Statistics Server) to cap your framerate as it's the only tool (that I know of) that have sub ms accuracy.

Ok here we go!

---------------------------------------------------------------------------------------------------------------------------------

Vsync does not actually cap the frame rate. This is a popular misconception about vsync. What it does is syncing the output of new frames to the monitor's "vblank" signal (the point between the monitor having finished scanning out the current frame and is preparing to scan out the next.) The frame rate not exceeding the refresh rate is just a side effect of that. There's no actual frame capping involved.

Because there is no frame cap, the game is preparing new frames as fast as it can. Once all possible frame buffers and all pre-render queues have been filled, only then will the game stop queuing more frames to be displayed. That means when all these buffered and queued frames are displayed later on, they're based on old input. Meaning input lag.

Setting pre-rendered frames to 1 means less queued work is waiting to be processed. The game stops trying to output more frames sooner. Meaning you get less input lag. However, this doesn't help with queued frames that have already been rendered but have accumulated in the output buffers. You still get more input lag that needed.

You can fix this issue by using a frame cap that's set at almost the exact same value as your refresh rate. Something like 0.01FPS below refresh rate works fine (RTSS is accurate enough to allow for this kind of frame limiter accuracy.) Note that "0.01" is just a ballpark number. Anything between 0.007 and 0.015 or so should work fine. Too low and the trick doesn't work anymore, too high and you get repeated frames that result in "hiccups".

Please note that all this is for vsync. You don't need to do any of this when using G-Sync or FreeSync. For those two sync methods, just cap to 3FPS below your refresh rate and you're done! Also note that all this also doesn't apply to vsync off. This guide really, really is just for non-gsync, non-freesync monitors with vsync enabled. (Or if you for some reason disabled gsync/freesync on your monitor and want to use plain vsync.)

Step 1: Find out your real refresh rate

Nope, your real refresh rate is in the majority of cases not 60 nor 59. It's usually fractional. Most monitors use 59.94Hz for "60Hz" and 119.982Hz for "120Hz". You can detect your real refresh rate on these sites:

http://www.testufo.com/#test=refreshrate
https://www.vsynctester.com

Let the test run for a while (around 2 or 3 minutes should be enough.) Do not run both tests at the same time. Do not have any background tasks running.

If both sites give you results very close to each other, then you can be confident that the number you got is pretty accurate and very close to your real refresh rate.

It's important to use a browser that works (Chrome and Firefox should be OK), and that if you're using Windows 7, Aero must be enabled (the test needs Aero's vsync in order to detect your refresh rate.) You also need to make sure that GPU acceleration is enabled in your browser, otherwise you'll get wrong results.

You only need the first three decimals of the detected number. If the result is something like "59.940875" for example, you can consider "59.940" as the important part for simplicity.

Step 2: Use RTSS's new fractional frame cap feature

Unless you're using a very old RTSS version (so please make sure you have a recent version) you can set a denominator for the frame cap. For a 59.940Hz monitor, you'd cap to 59.930FPS (59.940 - 0.01 = 59.930). For a 119.982Hz monitor, you'd cap to 119.972FPS (119.982 - 0.01 = 119.972).

Do do this, you need to edit the profile file of RTSS (to set this globally, you need to edit the "Global" file inside the "Profiles" folder of your RTSS installation directory.) There's no GUI for this. For a 119.972FPS cap, you would need this in the profile file:
Code:
[Framerate]
Limit=119972
LimitDenominator=1000

For a 59.930FPS cap, you'd use:
Code:
[Framerate]
Limit=59930
LimitDenominator=1000

Step 2 different method: Using CRU

Instead of using a fractional RTSS frame rate limit, you can instead continue using the default frame cap, but instead modify your monitor's refresh rate slightly. You can do that using CRU:

https://www.monitortests.com/forum/Thread-Custom-Resolution-Utility-CRU

For example, if you want to cap to 60FPS, modify your 60Hz mode to 60.01Hz. For 120FPS, modify your refresh rate to 120.01Hz. Please note that it's usually not possible to get exactly that number! Again: 0.01 is just a ballpark number. If 60.01Hz or 120.01Hz are rounded off by CRU to 60.008 or 60.012 for example, or 120.009 or 120.013 in the 120Hz case, that's fine! Just use a number between 0.007 and 0.015 and it will be fine.

The downside to using CRU for this is that you need to re-apply your edits every time you upgrade your GPU drivers. Fortunately that's easy since CRU has an "export" button where you can save your custom resolutions to a file and then use "import" after driver updates.

After you've edited and activated your tweaked refresh rate, you should now go to the refresh rate testing sites mentioned previously and verify that your new refresh rate actually works.

If all went well, you can now just cap normally with RTSS. For 60.01Hz cap to 60FPS, for 120.01Hz cap to 120FPS. Obviously you can do this for any refresh rate you want. Cap to 75FPS if you've added a 75.01Hz mode, 90FPS for 90.01Hz, etc. The only important part is that "0.01" difference.

Result

This will keep the pre-render and other frame buffers empty by stopping the game from rendering frames faster than your refresh rate. And empty frame buffers means no added latency due to buffering.

If you don't do the above, then setting pre-rendered frames higher than 1 will result in more input lag, and can result in bad frame pacing in some games.

And even if you do the above, setting this value to 1 still helps as a guard against temporary framerate fluctuations (no frame capper is perfect), giving a more consistent input lag value.

Keep in mind that all this requires a PC that's able to render frames fast enough. Since the above keeps render/frame buffers empty, it means there's no guard against frame rendering time spikes. If your PC can't maintain a solid 60FPS (or whatever your refresh is), then you might be better off not doing any of this.

If your PC is fast enough though, then this is an excellent way of minimizing vsync input lag and maximizing smoothness by having good frame pacing (meaning frame times that match your refresh rate.)
 
Great thread, awesome manual. I used this trick for battlefield but with the console command for it. The hiccup was Only noticeable when flying straight line to the horizon and really focusing on it.
I didn't know though that rtss can do it too, which opens the possibility to do it for all games.
Awesome advice! :)
 
Upvote 0
@Martin Vindis ,

I don't have any global profil in the "profiles" folder in the installation directory. I can only find a Global file under "profile Templates" and I can't edit that file.. Please help.
I have found the global file, but it won't let me save over it, it will only save as a separate txt file :( which i'm guessing isn't correct.
 
Upvote 0
Report from me:
Changed the determinator to 100 as with 1000 you can't change things on the fly. The rtss window can only handle 4 numbers apparently...
I have a 60.000 Hz monitor (awesome website, this vsync tester btw! Thanks for that!).
59.95 fps works very well. It's low enough to get rid of the input lag but high enough to make the little lag every few moments not visible if you don't really focus on it.

Awesome tip. It's a rare thing to come across a thread that is well formatted, understandable, without wrong assumptions or anything and really helpful!
 
Upvote 0
@RasmusP ,

On my monitor the Vsync test came up with 59.949hz, so what should I set it to?

I tried as I said before, to edit the global file in the "profile Templates" folder, but it didn't let me. 100 determinator fixed it for you to be able to save the file? Last, did you have a global file in the "profiles" folder? I didn't have one.
 
Upvote 0
@RasmusP ,

On my monitor the Vsync test came up with 59.949hz, so what should I set it to?

I tried as I said before, to edit the global file in the "profile Templates" folder, but it didn't let me. 100 determinator fixed it for you to be able to save the file? Last, did you have a global file in the "profiles" folder? I didn't have one.
Sounds for me like you're in a different folder..
C:\program files\Riva tuner blah\profiles
I have a global in there and my custom profiles that end on .cfg. Edited them with notepad++ and could save without a problem whether rtss/afterburner where running or not.
I would recommend to use one profile per game anyway though as a global "detection level" other than "off" will show the statistics overlay in Microsoft Office etc which is just annoying.

To the denominator: I can recommend to go half of an fps lower than the Hz so 59.00 for you. With a denominator of 100 it would be 5990 then.
Oh, I didn't check if I could edit in the denominator line into the global profile! I could edit the fps though without problems with notepad++..
 
Upvote 0
@LoeVG I had to take a look and relized that I didn't have a Global file either. Open RTSS and select the Global profile in the application, then switch "Show own statistics" on and off and the file should be generated. No idea why it does this but it worked for me.
Remember that the Global file should be named "Global" only, not Global.cfg.
I'd try somewhere between 59.937 to 59.942 in your case. If you go too high, you'll get input lag. If you go too low, you'll get "hickups". You want to find the sweet spot where you get neither.


@RasmusP You can change things on the fly with a denominator of 1000 if you click the up and down arrows next to the numbers.
Half a fps sound way too much (I think you really mean 0.05 but still sounds over the top) so try to go even lower where those small hiccups entirely disappears. I read that entire thread and they recommend setting it somewhere between 0.007 to 0.012 under the monitor Hz.


After a few days of testing I must say that I'm impressed and very happy that I found this. I find it strange that this isn't a default thing done by AMD and NVIDIA or even game developers could put it in their games. Just check the actual refresh rate of the monitor and set a fps limit slightly lower whenever Vsync is enabled. Keeps the GPU cooler as well.
 
Upvote 0
@LoeVG I had to take a look and relized that I didn't have a Global file either. Open RTSS and select the Global profile in the application, then switch "Show own statistics" on and off and the file should be generated. No idea why it does this but it worked for me.
Remember that the Global file should be named "Global" only, not Global.cfg.
I'd try somewhere between 59.937 to 59.942 in your case. If you go too high, you'll get input lag. If you go too low, you'll get "hickups". You want to find the sweet spot where you get neither.


@RasmusP You can change things on the fly with a denominator of 1000 if you click the up and down arrows next to the numbers.
Half a fps sound way too much (I think you really mean 0.05 but still sounds over the top) so try to go even lower where those small hiccups entirely disappears. I read that entire thread and they recommend setting it somewhere between 0.007 to 0.012 under the monitor Hz.


After a few days of testing I must say that I'm impressed and very happy that I found this. I find it strange that this isn't a default thing done by AMD and NVIDIA or even game developers could put it in their games. Just check the actual refresh rate of the monitor and set a fps limit slightly lower whenever Vsync is enabled. Keeps the GPU cooler as well.
Only at the phone currently so my reply was kinda short, sorry for that.
With a denominator of 1000 I could use the arrows, true. But you can also just type in a number, what I prefer sometimes and when you try that it will stop at 4 numbers which means 6 fps after hitting enter :laugh:
You are totally right, I just checked and I meant 59.95 fps, not 59.50 fps!
I tested with a shooter though and to really get rid of the input lag you need more than 0.2 fps from my feeling which would mean 59.80 fps. Of course using a good mouse and having a cross hair will be way more sensitive than a steering wheel though.
I don't see the hiccups with 0.05 fps. So I went for that for Witcher 3.
Maybe I'll see the hiccups when I run the drag track in AC though. I'll report back :)

I agree with it not being default from the manufacturers. They have limiters now afaik but they are crap compared to rtss. When you compare frametime graphs the rtss limiter is just a perfect line whereas every other limiter I've ever tried has little spikes.
Seems for me that it's complicated to make it that perfect so they don't really bother and just let the rtss be what it is.

Addition: I would recommend to put that all into a global profile. Some games don't like being limited, some programs too..
My profiles folder looks like this btw:
C:\Program Files (x86)\RivaTuner Statistics Server\Profiles
upload_2018-4-25_11-50-2.png

And the settings are looking like this:
upload_2018-4-25_11-50-36.png
 
Last edited:
Upvote 0
Why pick this method over nVidia Fastsync or AMD Enhanced Sync?
Don't know how fastsync works for you but for me it's a stuttering mess every time I try it after a driver update...
It's only smooth when you can output 2x your refresh rate. So for my 60Hz monitor I need to run the game at 120+ fps which is not possible for me.

Sometimes it's perfectly smooth but after some time it stutters again. For me it's just garbage as the tearing at 120+ fps is minimal anyway...

I can't record it though as the monitor stuttering isn't captured on the video frames when recorded.
 
Upvote 0
Don't know how fastsync works for you but for me it's a stuttering mess every time I try it after a driver update...
It's only smooth when you can output 2x your refresh rate. So for my 60Hz monitor I need to run the game at 120+ fps which is not possible for me.
Works great for me, even when fps are near the refresh rate. Monitors are AOC 60 Hz (or 75 Hz if I make custom refresh rate).
 
Upvote 0
I've been curious about how much this method actually helps so I did a test similar to what Niels Heusinkveld did in this video. I don't have a 120fps camera so 60 had to do.


And here are the results.
Code:
vsync    limit    latency
on       on       4
on       off      7
off      off      3
off      on       3

Looks like it only adds one frame (16.7ms) of latency. Totally worth it in my book, as I get a super smooth experience.
 
Upvote 0
I've been curious about how much this method actually helps so I did a test similar to what Niels Heusinkveld did in this video. I don't have a 120fps camera so 60 had to do.


And here are the results.
Code:
vsync    limit    latency
on       on       4
on       off      7
off      off      3
off      on       3

Looks like it only adds one frame (16.7ms) of latency. Totally worth it in my book, as I get a super smooth experience.
I would be very interested in what happens when you set the "pre-rendered frames" to 1 so the latency is only 1 frame even without the limiter and then limit to a full half fps below the refresh rate so there will be stutter once a second but for me the input lag is completely gone then (well the same like without vsync).
 
Upvote 0
  • Deleted member 197115

I've been curious about how much this method actually helps so I did a test similar to what Niels Heusinkveld did in this video. I don't have a 120fps camera so 60 had to do.


And here are the results.
Code:
vsync    limit    latency
on       on       4
on       off      7
off      off      3
off      on       3

Looks like it only adds one frame (16.7ms) of latency. Totally worth it in my book, as I get a super smooth experience.
What if you set max prerendered frames to 1?
 
Upvote 0
Back
Top