Skip to content

Commit 93459e6

Browse files
committed
FramerateLimitMode: add setting to improve accuracy at cost of higher CPU usage
1 parent 418a02b commit 93459e6

File tree

4 files changed

+22
-10
lines changed

4 files changed

+22
-10
lines changed

Outrun2006Tweaks.ini

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,21 @@
44
# Set to 0 to disable this framelimiter, in case you want to use an external one instead.
55
FramerateLimit = 60
66

7+
# FramerateLimitMode: Improve accuracy of the framerate limiter at a cost of higher CPU usage.
8+
# 0 = efficient mode
9+
# 1 = accurate mode
10+
FramerateLimitMode = 0
11+
712
# FramerateFastLoad: Unlimits framerate during load screens to help reduce load times.
813
# 0 = disable
9-
# 1 = only unlimit framerate
10-
# 2 = unlimit framerate & disable vsync (fastest, but may cause screen flash)
14+
# 1 = unlimit framerate
15+
# 2 = unlimit framerate & disable vsync (fastest but may cause screen flash)
1116
FramerateFastLoad = 1
1217

1318
# FramerateUnlockExperimental: Prevents game from speeding up when playing with FramerateLimit above 60FPS.
1419
# Works by forcing game to only update at 60Hz, while rendering is allowed to run at a higher rate.
1520
# Though since game still runs at 60Hz internally this isn't as good as a true framerate unlock, but might still be useful for some.
16-
# (higher FPS also has issues with certain textures / UI elements being animated too quickly too, not too noticeable at 120/144, but can be disorientating at 3000+FPS)
21+
# (certain textures/UI elements may animate faster at higher FPS, but gameplay should remain the same speed)
1722
# Should be fine to leave this enabled in most cases, but if you have issues feel free to disable this here.
1823
FramerateUnlockExperimental = true
1924

src/dllmain.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ namespace Settings
8484
fclose(iniFile);
8585

8686
FramerateLimit = ini.Get("Performance", "FramerateLimit", std::move(FramerateLimit));
87+
FramerateLimitMode = ini.Get("Performance", "FramerateLimitMode", std::move(FramerateLimitMode));
8788
FramerateFastLoad = ini.Get("Performance", "FramerateFastLoad", std::move(FramerateFastLoad));
8889
FramerateUnlockExperimental = ini.Get("Performance", "FramerateUnlockExperimental", std::move(FramerateUnlockExperimental));
8990
VSync = ini.Get("Performance", "VSync", std::move(VSync));

src/hooks_framerate.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,26 +83,31 @@ class ReplaceGameUpdateLoop : public Hook
8383
timeCurrent = double(counter.QuadPart) / FramelimiterFrequency;
8484
timeElapsed = timeCurrent - FramelimiterPrevCounter;
8585

86-
if (FramelimiterTargetFrametime + FramelimiterDeviation <= timeElapsed)
86+
if (Settings::FramerateLimitMode == 0) // "efficient" mode
8787
{
88-
FramelimiterDeviation = 0;
89-
break;
88+
if (FramelimiterTargetFrametime + FramelimiterDeviation <= timeElapsed)
89+
{
90+
FramelimiterDeviation = 0;
91+
break;
92+
}
93+
else if ((FramelimiterTargetFrametime + FramelimiterDeviation) - timeElapsed > 2.0)
94+
Sleep(1); // Sleep for ~1ms
95+
else
96+
Sleep(0); // Yield thread's time-slice (does not actually sleep)
9097
}
91-
else if ((FramelimiterTargetFrametime + FramelimiterDeviation) - timeElapsed > 2.0)
92-
Sleep(1); // Sleep for ~1ms
93-
else
94-
Sleep(0); // Yield thread's time-slice (does not actually sleep)
9598
} while (FramelimiterTargetFrametime + FramelimiterDeviation > timeElapsed);
9699

97100
QueryPerformanceCounter(&counter);
98101
timeCurrent = double(counter.QuadPart) / FramelimiterFrequency;
99102
timeElapsed = timeCurrent - FramelimiterPrevCounter;
100103

104+
#if 0
101105
// Compensate for the deviation in the next frame (based on dxvk util_fps_limiter)
102106
double deviation = timeElapsed - FramelimiterTargetFrametime;
103107
FramelimiterDeviation += deviation;
104108
// Limit the cumulative deviation
105109
FramelimiterDeviation = std::clamp(FramelimiterDeviation, -FramelimiterMaxDeviation, FramelimiterMaxDeviation);
110+
#endif
106111

107112
FramelimiterPrevCounter = timeCurrent;
108113
}

src/plugin.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ namespace Game
3535
namespace Settings
3636
{
3737
inline int FramerateLimit = 60;
38+
inline bool FramerateLimitMode = 0;
3839
inline int FramerateFastLoad = 1;
3940
inline bool FramerateUnlockExperimental = true;
4041
inline int VSync = 1;

0 commit comments

Comments
 (0)