diff options
| author | Admiral H. Curtiss <pikachu025@gmail.com> | 2021-12-25 22:14:53 +0100 |
|---|---|---|
| committer | Admiral H. Curtiss <pikachu025@gmail.com> | 2021-12-25 23:40:26 +0100 |
| commit | 7625cb7aca314b36008a4eb11b23151ccb93f2c1 (patch) | |
| tree | 258cd5161280a84df77c459499694a509507ef45 /Source/Core | |
| parent | 319b00f1fd6cc0385ffc4ac9d48411ed3fd1f42b (diff) | |
CoreTiming: Cache the overclock factor instead of re-querying it every Advance().
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/CoreTiming.cpp | 26 | ||||
| -rw-r--r-- | Source/Core/Core/CoreTiming.h | 2 |
2 files changed, 22 insertions, 6 deletions
diff --git a/Source/Core/Core/CoreTiming.cpp b/Source/Core/Core/CoreTiming.cpp index 6a978a3c0f..f850c726d6 100644 --- a/Source/Core/Core/CoreTiming.cpp +++ b/Source/Core/Core/CoreTiming.cpp @@ -78,6 +78,10 @@ Globals g; static EventType* s_ev_lost = nullptr; +static size_t s_registered_config_callback_id; +static float s_config_OC_factor; +static float s_config_OC_inv_factor; + static void EmptyTimedCallback(u64 userdata, s64 cyclesLate) { } @@ -122,9 +126,12 @@ void UnregisterAllEvents() void Init() { - s_last_OC_factor = - Config::Get(Config::MAIN_OVERCLOCK_ENABLE) ? Config::Get(Config::MAIN_OVERCLOCK) : 1.0f; - g.last_OC_factor_inverted = 1.0f / s_last_OC_factor; + s_registered_config_callback_id = + Config::AddConfigChangedCallback([]() { Core::RunAsCPUThread([]() { RefreshConfig(); }); }); + RefreshConfig(); + + s_last_OC_factor = s_config_OC_factor; + g.last_OC_factor_inverted = s_config_OC_inv_factor; PowerPC::ppcState.downcount = CyclesToDowncount(MAX_SLICE_LENGTH); g.slice_length = MAX_SLICE_LENGTH; g.global_timer = 0; @@ -146,6 +153,14 @@ void Shutdown() MoveEvents(); ClearPendingEvents(); UnregisterAllEvents(); + Config::RemoveConfigChangedCallback(s_registered_config_callback_id); +} + +void RefreshConfig() +{ + s_config_OC_factor = + Config::Get(Config::MAIN_OVERCLOCK_ENABLE) ? Config::Get(Config::MAIN_OVERCLOCK) : 1.0f; + s_config_OC_inv_factor = 1.0f / s_config_OC_factor; } void DoState(PointerWrap& p) @@ -318,9 +333,8 @@ void Advance() int cyclesExecuted = g.slice_length - DowncountToCycles(PowerPC::ppcState.downcount); g.global_timer += cyclesExecuted; - s_last_OC_factor = - Config::Get(Config::MAIN_OVERCLOCK_ENABLE) ? Config::Get(Config::MAIN_OVERCLOCK) : 1.0f; - g.last_OC_factor_inverted = 1.0f / s_last_OC_factor; + s_last_OC_factor = s_config_OC_factor; + g.last_OC_factor_inverted = s_config_OC_inv_factor; g.slice_length = MAX_SLICE_LENGTH; s_is_global_timer_sane = true; diff --git a/Source/Core/Core/CoreTiming.h b/Source/Core/Core/CoreTiming.h index f66fba5614..255aa612ca 100644 --- a/Source/Core/Core/CoreTiming.h +++ b/Source/Core/Core/CoreTiming.h @@ -46,6 +46,8 @@ typedef void (*TimedCallback)(u64 userdata, s64 cyclesLate); u64 GetTicks(); u64 GetIdleTicks(); +void RefreshConfig(); + void DoState(PointerWrap& p); struct EventType; |
