diff options
-rw-r--r-- | src/core/Frontend.cpp | 20 | ||||
-rw-r--r-- | src/core/Timer.cpp | 67 | ||||
-rw-r--r-- | src/core/Timer.h | 4 | ||||
-rw-r--r-- | src/core/main.cpp | 5 |
4 files changed, 39 insertions, 57 deletions
diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 4677e4c9..3057ceac 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -950,12 +950,7 @@ CMenuManager::DisplayHelperText() m_nHelperTextAlpha -= 2; } #else - static float fadeAlpha = 0.0f; // To keep it precisely - if (m_nHelperTextAlpha >= 255 && fadeAlpha < 250) fadeAlpha = m_nHelperTextAlpha; - - // -2 per every 33 ms (1000.f/30.f - original frame limiter fps) - fadeAlpha -= (frameTime / 33.0f) * 2.0f; - m_nHelperTextAlpha = fadeAlpha; + m_nHelperTextAlpha -= 2 * CTimer::GetLogicalFramesPassed(); #endif if (m_nHelperTextAlpha < 1) ResetHelperText(); @@ -2686,11 +2681,7 @@ CMenuManager::DrawFrontEndNormal() static float fadeAlpha = 0.0f; if (m_nMenuFadeAlpha < 255) { - if (m_nMenuFadeAlpha == 0 && fadeAlpha > 1.0f) fadeAlpha = 0.0f; - - // +20 per every 33 ms (1000.f/30.f - original frame limiter fps) - fadeAlpha += (frameTime) * 20.f / 33.f; - m_nMenuFadeAlpha = fadeAlpha; + m_nMenuFadeAlpha += 20 * CTimer::GetLogicalFramesPassed(); } else { // TODO: what is this? waiting mouse? if(field_518 == 4){ @@ -2950,12 +2941,7 @@ CMenuManager::DrawFrontEndNormal() // Famous transparent menu bug #ifdef FIX_BUGS - static float fadeAlpha = 0.0f; - if (m_nMenuFadeAlpha == 0 && fadeAlpha > 1.0f) fadeAlpha = 0.0f; - - // +20 per every 33 ms (1000.f/30.f - original frame limiter fps) - fadeAlpha += (frameTime) * 20.f / 33.f; - m_nMenuFadeAlpha = fadeAlpha; + m_nMenuFadeAlpha += 20 * CTimer::GetLogicalFramesPassed(); #else static uint32 LastFade = 0; diff --git a/src/core/Timer.cpp b/src/core/Timer.cpp index 0c1875e9..29875c91 100644 --- a/src/core/Timer.cpp +++ b/src/core/Timer.cpp @@ -37,10 +37,6 @@ RsTimerType suspendPcTimer; uint32 suspendDepth; -#ifdef FIX_BUGS -double frameTime; -#endif - void CTimer::Initialise(void) { debug("Initialising CTimer...\n"); @@ -90,6 +86,12 @@ void CTimer::Shutdown(void) void CTimer::Update(void) { +#ifdef FIX_BUGS + static double frameTimeLogical = 0.0; + static double frameTimeFraction = 0.0; + static double frameTimeFractionScaled = 0.0; +#endif + m_snPreviousTimeInMilliseconds = m_snTimeInMilliseconds; #ifdef _WIN32 @@ -101,31 +103,30 @@ void CTimer::Update(void) int32 updInCycles = (pc.LowPart - _oldPerfCounter.LowPart); // & 0x7FFFFFFF; pointless _oldPerfCounter = pc; - + + // bugfix from VC +#ifdef FIX_BUGS + float updInCyclesScaled = GetIsPaused() ? updInCycles : updInCycles * ms_fTimeScale; +#else float updInCyclesScaled = updInCycles * ms_fTimeScale; - - // We need that real frame time to fix transparent menu bug. -#ifndef FIX_BUGS - double #endif - frameTime = updInCyclesScaled / (double)_nCyclesPerMS; + + double frameTime = updInCyclesScaled / (double)_nCyclesPerMS; #ifdef FIX_BUGS + // count frames as if we're running at 30 fps m_LogicalFramesPassed = 0; - static double frameTimeLogical = 0.0; frameTimeLogical += ((double)updInCycles / (double)_nCyclesPerMS); while (frameTimeLogical >= 1000.0 / 30.0) { frameTimeLogical -= 1000.0 / 30.0; m_LogicalFramesPassed++; } m_LogicalFrameCounter += m_LogicalFramesPassed; -#endif -#ifdef FIX_BUGS - static double frameTimeDouble = 0.0; - frameTimeDouble += frameTime; + frameTimeFraction += (double)updInCycles / (double)_nCyclesPerMS; + frameTimeFractionScaled += frameTime; - m_snTimeInMillisecondsPauseMode += uint32(frameTimeDouble); + m_snTimeInMillisecondsPauseMode += uint32(frameTimeFraction); #else m_snTimeInMillisecondsPauseMode = m_snTimeInMillisecondsPauseMode + frameTime; #endif @@ -135,8 +136,8 @@ void CTimer::Update(void) else { #ifdef FIX_BUGS - m_snTimeInMilliseconds += uint32(frameTimeDouble); - m_snTimeInMillisecondsNonClipped += uint32(frameTimeDouble); + m_snTimeInMilliseconds += uint32(frameTimeFractionScaled); + m_snTimeInMillisecondsNonClipped += uint32(frameTimeFractionScaled); #else m_snTimeInMilliseconds = m_snTimeInMilliseconds + frameTime; m_snTimeInMillisecondsNonClipped = m_snTimeInMillisecondsNonClipped + frameTime; @@ -144,7 +145,8 @@ void CTimer::Update(void) ms_fTimeStep = frameTime / 1000.0f * 50.0f; } #ifdef FIX_BUGS - frameTimeDouble -= uint32(frameTimeDouble); + frameTimeFraction -= uint32(frameTimeFraction); + frameTimeFractionScaled -= uint32(frameTimeFractionScaled); #endif } else @@ -154,30 +156,24 @@ void CTimer::Update(void) RsTimerType updInMs = timer - oldPcTimer; - // We need that real frame time to fix transparent menu bug. -#ifndef FIX_BUGS - double -#endif - frameTime = (double)updInMs * ms_fTimeScale; + double frameTime = (double)updInMs * ms_fTimeScale; + + oldPcTimer = timer; #ifdef FIX_BUGS + // count frames as if we're running at 30 fps m_LogicalFramesPassed = 0; - static double frameTimeLogical = 0.0; frameTimeLogical += (double)updInMs; while(frameTimeLogical >= 1000.0 / 30.0) { frameTimeLogical -= 1000.0 / 30.0; m_LogicalFramesPassed++; } m_LogicalFrameCounter += m_LogicalFramesPassed; -#endif - oldPcTimer = timer; - -#ifdef FIX_BUGS - static double frameTimeDouble = 0.0; - frameTimeDouble += frameTime; + frameTimeFraction += (double)updInMs; + frameTimeFractionScaled += frameTime; - m_snTimeInMillisecondsPauseMode += uint32(frameTimeDouble); + m_snTimeInMillisecondsPauseMode += uint32(frameTimeFraction); #else m_snTimeInMillisecondsPauseMode = m_snTimeInMillisecondsPauseMode + frameTime; #endif @@ -187,8 +183,8 @@ void CTimer::Update(void) else { #ifdef FIX_BUGS - m_snTimeInMilliseconds += uint32(frameTimeDouble); - m_snTimeInMillisecondsNonClipped += uint32(frameTimeDouble); + m_snTimeInMilliseconds += uint32(frameTimeFractionScaled); + m_snTimeInMillisecondsNonClipped += uint32(frameTimeFractionScaled); #else m_snTimeInMilliseconds = m_snTimeInMilliseconds + frameTime; m_snTimeInMillisecondsNonClipped = m_snTimeInMillisecondsNonClipped + frameTime; @@ -196,7 +192,8 @@ void CTimer::Update(void) ms_fTimeStep = frameTime / 1000.0f * 50.0f; } #ifdef FIX_BUGS - frameTimeDouble -= uint32(frameTimeDouble); + frameTimeFraction -= uint32(frameTimeFraction); + frameTimeFractionScaled -= uint32(frameTimeFractionScaled); #endif } diff --git a/src/core/Timer.h b/src/core/Timer.h index 7b68303a..819bd30c 100644 --- a/src/core/Timer.h +++ b/src/core/Timer.h @@ -69,7 +69,3 @@ public: static uint32 GetLogicalFramesPassed(void) { return m_LogicalFramesPassed; } #endif }; - -#ifdef FIX_BUGS -extern double frameTime; -#endif diff --git a/src/core/main.cpp b/src/core/main.cpp index 492f481e..6a773ba5 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -1177,7 +1177,10 @@ DisplayGameDebugText() FrameSamples++; #ifdef FIX_BUGS - FramesPerSecondCounter += frameTime / 1000.f; // convert to seconds + // this is inaccurate with over 1000 fps + static uint32 PreviousTimeInMillisecondsPauseMode = 0; + FramesPerSecondCounter += (CTimer::GetTimeInMillisecondsPauseMode() - PreviousTimeInMillisecondsPauseMode) / 1000.0f; // convert to seconds + PreviousTimeInMillisecondsPauseMode = CTimer::GetTimeInMillisecondsPauseMode(); FramesPerSecond = FrameSamples / FramesPerSecondCounter; #else FramesPerSecondCounter += 1000.0f / CTimer::GetTimeStepNonClippedInMilliseconds(); |