Open De-M-oN opened 3 months ago
The maximum is intentionally not set to unreasonable values to allow easier setting through the overlay, and because this setting primarily exists for compatibility reasons. I don't think any game actually needs such a high limit if it has problems caused by high FPS.
What you actually seem to want is to limit FPS to the maximum refresh rate. If the game uses page flipping, then this should already be possible with the VSync setting. If it doesn't, then maybe instead of increasing the maximum, I could decrease the minimum to 0, where 0 would mean matching the refresh rate. Or add a new option like msgloopmax.
I will never use VSync. It adds input lag. Granted not that much input lag on 240hz, but still unnecessary additional input lag. Especially if you have G-Sync compatible monitor
0 = matching the refreshrate of monitor is a good solution too.
I don't think any game actually needs such a high limit if it has problems caused by high FPS.
Well to be fair: NICE 2 works with 200fps, but not with uncapped. Because at uncapped the gamespeed increases, on 200fps it does not yet and probably 240 still works too.
Or add a new option like msgloopmax
Sounds worrying. msgloop worked horrible with NICE 2. flipend was the king here.
I will never use VSync.
Well, you're using DDrawCompat, so you're using vsync. It can't really be turned off for the presentation itself. It's explained under the VSync setting in the wiki.
So setting VSync=on here would be pretty much equivalent to flipstart(240). Granted, it's still not flipend(240), which would have minimally better input lag, so there's still a case for more config flexibility. I think I'll just allow all FpsLimiter options to go down to 0, where it will use vblank as the wait target.
Well to be fair: NICE 2 works with 200fps, but not with uncapped. Because at uncapped the gamespeed increases, on 200fps it does not yet and probably 240 still works too.
At 200 FPS, I measured 1 in-game minute to be about 53 seconds in reality, so the game speed is already increased. This seems to be the case for anything above 60 FPS, although the difference is marginal at small FPS increases.
Well, you're using DDrawCompat, so you're using vsync. It can't really be turned off for the presentation itself
But I have 1000fps in NICE 2 if I dont cap it. If Vsync would be on, I would be limited to 240fps. But I'm not. I have forced VSync off in GPU Driver setting though.
At 200 FPS, I measured 1 in-game minute to be about 53 seconds in reality, so the game speed is already increased. This seems to be the case for anything above 60 FPS, although the difference is marginal at small FPS increases.
So at 60fps the game 1minute is = 1minute? Would be interesting to know. Interesting is that the fps also influences the jumps. At 200fps the car is much less prone to do frontflips on landings and bumpy roads than on 60. And on 30 the car is even more bouncy lol
120 or 200 fps felt more realistic in that regard. But if the gamespeed is only correct at 60fps, then probably the developer intended jump physics are at 60fps too. Well too bad that the gamespeed is already higher there. Thank you anyway :-)
But I have 1000fps in NICE 2 if I dont cap it. If Vsync would be on, I would be limited to 240fps. But I'm not. I have forced VSync off in GPU Driver setting though.
I'm not sure what you use for measuring that, but if you use DDrawCompat's own stats overlay (shift+f12), it will show you the difference between Presents and Flips. (Note: there is a performance issue with the overlays currently, so they'll decrease your max fps). DDrawCompat is internally limited by its own vertical blank tracking to output (present) only 1 frame per vertical blank, so no amount of driver settings or anything will change that. At best you might be able to get screen tearing (at least with FullscreenMode=exclusive), but I'm not sure that those driver settings have any effect at all in DX7. All rendered frames above the refresh rate are discarded, so at 1000 FPS you'd get about 760 frames per second discarded and never actually displayed.
So at 60fps the game 1minute is = 1minute? Would be interesting to know.
Yes, at 60 FPS it seemed pretty accurate to me, though I only used a stopwatch to measure.
1000 fps also with your own overlay.
edit: Ah I see now what you mean. The current present and average stays in the 240 range. So that would match my 240hz. Interesting. Hmmm there is no way to force that off? I dont want to play NICE 2 at 60hz lol
But can you explain this further in detail? Because fps counters (even the game's own one) show 1000 fps. They apparently show the fliprate then?
Thats really confusing to me. So despite the game shows 1000 fps its in reality just refreshrate's framerate?? But yes seems to, because gamespeed increase is also just 240 and not 1000 fps fast like in dgvoodoo.
But its just the framerate capped to refreshrate right? Because if it would force vsync on, you would see no screen tearing at all ever. VSync on or off is an important thing to know, especially for 60hz monitor users.
I dont want to play NICE 2 at 60hz lol
You don't have to play it at 60Hz. FpsLimiter=flipend(60) works just fine at any refresh rate.
But can you explain this further in detail? Because fps counters (even the game's own one) show 1000 fps. They apparently show the fliprate then?
Yes, the game's own fps counter would only be able to measure the flip rate, though it seems to be quite buggy even at that. For external frame rate counters, it depends on what they hook and how exactly.
Thats really confusing to me. So despite the game shows 1000 fps its in reality just refreshrate's framerate??
The game's fps counter seems buggy, I wouldn't really trust what it shows.
But yes seems to, because gamespeed increase is also just 240 and not 1000 fps fast like in dgvoodoo.
The game's speed should depend on the flip rate, not on the present rate. If you limit it to 60 fps, it should run at normal speed, even if your display refresh rate is 240 Hz.
But its just the framerate capped to refreshrate right?
I think you're confusing two separate things. The frame rate is whatever you see as flip rate in the overlay. It can be capped or uncapped depending on your FpsLimiter and VSync settings in DDrawCompat.
Because if it would force vsync on, you would see no screen tearing at all ever. VSync on or off is an important thing to know, especially for 60hz monitor users.
DDrawCompat does force VSync on for displayed frames, so you should never see tearing. Especially in borderless fullscreen mode, which probably goes through the DWM compositor, which itself should also guarantee no tearing.
If your frame rate (flip rate) is higher than the refresh rate, then some frames are discarded by DDrawCompat and will never be displayed.
though it seems to be quite buggy even at that
Why you think its buggy? you have to look at the most right number for the current fps rate. the value in the middle (FPSø is the average fps number) current fps cant be higher than 1000. Either the fps counter cant measure higher than that or its the game's maximum fps.
For me the fps counter works perfectly fine.
The game's speed should depend on the flip rate, not on the present rate. If you limit it to 60 fps, it should run at normal speed, even if your display refresh rate is 240 Hz.
Yes it does that. But if I run it uncapped it wont exceed 240 fps ingame speed while in dgvoodoo it does that. Probably because dgvoodoo doesnt discard frames down to monitor refresh rate fps at present rate.
DDrawCompat does force VSync on for displayed frames, so you should never see tearing. Especially in borderless fullscreen mode, which probably goes through the DWM compositor, which itself should also guarantee no tearing.
But that doesnt equal VSync in Nvidia Control panel to set enabled? With its well known additional input lag and the definitive fps lock to monitor's refreshrate? The Vsync is the confusing part here. Is it just the present rate has a fps cap to monitor's refreshrate or is it the vsync all we know about? Probably just a framerate cap on the present rate? Thats how it looks to me. Because on real vsync the fliprate would be locked down to monitor refresh already I highly assume.
If your frame rate (flip rate) is higher than the refresh rate, then some frames are discarded by DDrawCompat and will never be displayed.
Which I'm not a fan of. Could this made be optional or is it not possible with ddraw? Because this issue is actually awful. If a player has only 60hz monitor, he will never see more than 60fps on the game. But fps matters. Especially if you have only 60hz monitor, you really WANT uncapped fps and not a 60fps cap on top. You still have always the most up to date frame despite the frame inbetween coming teared to you which will still make the game smoother at uncapped. And the input lag is lower too. This is covered by testing yourself, because clearly felt, but also covered by many videos:
The full video is worth to watch. He at first compares vsync, but later also just fps capped to 60 vs uncapped etc. https://www.youtube.com/watch?v=uzp8z1i5-Hc
This timestamp explains it in even more detail than the previous video https://www.youtube.com/watch?v=msOWcvoIC8M&t=158s
Here is another nice table at this timestamp where it can be seen that uncapped is the best https://youtu.be/zv2UTb1BllM?t=2630
So if its somehow possible to make it only optional cap to display refresh framerate, that would be very good! Especially for 60hz monitor users
Why you think its buggy?
If I set FpsLimiter to 75, the rightmost number is rapidly alternating between 3 values: 62, 66 and 1000.
Yes it does that. But if I run it uncapped it wont exceed 240 fps ingame speed while in dgvoodoo it does that.
It does exceed the maximum refresh rate in game speed easily for me. Not sure what could be different on your end. Present rate is internal to DDrawCompat, the game is unaware of it and cannot measure it, so it can't base its speed on it either. Only the flip rate should matter for the game speed, I think.
For the input lag debate, I'm well aware of how things work, and I doubt that allowing tearing will make a noticeable difference (apart from the obvious tearing in exclusive fullscreen mode). But I'll try to add a setting for it in the future. It seems like it may be the only way to get proper present rate out of GSync as well. The current method doesn't work very well with GSync enabled, as the the present rate is often lower than it should be.
As for higher FPS limit, I added a VSync=wait option in v0.5.4 that achieves the same effect as FpsLimiter=flipend, but synced to the refresh rate or some fraction of it. In your case, you could set it to wait(4) to get an exact 60 FPS at 240 Hz. The existing VSync=on setting can work similarly to FpsLimiter=flipstart in most cases, but again using the refresh rate or some fraction of it as a limit.
I still need to add some similar option for the FpsLimiter=msgloop case. I'll keep this issue open for that, and for the v-sync off request.
Can we increase the fps limiter max value from 200 to like 999? If 240fps would be possible it would match my 240hz monitor.