diff --git a/Source/Core/Core/CoreTiming.cpp b/Source/Core/Core/CoreTiming.cpp
index 12aff010cb..54a23f629c 100644
--- a/Source/Core/Core/CoreTiming.cpp
+++ b/Source/Core/Core/CoreTiming.cpp
@@ -100,6 +100,10 @@ void CoreTimingManager::Init()
// that slice.
m_is_global_timer_sane = true;
+ // Reset data used by the throttling system
+ m_throttle_last_cycle = 0;
+ m_throttle_deadline = Clock::now();
+
m_event_fifo_id = 0;
m_ev_lost = RegisterEvent("_lost_event", &EmptyTimedCallback);
}
@@ -339,7 +343,8 @@ void CoreTimingManager::Throttle(const s64 target_cycle)
m_throttle_last_cycle = target_cycle;
if (0.0 < speed)
- m_throttle_deadline += std::chrono::duration_cast
((m_throttle_per_clock * cycles) / speed);
+ m_throttle_deadline +=
+ std::chrono::duration_cast(DT_s(cycles) / (speed * m_throttle_clock_per_sec));
// A maximum fallback is used to prevent the system from sleeping for
// too long or going full speed in an attempt to catch up to timings.
@@ -374,8 +379,8 @@ void CoreTimingManager::Throttle(const s64 target_cycle)
TimePoint CoreTimingManager::GetCPUTimePoint(s64 cyclesLate) const
{
- return TimePoint(
- std::chrono::duration_cast(m_throttle_per_clock * (m_globals.global_timer - cyclesLate)));
+ return TimePoint(std::chrono::duration_cast(DT_s(m_globals.global_timer - cyclesLate) /
+ m_throttle_clock_per_sec));
}
void CoreTimingManager::LogPendingEvents() const
@@ -392,7 +397,7 @@ void CoreTimingManager::LogPendingEvents() const
// Should only be called from the CPU thread after the PPC clock has changed
void CoreTimingManager::AdjustEventQueueTimes(u32 new_ppc_clock, u32 old_ppc_clock)
{
- m_throttle_per_clock = DT_s(1.0) / new_ppc_clock;
+ m_throttle_clock_per_sec = new_ppc_clock;
for (Event& ev : m_event_queue)
{
diff --git a/Source/Core/Core/CoreTiming.h b/Source/Core/Core/CoreTiming.h
index a10525cbbb..5918e0f353 100644
--- a/Source/Core/Core/CoreTiming.h
+++ b/Source/Core/Core/CoreTiming.h
@@ -177,7 +177,7 @@ private:
s64 m_throttle_last_cycle = 0;
TimePoint m_throttle_deadline = Clock::now();
- DT_s m_throttle_per_clock = DT_s();
+ s64 m_throttle_clock_per_sec;
void Throttle(const s64 target_cycle);