Try a better time slicing algorithm.

We keep a running timer since the last start, or reboot or pause and ensure we track it.

At the same time, a different full speed mode is necessary.
We run for up to 5 ms as long as the disk is spinning and restart all counters.

This will go in some configuration.


Signed-off-by: Andrea Odetti <mariofutire@gmail.com>
This commit is contained in:
Andrea Odetti 2018-02-09 21:15:38 +00:00
parent 30ac85b9c0
commit 9218eb671e
2 changed files with 28 additions and 3 deletions

View file

@ -175,7 +175,15 @@ void QApple::closeEvent(QCloseEvent *)
void QApple::on_timer() void QApple::on_timer()
{ {
const qint64 elapsed = myElapsedTimer.restart(); const qint64 target = myElapsedTimer.elapsed();
const qint64 current = CpuGetEmulationTime_ms() - myCpuTimeReference;
const qint64 elapsed = target - current;
if (elapsed <= 0)
{
return;
}
const qint64 full_speed_ms = 5;
const double fUsecPerSec = 1.e6; const double fUsecPerSec = 1.e6;
const UINT nExecutionPeriodUsec = 1000 * elapsed; const UINT nExecutionPeriodUsec = 1000 * elapsed;
@ -184,6 +192,7 @@ void QApple::on_timer()
const bool bVideoUpdate = false; const bool bVideoUpdate = false;
int count = 0;
do do
{ {
const DWORD uActualCyclesExecuted = CpuExecute(uCyclesToExecute, bVideoUpdate); const DWORD uActualCyclesExecuted = CpuExecute(uCyclesToExecute, bVideoUpdate);
@ -193,8 +202,14 @@ void QApple::on_timer()
g_dwCyclesThisFrame -= dwClksPerFrame; g_dwCyclesThisFrame -= dwClksPerFrame;
myEmulator->updateVideo(); myEmulator->updateVideo();
} }
++count;
}
while (DiskIsSpinning() && (myElapsedTimer.elapsed() < target + full_speed_ms));
if (count > 0)
{
restartTimeCounters();
} }
while (DiskIsSpinning());
} }
void QApple::stopTimer() void QApple::stopTimer()
@ -206,13 +221,19 @@ void QApple::stopTimer()
} }
} }
void QApple::restartTimeCounters()
{
myElapsedTimer.start();
myCpuTimeReference = CpuGetEmulationTime_ms();
}
void QApple::on_actionStart_triggered() void QApple::on_actionStart_triggered()
{ {
// always restart with the same timer gap that was last used // always restart with the same timer gap that was last used
myTimerID = startTimer(myMSGap, Qt::PreciseTimer); myTimerID = startTimer(myMSGap, Qt::PreciseTimer);
myElapsedTimer.start();
actionPause->setEnabled(true); actionPause->setEnabled(true);
actionStart->setEnabled(false); actionStart->setEnabled(false);
restartTimeCounters();
} }
void QApple::on_actionPause_triggered() void QApple::on_actionPause_triggered()
@ -244,6 +265,7 @@ void QApple::on_actionReboot_triggered()
startEmulator(myEmulatorWindow); startEmulator(myEmulatorWindow);
myEmulatorWindow->setWindowTitle(g_pAppTitle); myEmulatorWindow->setWindowTitle(g_pAppTitle);
myEmulator->updateVideo(); myEmulator->updateVideo();
restartTimeCounters();
} }
void QApple::on_actionBenchmark_triggered() void QApple::on_actionBenchmark_triggered()
@ -296,6 +318,7 @@ void QApple::on_actionOptions_triggered()
if (running) if (running)
{ {
// otherwise we would slow down later
actionStart->trigger(); actionStart->trigger();
} }
} }

View file

@ -58,6 +58,7 @@ private slots:
private: private:
void stopTimer(); void stopTimer();
void restartTimeCounters();
int myTimerID; int myTimerID;
Preferences myPreferences; Preferences myPreferences;
@ -66,6 +67,7 @@ private:
QMdiSubWindow * myEmulatorWindow; QMdiSubWindow * myEmulatorWindow;
std::shared_ptr<QGamepad> myGamepad; std::shared_ptr<QGamepad> myGamepad;
Emulator * myEmulator; Emulator * myEmulator;
qint64 myCpuTimeReference;
int myMSGap; int myMSGap;
}; };