simplify Throttle.Step

this should also fix bugs where skipNextFrame could be stuck at true and otherwise not change behavior.

Surely this won't introduce any bugs
This commit is contained in:
Morilli 2025-03-23 03:16:11 +01:00
parent 0e0fe37ffa
commit 98e8901076
1 changed files with 13 additions and 41 deletions

View File

@ -12,7 +12,6 @@ namespace BizHawk.Client.EmuHawk
{
private int lastSkipRate;
private int framesToSkip;
private int framesSkipped;
public bool skipNextFrame;
//if the emulator is paused then we don't need to behave as if unthrottled
@ -27,15 +26,12 @@ namespace BizHawk.Client.EmuHawk
//TODO - figure out what allowSleep is supposed to be used for
//TODO - figure out what forceFrameSkip is supposed to be used for
bool extraThrottle = false;
//if we're paused, none of this should happen. just clean out our state and don't skip
//notably, if we're frame-advancing, we should be paused.
if (signal_paused && !signal_continuousFrameAdvancing)
{
//Console.WriteLine($"THE THING: {signal_paused} {signal_continuousFrameAdvancing}");
skipNextFrame = false;
framesSkipped = 0;
framesToSkip = 0;
//keep from burning CPU
@ -63,7 +59,7 @@ namespace BizHawk.Client.EmuHawk
#endif
int skipRate = (forceFrameSkip < 0) ? config.FrameSkip : forceFrameSkip;
int ffSkipRate = (forceFrameSkip < 0) ? 3 : forceFrameSkip;
if (signal_unthrottle) skipRate = 3;
if (lastSkipRate != skipRate)
{
@ -71,48 +67,27 @@ namespace BizHawk.Client.EmuHawk
framesToSkip = 0; // otherwise switches to lower frameskip rates will lag behind
}
if (!skipNextFrame || forceFrameSkip == 0 || (signal_continuousFrameAdvancing && !signal_unthrottle))
//don't ever skip frames when continuous frame advancing. it's meant for precision work.
if (signal_continuousFrameAdvancing && !signal_unthrottle)
{
framesSkipped = 0;
if (signal_continuousFrameAdvancing)
{
//don't ever skip frames when continuous frame advancing. it's meant for precision work.
//but we DO need to throttle
if (config.ClockThrottle)
extraThrottle = true;
}
else
{
if (framesToSkip > 0)
skipNextFrame = true;
}
skipNextFrame = false;
}
else
{
framesToSkip--;
skipNextFrame = framesToSkip > 0;
framesSkipped++;
}
if (signal_unthrottle)
{
if (framesSkipped < ffSkipRate)
{
skipNextFrame = true;
framesToSkip = 1;
}
if (framesToSkip < 1)
framesToSkip += ffSkipRate;
}
else if ((extraThrottle || signal_paused || config.ClockThrottle || signal_overrideSecondaryThrottle) && allowSleep)
if ((signal_paused || config.ClockThrottle || signal_overrideSecondaryThrottle) && allowSleep)
{
SpeedThrottle(sound, signal_paused);
}
if (config.AutoMinimizeSkipping && config.FrameSkip != 0)
if (signal_unthrottle || !config.AutoMinimizeSkipping)
{
if (framesToSkip < 1)
framesToSkip += skipRate;
}
else
{
if (!signal_continuousFrameAdvancing)
{
@ -121,11 +96,8 @@ namespace BizHawk.Client.EmuHawk
framesToSkip += AutoFrameSkip_GetSkipAmount(0, skipRate);
}
}
else
{
if (framesToSkip < 1)
framesToSkip += skipRate;
}
framesToSkip--;
}
private static ulong GetCurTime()