Skip to content

Commit 72e12cf

Browse files
committed
Tweaks
1 parent e798f13 commit 72e12cf

File tree

5 files changed

+45
-51
lines changed

5 files changed

+45
-51
lines changed

Client/core/CCommands.cpp

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -179,32 +179,12 @@ bool CCommands::Execute(const char* szCommand, const char* szParametersIn, bool
179179
CCore::GetSingleton().GetFPSLimiter()->SetUserDefinedFPS(fpsVal);
180180
}
181181

182-
// HACK: Foul dirty hack to force vsync (Awaiting PR)
182+
// HACK: Foul dirty hack to force vsync (Rework on #4427)
183183
if (key == "vsync")
184184
{
185185
bool bVSync;
186186
CVARS_GET("vsync", bVSync);
187-
if (!bVSync)
188-
{
189-
OutputDebugLine("VSync disabled, removing fps_limit display refresh rate");
190-
CCore::GetSingleton().GetFPSLimiter()->SetDisplayRefreshRate(0);
191-
}
192-
else
193-
{
194-
// HACK: (pxd) Get refresh rate from Direct3D? Should this go elsewhere?
195-
D3DDISPLAYMODE DisplayMode;
196-
IDirect3D9* pD3D9 = CProxyDirect3D9::StaticGetDirect3D();
197-
if (pD3D9 && pD3D9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &DisplayMode) == D3D_OK) // Query current display mode
198-
{
199-
OutputDebugLine(SString("VSync enabled, setting fps_limit to display refresh rate %d Hz", DisplayMode.RefreshRate));
200-
CCore::GetSingleton().GetFPSLimiter()->SetDisplayRefreshRate(DisplayMode.RefreshRate);
201-
}
202-
else
203-
{
204-
OutputDebugLine("VSync enabled, but failed to get display refresh rate, defaulting to 60 Hz");
205-
CCore::GetSingleton().GetFPSLimiter()->SetDisplayRefreshRate(60);
206-
}
207-
}
187+
CCore::GetSingleton().GetFPSLimiter()->SetDisplayVSync(bVSync);
208188
}
209189
}
210190
else

Client/core/DXHook/CProxyDirect3D9.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -833,13 +833,6 @@ HRESULT HandleCreateDeviceResult(HRESULT hResult, IDirect3D9* pDirect3D, UINT Ad
833833
strMessage += SString("Direct3D CreateDevice error: %08x", hResult);
834834
BrowseToSolution("d3dcreatedevice-fail", EXIT_GAME_FIRST | ASK_GO_ONLINE, strMessage);
835835
}
836-
else
837-
{
838-
// Get current refresh rate
839-
D3DDISPLAYMODE DisplayMode;
840-
if (pDirect3D->GetAdapterDisplayMode(Adapter, &DisplayMode) == D3D_OK)
841-
CCore::GetSingleton().GetFPSLimiter()->SetDisplayRefreshRate(DisplayMode.RefreshRate);
842-
}
843836

844837
return hResult;
845838
}

Client/core/FPSLimiter.cpp

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ namespace FPSLimiter
4949
m_data.serverEnforcedFPS = 0;
5050
m_data.clientEnforcedFPS = 0;
5151
m_data.userDefinedFPS = 0;
52-
// m_data.displayRefreshRate = 0; // We do not reset display refresh rate
52+
53+
bool bVSync;
54+
CVARS_GET("vsync", bVSync);
55+
m_data.displayRefreshRate = bVSync ? GetDisplayRefreshRate() : 0;
5356
CalculateCurrentFPSLimit();
5457
}
5558

@@ -86,7 +89,7 @@ namespace FPSLimiter
8689
if (m_data.displayRefreshRate > FPS_LIMIT_MIN && m_data.displayRefreshRate < minFPS)
8790
{
8891
minFPS = m_data.displayRefreshRate;
89-
enforcer = EnforcerType::RefreshRate;
92+
enforcer = EnforcerType::VSync;
9093
}
9194

9295
// If the lowest matches the active target, return its enforcer
@@ -115,16 +118,28 @@ namespace FPSLimiter
115118
CalculateCurrentFPSLimit();
116119
}
117120

118-
void FPSLimiter::SetDisplayRefreshRate(std::uint32_t refreshRate)
121+
void FPSLimiter::SetDisplayVSync(bool enabled)
119122
{
120-
m_data.displayRefreshRate = ValidateFPS(refreshRate);
123+
m_data.displayRefreshRate = enabled ? GetDisplayRefreshRate() : 0;
121124
CalculateCurrentFPSLimit();
122125
}
123126

124127
#pragma endregion Interface
125128

126129
#pragma region Internal
127130

131+
std::uint32_t FPSLimiter::GetDisplayRefreshRate()
132+
{
133+
D3DDISPLAYMODE DisplayMode;
134+
IDirect3D9* pD3D9 = CProxyDirect3D9::StaticGetDirect3D();
135+
if (pD3D9 && pD3D9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &DisplayMode) == D3D_OK)
136+
{
137+
return ValidateFPS(DisplayMode.RefreshRate);
138+
}
139+
// Fallback to 60 Hz if unable to get refresh rate
140+
return 60;
141+
}
142+
128143
// Priority: Server > Client > User > None
129144
void FPSLimiter::CalculateCurrentFPSLimit()
130145
{
@@ -154,10 +169,6 @@ namespace FPSLimiter
154169

155170
m_data.activeFPSTarget = minFPS;
156171

157-
std::stringstream ss;
158-
ss << "FPSLimiter: Calculated active FPS limit: " << m_data.activeFPSTarget;
159-
OutputDebugLine(ss.str().c_str());
160-
161172
// If limit changed, reset frame timing
162173
if (oldLimit != m_data.activeFPSTarget)
163174
{
@@ -168,13 +179,9 @@ namespace FPSLimiter
168179
OnFPSLimitChange();
169180
}
170181

171-
ss.clear();
172-
ss << "FPSLimiter: Calculated current FPS limit : " << m_data.activeFPSTarget
173-
<< " (Server: " << m_data.serverEnforcedFPS
174-
<< ", Client: " << m_data.clientEnforcedFPS
175-
<< ", User: " << m_data.userDefinedFPS
176-
<< ", Display: " << m_data.displayRefreshRate
177-
<< ") Enforcer: " << EnumToString(GetEnforcer());
182+
std::stringstream ss;
183+
ss << "FPSLimiter: FPS limit changed to " << (m_data.activeFPSTarget == 0 ? "unlimited" : std::to_string(m_data.activeFPSTarget));
184+
ss << " (Enforced by: " << EnumToString(GetEnforcer()) << ")";
178185

179186
auto* pConsole = CCore::GetSingleton().GetConsole();
180187
if (pConsole)
@@ -262,7 +269,11 @@ namespace FPSLimiter
262269
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
263270
if (ntdll)
264271
{
265-
NtSetTimerResolution setRes = reinterpret_cast<NtSetTimerResolution>(GetProcAddress(ntdll, "NtSetTimerResolution"));
272+
auto proc = GetProcAddress(ntdll, "NtSetTimerResolution");
273+
#pragma warning(push)
274+
#pragma warning(suppress : 4191)
275+
auto setRes = reinterpret_cast<NtSetTimerResolution>(proc);
276+
#pragma warning(pop)
266277
if (setRes)
267278
{
268279
ULONG actualRes;
@@ -356,6 +367,14 @@ namespace FPSLimiter
356367

357368
#pragma endregion Events
358369

370+
IMPLEMENT_ENUM_BEGIN(EnforcerType)
371+
ADD_ENUM(EnforcerType::None, "none")
372+
ADD_ENUM(EnforcerType::VSync, "vsync")
373+
ADD_ENUM(EnforcerType::UserDefined, "user-defined")
374+
ADD_ENUM(EnforcerType::Client, "client")
375+
ADD_ENUM(EnforcerType::Server, "server")
376+
IMPLEMENT_ENUM_END("EnforcerType");
377+
359378
}; // namespace FPSLimiter
360379

361380
std::uint32_t FPSLimiter::ValidateFPS(std::uint32_t uiFPS)

Client/core/FPSLimiter.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,12 @@ namespace FPSLimiter
5555
void SetServerEnforcedFPS(std::uint32_t frameRateLimit);
5656
void SetClientEnforcedFPS(std::uint32_t frameRateLimit);
5757
void SetUserDefinedFPS(std::uint32_t frameRateLimit);
58-
void SetDisplayRefreshRate(std::uint32_t refreshRate);
58+
void SetDisplayVSync(bool enabled);
5959

6060
public:
6161
// Internal
62+
std::uint32_t GetDisplayRefreshRate();
63+
6264
void CalculateCurrentFPSLimit();
6365
void SetFrameRateThrottle();
6466

Client/sdk/core/FPSLimiterInterface.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ namespace FPSLimiter
2222
enum class EnforcerType : std::uint8_t
2323
{
2424
None = 0, // No frame rate limit enforced (unlimited FPS)
25-
RefreshRate = 1, // Frame rate limit set to display refresh rate
26-
UserDefined = 2, // Frame rate limit set by the user via settings menu or console variable
27-
Client = 3, // Frame rate limit enforced by the client (e.g., script)
28-
Server = 4 // Frame rate limit enforced by the server
25+
VSync = 1, // Frame rate limited by display refresh rate
26+
UserDefined = 2, // Frame rate limited by the user via settings menu or console variable
27+
Client = 3, // Frame rate limited by the client script
28+
Server = 4 // Frame rate limited by the server script
2929
};
3030
DECLARE_ENUM(EnforcerType);
3131

@@ -49,7 +49,7 @@ namespace FPSLimiter
4949
virtual void SetServerEnforcedFPS(std::uint32_t frameRateLimit) = 0; // Set the server-enforced frame rate limit (0 = no limit)
5050
virtual void SetClientEnforcedFPS(std::uint32_t frameRateLimit) = 0; // Set the client-enforced frame rate limit (0 = no limit)
5151
virtual void SetUserDefinedFPS(std::uint32_t frameRateLimit) = 0; // Set the user-defined frame rate limit (0 = no limit)
52-
virtual void SetDisplayRefreshRate(std::uint32_t refreshRate) = 0; // Set the display refresh rate to cap FPS (0 = no cap)
52+
virtual void SetDisplayVSync(bool enabled) = 0; // Set the display refresh rate to cap FPS (0 = no cap)
5353

5454
virtual void OnFPSLimitChange() = 0; // Event handler called when the active frame rate limit changes
5555
virtual void OnFrameStart() = 0; // Event handler called at the start of each frame

0 commit comments

Comments
 (0)