diff --git a/win32/wsnes9x.cpp b/win32/wsnes9x.cpp index 3dce543a..81e48bcf 100644 --- a/win32/wsnes9x.cpp +++ b/win32/wsnes9x.cpp @@ -87,7 +87,6 @@ extern SNPServer NPServer; #endif __int64 PCBase, PCFrameTime, PCFrameTimeNTSC, PCFrameTimePAL, PCStart, PCEnd; -DWORD PCStartTicks, PCEndTicks; INT_PTR CALLBACK DlgSoundConf(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK DlgInfoProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); @@ -2803,83 +2802,33 @@ VOID CALLBACK HotkeyTimer( UINT idEvent, UINT uMsg, DWORD dwUser, DWORD dw1, DWO } } -void CALLBACK FrameTimer( UINT idEvent, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) +bool ThrottleTimer() { - // QueryPerformanceCounter is unreliable on newfangled frequency-switching computers, - // yet is absolutely necessary for best performance on somewhat older computers (even ones that are capable of frequency switching but don't do it very often). - // Thus, we keep two timers and use the QueryPerformanceCounter one unless the other (more accurate but less precise) - // one differs from it by more than a few milliseconds. - - QueryPerformanceCounter((LARGE_INTEGER*)&PCEnd); - PCEndTicks = timeGetTime()*1000; - - const __int64 PCElapsedPrecise = PCEnd - PCStart; - const __int64 PCElapsedAccurate = (__int64)(PCEndTicks - PCStartTicks) * PCBase / 1000000; - const bool useTicksTimer = (abs((int)(PCElapsedPrecise - PCElapsedAccurate)) > (PCBase >> 7)); // if > 7.8 ms difference, settle for accuracy at the sacrifice of precision - - while ((!useTicksTimer && (PCEnd - PCStart ) >= PCFrameTime) || - ( useTicksTimer && (PCEndTicks - PCStartTicks) >= PCFrameTime * 1000000 / PCBase)) - { - if (GUI.FrameCount == GUI.LastFrameCount) - GUI.IdleCount++; - else - { - GUI.IdleCount = 0; - GUI.LastFrameCount = GUI.FrameCount; - } + bool run_frame = false; + do_frame_adjust = false; + QueryPerformanceCounter((LARGE_INTEGER*)&PCEnd); + if (Settings.TurboMode || Settings.FrameAdvance || Settings.SkipFrames != AUTO_FRAMERATE #ifdef NETPLAY_SUPPORT - // if (Settings.NetPlay && !Settings.NetPlayServer) - // return; - if (Settings.NetPlay && !Settings.NetPlayServer) - return; - - //- if (Settings.NetPlayServer) - //- { - //- if (Settings.Paused || Settings.StopEmulation || Settings.ForcedPause) - if (Settings.NetPlayServer) - { - //- WaitForSingleObject (GUI.ServerTimerSemaphore, 0); - if ((Settings.Paused && !Settings.FrameAdvance) || Settings.StopEmulation || Settings.ForcedPause) - { - WaitForSingleObject (GUI.ServerTimerSemaphore, 0); - return; - } - ReleaseSemaphore (GUI.ServerTimerSemaphore, 1, NULL); - - if (Settings.NetPlay) - return; - } - else + || Settings.NetPlay #endif - { - if (Settings.SkipFrames != AUTO_FRAMERATE || Settings.TurboMode || - (Settings.Paused /*&& !Settings.FrameAdvance*/) || Settings.StopEmulation || Settings.ForcedPause) - { - WaitForSingleObject (GUI.FrameTimerSemaphore, 0); - PCStart = PCEnd; - PCStartTicks = PCEndTicks; - return; - } - // ReleaseSemaphore (GUI.ServerTimerSemaphore, 1, NULL); - ReleaseSemaphore (GUI.FrameTimerSemaphore, 1, NULL); - - // if (Settings.NetPlay) - // return; - // } - // else - //#endif - // if (Settings.SkipFrames != AUTO_FRAMERATE || Settings.TurboMode || - // Settings.Paused || Settings.StopEmulation || Settings.ForcedPause) - // { - // WaitForSingleObject (GUI.FrameTimerSemaphore, 0); - // return; - // } - // ReleaseSemaphore (GUI.FrameTimerSemaphore, 1, NULL); - PCStart += PCFrameTime; - PCStartTicks += (DWORD)(PCFrameTime * 1000000 / PCBase); - } + ) + { + PCStart = PCEnd; + return true; } + + while ((PCEnd - PCStart) >= PCFrameTime) + { + if ((PCEnd - PCStart) >= (PCFrameTime * 2)) + do_frame_adjust = true; + + run_frame = true; + + PCStart += PCFrameTime; + } + + return run_frame; } static void EnsureInputDisplayUpdated() @@ -3382,28 +3331,19 @@ int WINAPI WinMain( QueryPerformanceFrequency((LARGE_INTEGER*)&PCBase); QueryPerformanceCounter((LARGE_INTEGER*)&PCStart); PCEnd = PCStart; - PCEndTicks = timeGetTime()*1000; - PCStartTicks = timeGetTime()*1000; PCFrameTime = PCFrameTimeNTSC = (__int64)((float)PCBase / 60.09881389744051f); PCFrameTimePAL = PCBase / 50; Settings.StopEmulation = TRUE; - GUI.hFrameTimer = timeSetEvent (20, 0, (LPTIMECALLBACK)FrameTimer, 0, TIME_PERIODIC); if(GUI.JoystickHotkeys || GUI.BackgroundInput) GUI.hHotkeyTimer = timeSetEvent (32, 0, (LPTIMECALLBACK)HotkeyTimer, 0, TIME_PERIODIC); else GUI.hHotkeyTimer = 0; - GUI.FrameTimerSemaphore = CreateSemaphore (NULL, 0, 10, NULL); GUI.ServerTimerSemaphore = CreateSemaphore (NULL, 0, 10, NULL); - if (GUI.hFrameTimer == 0) - { - MessageBox( GUI.hWnd, Languages[ GUI.Language].errFrameTimer, TEXT("Snes9x - Frame Timer"), MB_OK | MB_ICONINFORMATION); - } - if (rom_filename) { if (Settings.Multi) // we found -cartB parameter @@ -3490,43 +3430,6 @@ int WINAPI WinMain( } } - // the following is a hack to allow frametimes greater than 100ms, - // without affecting the responsiveness of the GUI - BOOL run_loop=false; - do_frame_adjust=false; - if (Settings.TurboMode || Settings.FrameAdvance || Settings.SkipFrames != AUTO_FRAMERATE -#ifdef NETPLAY_SUPPORT - || Settings.NetPlay -#endif - ) - { - run_loop=true; - } - else - { - LONG prev; - BOOL success; - if ((success = ReleaseSemaphore (GUI.FrameTimerSemaphore, 1, &prev)) && - prev == 0) - { - WaitForSingleObject (GUI.FrameTimerSemaphore, 0); - if (WaitForSingleObject (GUI.FrameTimerSemaphore, 100) == WAIT_OBJECT_0) - { - run_loop=true; - } - } - else - { - if (success) - WaitForSingleObject (GUI.FrameTimerSemaphore, 0); - WaitForSingleObject (GUI.FrameTimerSemaphore, 0); - - run_loop=true; - do_frame_adjust=true; - } - } - - if(Settings.FrameAdvance) { if(GFX.InfoStringTimeout > 4) @@ -3538,7 +3441,7 @@ int WINAPI WinMain( if(GUI.FrameAdvanceJustPressed) GUI.FrameAdvanceJustPressed--; - if(run_loop) + if(ThrottleTimer()) { ProcessInput(); @@ -4030,7 +3933,6 @@ static void CheckMenuStates () static void ResetFrameTimer () { QueryPerformanceCounter((LARGE_INTEGER*)&PCStart); - PCStartTicks = timeGetTime()*1000; if (Settings.FrameTime == Settings.FrameTimeNTSC) PCFrameTime = PCFrameTimeNTSC; else if (Settings.FrameTime == Settings.FrameTimePAL) @@ -4040,11 +3942,6 @@ static void ResetFrameTimer () // determines if we can do sound sync GUI.AllowSoundSync = Settings.PAL ? Settings.FrameTime == Settings.FrameTimePAL : Settings.FrameTime == Settings.FrameTimeNTSC; - - if (GUI.hFrameTimer) - timeKillEvent (GUI.hFrameTimer); - - GUI.hFrameTimer = timeSetEvent ((Settings.FrameTime+500)/1000, 0, (LPTIMECALLBACK)FrameTimer, 0, TIME_PERIODIC); } static bool LoadROMPlain(const TCHAR *filename)