@@ -1718,6 +1718,14 @@ void CCore::UpdateRecentlyPlayed()
17181718 CCore::GetSingleton ().SaveConfig ();
17191719}
17201720
1721+ //
1722+ // Called just before GTA calculates frame time deltas
1723+ //
1724+ void CCore::OnGameTimerUpdate ()
1725+ {
1726+ ApplyQueuedFrameRateLimit ();
1727+ }
1728+
17211729//
17221730// Recalculate FPS limit to use
17231731//
@@ -1793,34 +1801,47 @@ void CCore::ApplyFrameRateLimit(uint uiOverrideRate)
17931801
17941802 uint uiUseRate = uiOverrideRate != -1 ? uiOverrideRate : m_uiFrameRateLimit;
17951803
1796- TIMING_GRAPH (" Limiter" );
1797-
1798- if (uiUseRate < 1 )
1799- return DoReliablePulse ();
1800-
1801- if (m_DiagnosticDebug != EDiagnosticDebug::D3D_6732)
1802- Sleep (1 ); // Make frame rate smoother maybe
1803-
1804- // Calc required time in ms between frames
1805- const double dTargetTimeToUse = 1000.0 / uiUseRate;
1806-
1807- while (true )
1804+ if (uiUseRate > 0 )
18081805 {
1809- // See if we need to wait
1810- double dSpare = dTargetTimeToUse - m_FrameRateTimer. Get ();
1811- if (dSpare <= 0.0 )
1812- break ;
1813- if (dSpare >= 2.0 )
1814- Sleep ( 1 ) ;
1806+ // Apply previous frame rate if is hasn't been done yet
1807+ ApplyQueuedFrameRateLimit ();
1808+
1809+ // Limit is usually applied in OnGameTimerUpdate
1810+ m_uiQueuedFrameRate = uiUseRate;
1811+ m_bQueuedFrameRateValid = true ;
18151812 }
1816- m_FrameRateTimer.Reset ();
18171813
18181814 DoReliablePulse ();
18191815
18201816 TIMING_GRAPH (" FrameEnd" );
18211817 TIMING_GRAPH (" " );
18221818}
18231819
1820+ //
1821+ // Frame rate limit (wait) is done here.
1822+ //
1823+ void CCore::ApplyQueuedFrameRateLimit ()
1824+ {
1825+ if (m_bQueuedFrameRateValid)
1826+ {
1827+ m_bQueuedFrameRateValid = false ;
1828+ // Calc required time in ms between frames
1829+ const double dTargetTimeToUse = 1000.0 / m_uiQueuedFrameRate;
1830+
1831+ while (true )
1832+ {
1833+ // See if we need to wait
1834+ double dSpare = dTargetTimeToUse - m_FrameRateTimer.Get ();
1835+ if (dSpare <= 0.0 )
1836+ break ;
1837+ if (dSpare >= 2.0 )
1838+ Sleep (1 );
1839+ }
1840+ m_FrameRateTimer.Reset ();
1841+ TIMING_GRAPH (" Limiter" );
1842+ }
1843+ }
1844+
18241845//
18251846// DoReliablePulse
18261847//
0 commit comments