Throttle cleanup.
This commit is contained in:
parent
efb46d5fb2
commit
083d9bec0e
|
@ -1370,7 +1370,7 @@ namespace BizHawk.Client.EmuHawk
|
|||
private long _frameAdvanceTimestamp;
|
||||
private long _frameRewindTimestamp;
|
||||
private bool _frameRewindWasPaused;
|
||||
private bool _runloopFrameadvance;
|
||||
private bool _runloopFrameAdvance;
|
||||
private bool _lastFastForwardingOrRewinding;
|
||||
private bool _inResizeLoop;
|
||||
|
||||
|
@ -2684,8 +2684,8 @@ namespace BizHawk.Client.EmuHawk
|
|||
private void StepRunLoop_Throttle()
|
||||
{
|
||||
SyncThrottle();
|
||||
_throttle.signal_frameAdvance = _runloopFrameadvance;
|
||||
_throttle.signal_continuousframeAdvancing = _runloopFrameProgress;
|
||||
_throttle.signal_frameAdvance = _runloopFrameAdvance;
|
||||
_throttle.signal_continuousFrameAdvancing = _runloopFrameProgress;
|
||||
|
||||
_throttle.Step(true, -1);
|
||||
}
|
||||
|
@ -2719,7 +2719,7 @@ namespace BizHawk.Client.EmuHawk
|
|||
private void StepRunLoop_Core(bool force = false)
|
||||
{
|
||||
var runFrame = false;
|
||||
_runloopFrameadvance = false;
|
||||
_runloopFrameAdvance = false;
|
||||
var currentTimestamp = Stopwatch.GetTimestamp();
|
||||
|
||||
double frameAdvanceTimestampDeltaMs = (double)(currentTimestamp - _frameAdvanceTimestamp) / Stopwatch.Frequency * 1000.0;
|
||||
|
@ -2732,7 +2732,7 @@ namespace BizHawk.Client.EmuHawk
|
|||
|
||||
if (Global.ClientControls["Frame Advance"] || PressFrameAdvance || HoldFrameAdvance)
|
||||
{
|
||||
_runloopFrameadvance = true;
|
||||
_runloopFrameAdvance = true;
|
||||
// handle the initial trigger of a frame advance
|
||||
if (_frameAdvanceTimestamp == 0)
|
||||
{
|
||||
|
@ -2827,7 +2827,7 @@ namespace BizHawk.Client.EmuHawk
|
|||
}
|
||||
|
||||
// Mute if using Frame Advance/Frame Progress
|
||||
if (_runloopFrameadvance && Global.Config.MuteFrameAdvance)
|
||||
if (_runloopFrameAdvance && Global.Config.MuteFrameAdvance)
|
||||
{
|
||||
atten = 0;
|
||||
}
|
||||
|
@ -2839,7 +2839,7 @@ namespace BizHawk.Client.EmuHawk
|
|||
bool renderSound = (Global.Config.SoundEnabled && !IsTurboing) || (_currAviWriter?.UsesAudio ?? false);
|
||||
if (!renderSound) atten = 0;
|
||||
|
||||
bool render = !_throttle.skipnextframe || (_currAviWriter?.UsesVideo ?? false);
|
||||
bool render = !_throttle.skipNextFrame || (_currAviWriter?.UsesVideo ?? false);
|
||||
Emulator.FrameAdvance(render, renderSound);
|
||||
|
||||
Global.MovieSession.HandleMovieAfterFrameLoop();
|
||||
|
|
|
@ -11,42 +11,18 @@ namespace BizHawk.Client.EmuHawk
|
|||
{
|
||||
public class Throttle
|
||||
{
|
||||
int lastskiprate;
|
||||
int framestoskip;
|
||||
int framesskipped;
|
||||
public bool skipnextframe;
|
||||
int lastSkipRate;
|
||||
int framesToSkip;
|
||||
int framesSkipped;
|
||||
public bool skipNextFrame;
|
||||
|
||||
//if the emulator is paused then we dont need to behave as if unthrottled
|
||||
public bool signal_paused;
|
||||
public bool signal_frameAdvance;
|
||||
public bool signal_unthrottle;
|
||||
public bool signal_continuousframeAdvancing; //continuousframeAdvancing
|
||||
public bool signal_continuousFrameAdvancing;
|
||||
public bool signal_overrideSecondaryThrottle;
|
||||
|
||||
public int cfg_frameskiprate
|
||||
{
|
||||
get
|
||||
{
|
||||
return Global.Config.FrameSkip;
|
||||
}
|
||||
}
|
||||
|
||||
public bool cfg_frameLimit
|
||||
{
|
||||
get
|
||||
{
|
||||
return Global.Config.ClockThrottle;
|
||||
}
|
||||
}
|
||||
|
||||
public bool cfg_autoframeskipenab
|
||||
{
|
||||
get
|
||||
{
|
||||
return Global.Config.AutoMinimizeSkipping;
|
||||
}
|
||||
}
|
||||
|
||||
public void Step(bool allowSleep, int forceFrameSkip)
|
||||
{
|
||||
//TODO - figure out what allowSleep is supposed to be used for
|
||||
|
@ -56,12 +32,12 @@ namespace BizHawk.Client.EmuHawk
|
|||
|
||||
//if we're paused, none of this should happen. just clean out our state and dont skip
|
||||
//notably, if we're frame-advancing, we should be paused.
|
||||
if (signal_paused && !signal_continuousframeAdvancing)
|
||||
if (signal_paused && !signal_continuousFrameAdvancing)
|
||||
{
|
||||
//Console.WriteLine("THE THING: {0} {1}", signal_paused ,signal_continuousframeAdvancing);
|
||||
skipnextframe = false;
|
||||
framesskipped = 0;
|
||||
framestoskip = 0;
|
||||
//Console.WriteLine("THE THING: {0} {1}", signal_paused ,signal_continuousFrameAdvancing);
|
||||
skipNextFrame = false;
|
||||
framesSkipped = 0;
|
||||
framesToSkip = 0;
|
||||
|
||||
//keep from burning CPU
|
||||
Thread.Sleep(10);
|
||||
|
@ -76,7 +52,7 @@ namespace BizHawk.Client.EmuHawk
|
|||
////continuous run: affected by frameskips and throttles
|
||||
////so continuous and free are the same?
|
||||
|
||||
//bool continuous_run = signal_continuousframeAdvancing;
|
||||
//bool continuous_run = signal_continuousFrameAdvancing;
|
||||
//bool unthrottled_run = signal_unthrottle;
|
||||
//bool free_run = !continuous_run && !unthrottled_run;
|
||||
|
||||
|
@ -87,72 +63,69 @@ namespace BizHawk.Client.EmuHawk
|
|||
// do_skip = true;
|
||||
//else throw new InvalidOperationException();
|
||||
|
||||
int skipRate = (forceFrameSkip < 0) ? cfg_frameskiprate : forceFrameSkip;
|
||||
int skipRate = (forceFrameSkip < 0) ? Global.Config.FrameSkip : forceFrameSkip;
|
||||
int ffSkipRate = (forceFrameSkip < 0) ? 3 : forceFrameSkip;
|
||||
|
||||
if (lastskiprate != skipRate)
|
||||
if (lastSkipRate != skipRate)
|
||||
{
|
||||
lastskiprate = skipRate;
|
||||
framestoskip = 0; // otherwise switches to lower frameskip rates will lag behind
|
||||
lastSkipRate = skipRate;
|
||||
framesToSkip = 0; // otherwise switches to lower frameskip rates will lag behind
|
||||
}
|
||||
|
||||
if (!skipnextframe || forceFrameSkip == 0 || (signal_continuousframeAdvancing && !signal_unthrottle))
|
||||
if (!skipNextFrame || forceFrameSkip == 0 || (signal_continuousFrameAdvancing && !signal_unthrottle))
|
||||
{
|
||||
framesskipped = 0;
|
||||
framesSkipped = 0;
|
||||
|
||||
if (signal_continuousframeAdvancing)
|
||||
if (signal_continuousFrameAdvancing)
|
||||
{
|
||||
//dont ever skip frames when continuous frame advancing. it's meant for precision work.
|
||||
//but we DO need to throttle
|
||||
if(Global.Config.ClockThrottle)
|
||||
if (Global.Config.ClockThrottle)
|
||||
extraThrottle = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (framestoskip > 0)
|
||||
skipnextframe = true;
|
||||
if (framesToSkip > 0)
|
||||
skipNextFrame = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
framestoskip--;
|
||||
framesToSkip--;
|
||||
|
||||
if (framestoskip < 1)
|
||||
skipnextframe = false;
|
||||
else
|
||||
skipnextframe = true;
|
||||
skipNextFrame = framesToSkip > 0;
|
||||
|
||||
framesskipped++;
|
||||
framesSkipped++;
|
||||
}
|
||||
|
||||
if (signal_unthrottle)
|
||||
{
|
||||
if (framesskipped < ffSkipRate)
|
||||
if (framesSkipped < ffSkipRate)
|
||||
{
|
||||
skipnextframe = true;
|
||||
framestoskip = 1;
|
||||
skipNextFrame = true;
|
||||
framesToSkip = 1;
|
||||
}
|
||||
if (framestoskip < 1)
|
||||
framestoskip += ffSkipRate;
|
||||
if (framesToSkip < 1)
|
||||
framesToSkip += ffSkipRate;
|
||||
}
|
||||
else if ((extraThrottle || signal_paused || /*autoframeskipenab && frameskiprate ||*/ cfg_frameLimit || signal_overrideSecondaryThrottle) && allowSleep)
|
||||
else if ((extraThrottle || signal_paused || Global.Config.ClockThrottle || signal_overrideSecondaryThrottle) && allowSleep)
|
||||
{
|
||||
SpeedThrottle(signal_paused);
|
||||
}
|
||||
|
||||
if (cfg_autoframeskipenab && cfg_frameskiprate != 0)
|
||||
if (Global.Config.AutoMinimizeSkipping && Global.Config.FrameSkip != 0)
|
||||
{
|
||||
if (!signal_continuousframeAdvancing)
|
||||
if (!signal_continuousFrameAdvancing)
|
||||
{
|
||||
AutoFrameSkip_NextFrame();
|
||||
if (framestoskip < 1)
|
||||
framestoskip += AutoFrameSkip_GetSkipAmount(0, skipRate);
|
||||
if (framesToSkip < 1)
|
||||
framesToSkip += AutoFrameSkip_GetSkipAmount(0, skipRate);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (framestoskip < 1)
|
||||
framestoskip += skipRate;
|
||||
if (framesToSkip < 1)
|
||||
framesToSkip += skipRate;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -922,7 +922,7 @@ namespace BizHawk.Client.MultiHawk
|
|||
public bool EmulatorPaused = true;
|
||||
private readonly BizHawk.Client.EmuHawk.Throttle _throttle;
|
||||
//private bool _unthrottled; // TODO
|
||||
private bool _runloopFrameadvance;
|
||||
private bool _runloopFrameAdvance;
|
||||
private bool _runloopFrameProgress;
|
||||
private long _frameAdvanceTimestamp;
|
||||
private bool _runloopLastFf;
|
||||
|
@ -966,8 +966,8 @@ namespace BizHawk.Client.MultiHawk
|
|||
private void StepRunLoop_Throttle()
|
||||
{
|
||||
SyncThrottle();
|
||||
_throttle.signal_frameAdvance = _runloopFrameadvance;
|
||||
_throttle.signal_continuousframeAdvancing = _runloopFrameProgress;
|
||||
_throttle.signal_frameAdvance = _runloopFrameAdvance;
|
||||
_throttle.signal_continuousFrameAdvancing = _runloopFrameProgress;
|
||||
|
||||
_throttle.Step(true, -1);
|
||||
}
|
||||
|
@ -987,7 +987,7 @@ namespace BizHawk.Client.MultiHawk
|
|||
private void StepRunLoop_Core()
|
||||
{
|
||||
var runFrame = false;
|
||||
_runloopFrameadvance = false;
|
||||
_runloopFrameAdvance = false;
|
||||
var currentTimestamp = Stopwatch.GetTimestamp();
|
||||
double frameAdvanceTimestampDeltaMs = (double)(currentTimestamp - _frameAdvanceTimestamp) / Stopwatch.Frequency * 1000.0;
|
||||
bool frameProgressTimeElapsed = frameAdvanceTimestampDeltaMs >= Global.Config.FrameProgressDelayMs;
|
||||
|
@ -999,7 +999,7 @@ namespace BizHawk.Client.MultiHawk
|
|||
{
|
||||
PauseEmulator();
|
||||
runFrame = true;
|
||||
_runloopFrameadvance = true;
|
||||
_runloopFrameAdvance = true;
|
||||
_frameAdvanceTimestamp = currentTimestamp;
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Reference in New Issue