diff --git a/Client/core/CCore.cpp b/Client/core/CCore.cpp index 4365a88e274..bafebb15253 100644 --- a/Client/core/CCore.cpp +++ b/Client/core/CCore.cpp @@ -156,6 +156,7 @@ CCore::CCore() m_bGettingIdleCallsFromMultiplayer = false; m_bWindowsTimerEnabled = false; m_timeDiscordAppLastUpdate = 0; + m_CurrentRefreshRate = 60; // Create tray icon m_pTrayIcon = new CTrayIcon(); @@ -1835,6 +1836,9 @@ void CCore::RecalculateFrameRateLimit(uint uiServerFrameRateLimit, bool bLogToCo if ((m_uiFrameRateLimit == 0 || uiClientScriptRate < m_uiFrameRateLimit) && uiClientScriptRate > 0) m_uiFrameRateLimit = uiClientScriptRate; + if (!IsConnected()) + m_uiFrameRateLimit = m_CurrentRefreshRate; + // Removes Limiter from Frame Graph if limit is zero and skips frame limit if (m_uiFrameRateLimit == 0) { @@ -1861,6 +1865,12 @@ void CCore::SetClientScriptFrameRateLimit(uint uiClientScriptFrameRateLimit) RecalculateFrameRateLimit(-1, false); } +void CCore::SetCurrentRefreshRate(uint value) +{ + m_CurrentRefreshRate = value; + RecalculateFrameRateLimit(-1, false); +} + // // Make sure the frame rate limit has been applied since the last call // @@ -1921,7 +1931,7 @@ void CCore::ApplyQueuedFrameRateLimit() double dSpare = dTargetTimeToUse - m_FrameRateTimer.Get(); if (dSpare <= 0.0) break; - if (dSpare >= 2.0) + if (dSpare >= 10.0) Sleep(1); } m_FrameRateTimer.Reset(); diff --git a/Client/core/CCore.h b/Client/core/CCore.h index 44147c888e0..aedb7753364 100644 --- a/Client/core/CCore.h +++ b/Client/core/CCore.h @@ -223,6 +223,7 @@ class CCore : public CCoreInterface, public CSingleton void ApplyQueuedFrameRateLimit(); void EnsureFrameRateLimitApplied(); void SetClientScriptFrameRateLimit(uint uiClientScriptFrameRateLimit); + void SetCurrentRefreshRate(uint value); void DoReliablePulse(); bool IsTimingCheckpoints(); @@ -371,6 +372,7 @@ class CCore : public CCoreInterface, public CSingleton CElapsedTimeHD m_FrameRateTimer; uint m_uiQueuedFrameRate; bool m_bQueuedFrameRateValid; + uint m_CurrentRefreshRate; bool m_requestNewNickname{false}; EDiagnosticDebugType m_DiagnosticDebug; diff --git a/Client/core/CMainMenu.cpp b/Client/core/CMainMenu.cpp index e7c521baffe..de33f8d60a4 100644 --- a/Client/core/CMainMenu.cpp +++ b/Client/core/CMainMenu.cpp @@ -778,6 +778,9 @@ void CMainMenu::SetIsIngame(bool bIsIngame) m_bIsIngame = bIsIngame; m_Settings.SetIsModLoaded(bIsIngame); + // Reset frame rate limit + CCore::GetSingleton().RecalculateFrameRateLimit(-1, false); + m_ulMoveStartTick = GetTickCount32(); if (bIsIngame) { diff --git a/Client/core/CModManager.cpp b/Client/core/CModManager.cpp index 05d255df2b6..9f98251c6c9 100644 --- a/Client/core/CModManager.cpp +++ b/Client/core/CModManager.cpp @@ -93,7 +93,7 @@ void CModManager::DoPulsePostFrame() if (m_client != nullptr) CCore::GetSingleton().EnsureFrameRateLimitApplied(); // Catch missed frames else - CCore::GetSingleton().ApplyFrameRateLimit(88); // Limit when not connected + CCore::GetSingleton().ApplyFrameRateLimit(); // Limit when not connected if (m_state == State::PendingStart) { diff --git a/Client/core/DXHook/CProxyDirect3D9.cpp b/Client/core/DXHook/CProxyDirect3D9.cpp index bc0d5fb0687..f34f2a8fc4b 100644 --- a/Client/core/DXHook/CProxyDirect3D9.cpp +++ b/Client/core/DXHook/CProxyDirect3D9.cpp @@ -833,6 +833,13 @@ HRESULT HandleCreateDeviceResult(HRESULT hResult, IDirect3D9* pDirect3D, UINT Ad strMessage += SString("Direct3D CreateDevice error: %08x", hResult); BrowseToSolution("d3dcreatedevice-fail", EXIT_GAME_FIRST | ASK_GO_ONLINE, strMessage); } + else + { + // Get current refresh rate + D3DDISPLAYMODE DisplayMode; + if (pDirect3D->GetAdapterDisplayMode(Adapter, &DisplayMode) == D3D_OK) + CCore::GetSingleton().SetCurrentRefreshRate(DisplayMode.RefreshRate); + } return hResult; }