From 3ff4ec275ae931dfc946cdb09825efa7b9e60d18 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 16 Dec 2015 00:10:47 +0100 Subject: [PATCH] Throttler: Rename "framelimiter" to "emulation speed". We don't throttle by frames, we throttle by coretiming speed. So looking up VI for calculating the speed was just very wrong. The new ini option is a float, 1.0f for fullspeed. In the GUI, percentual values are used. --- Source/Core/AudioCommon/Mixer.cpp | 7 ++--- Source/Core/Core/BootManager.cpp | 17 ++++++----- Source/Core/Core/ConfigManager.cpp | 4 +-- Source/Core/Core/ConfigManager.h | 3 +- Source/Core/Core/Core.cpp | 20 ++++++------- Source/Core/Core/Core.h | 4 +-- Source/Core/Core/HW/SystemTimers.cpp | 24 +++++++-------- Source/Core/Core/HotkeyManager.cpp | 4 +-- Source/Core/Core/HotkeyManager.h | 4 +-- .../DolphinWX/Config/GeneralConfigPane.cpp | 30 ++++++++++--------- .../Core/DolphinWX/Config/GeneralConfigPane.h | 6 ++-- Source/Core/DolphinWX/Frame.cpp | 28 ++++++++++++----- Source/Core/VideoCommon/RenderBase.cpp | 2 ++ Source/Core/VideoCommon/VideoConfig.cpp | 2 +- 14 files changed, 86 insertions(+), 69 deletions(-) diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp index 8d2380b4cf..5d1207bbe3 100644 --- a/Source/Core/AudioCommon/Mixer.cpp +++ b/Source/Core/AudioCommon/Mixer.cpp @@ -11,7 +11,6 @@ #include "Core/ConfigManager.h" #include "Core/Core.h" #include "Core/HW/AudioInterface.h" -#include "Core/HW/VideoInterface.h" // UGLINESS #include "Core/PowerPC/PowerPC.h" @@ -60,11 +59,11 @@ unsigned int CMixer::MixerFifo::Mix(short* samples, unsigned int numSamples, boo //advance indexR with sample position //remember fractional offset - u32 framelimit = SConfig::GetInstance().m_Framelimit; + float emulationspeed = SConfig::GetInstance().m_EmulationSpeed; float aid_sample_rate = m_input_sample_rate + offset; - if (consider_framelimit && framelimit > 1) + if (consider_framelimit && emulationspeed > 0.0f) { - aid_sample_rate = aid_sample_rate * (framelimit - 1) * 5 / VideoInterface::TargetRefreshRate; + aid_sample_rate = aid_sample_rate * emulationspeed; } const u32 ratio = (u32)(65536.0f * aid_sample_rate / (float)m_mixer->m_sampleRate); diff --git a/Source/Core/Core/BootManager.cpp b/Source/Core/Core/BootManager.cpp index 0923a3c6c4..ec056558bf 100644 --- a/Source/Core/Core/BootManager.cpp +++ b/Source/Core/Core/BootManager.cpp @@ -55,7 +55,7 @@ public: void RestoreConfig(SConfig* config); // these store if the relevant setting should be reset back later (true) or if it should be left alone on restore (false) - bool bSetFramelimit, bSetEXIDevice[MAX_EXI_CHANNELS], bSetVolume, bSetPads[MAX_SI_CHANNELS], bSetWiimoteSource[MAX_BBMOTES], bSetFrameSkip; + bool bSetEmulationSpeed, bSetEXIDevice[MAX_EXI_CHANNELS], bSetVolume, bSetPads[MAX_SI_CHANNELS], bSetWiimoteSource[MAX_BBMOTES], bSetFrameSkip; private: bool valid, bCPUThread, bSkipIdle, bSyncGPUOnSkipIdleHack, bFPRF, bAccurateNaNs, bMMU, bDCBZOFF, m_EnableJIT, @@ -64,7 +64,8 @@ private: int iCPUCore, Volume; int iWiimoteSource[MAX_BBMOTES]; SIDevices Pads[MAX_SI_CHANNELS]; - unsigned int framelimit, frameSkip; + unsigned int frameSkip; + float m_EmulationSpeed; TEXIDevices m_EXIDevice[MAX_EXI_CHANNELS]; std::string strBackend, sBackend; std::string m_strGPUDeterminismMode; @@ -102,7 +103,7 @@ void ConfigCache::SaveConfig(const SConfig& config) Pads[i] = config.m_SIDevice[i]; } - framelimit = config.m_Framelimit; + m_EmulationSpeed = config.m_EmulationSpeed; frameSkip = config.m_FrameSkip; for (unsigned int i = 0; i < MAX_EXI_CHANNELS; ++i) @@ -114,7 +115,7 @@ void ConfigCache::SaveConfig(const SConfig& config) sBackend = config.sBackend; m_strGPUDeterminismMode = config.m_strGPUDeterminismMode; - bSetFramelimit = false; + bSetEmulationSpeed = false; std::fill_n(bSetEXIDevice, (int)MAX_EXI_CHANNELS, false); bSetVolume = false; std::fill_n(bSetPads, (int)MAX_SI_CHANNELS, false); @@ -170,8 +171,8 @@ void ConfigCache::RestoreConfig(SConfig* config) config->m_SIDevice[i] = Pads[i]; } - if (bSetFramelimit) - config->m_Framelimit = framelimit; + if (bSetEmulationSpeed) + config->m_EmulationSpeed = m_EmulationSpeed; if (bSetFrameSkip) { @@ -251,8 +252,8 @@ bool BootCore(const std::string& _rFilename) core_section->Get("HLE_BS2", &StartUp.bHLE_BS2, StartUp.bHLE_BS2); core_section->Get("ProgressiveScan", &StartUp.bProgressive, StartUp.bProgressive); core_section->Get("PAL60", &StartUp.bPAL60, StartUp.bPAL60); - if (core_section->Get("FrameLimit", &SConfig::GetInstance().m_Framelimit, SConfig::GetInstance().m_Framelimit)) - config_cache.bSetFramelimit = true; + if (core_section->Get("EmulationSpeed", &SConfig::GetInstance().m_EmulationSpeed, SConfig::GetInstance().m_EmulationSpeed)) + config_cache.bSetEmulationSpeed = true; if (core_section->Get("FrameSkip", &SConfig::GetInstance().m_FrameSkip)) { config_cache.bSetFrameSkip = true; diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp index db933bceaf..c4a857b82d 100644 --- a/Source/Core/Core/ConfigManager.cpp +++ b/Source/Core/Core/ConfigManager.cpp @@ -261,7 +261,7 @@ void SConfig::SaveCoreSettings(IniFile& ini) core->Set("WiimoteEnableSpeaker", m_WiimoteEnableSpeaker); core->Set("RunCompareServer", bRunCompareServer); core->Set("RunCompareClient", bRunCompareClient); - core->Set("FrameLimit", m_Framelimit); + core->Set("EmulationSpeed", m_EmulationSpeed); core->Set("FrameSkip", m_FrameSkip); core->Set("Overclock", m_OCFactor); core->Set("OverclockEnable", m_OCEnable); @@ -526,7 +526,7 @@ void SConfig::LoadCoreSettings(IniFile& ini) core->Get("DCBZ", &bDCBZOFF, false); core->Get("FPRF", &bFPRF, false); core->Get("AccurateNaNs", &bAccurateNaNs, false); - core->Get("FrameLimit", &m_Framelimit, 1); // auto frame limit by default + core->Get("EmulationSpeed", &m_EmulationSpeed, 1.0f); core->Get("Overclock", &m_OCFactor, 1.0f); core->Get("OverclockEnable", &m_OCEnable, false); core->Get("FrameSkip", &m_FrameSkip, 0); diff --git a/Source/Core/Core/ConfigManager.h b/Source/Core/Core/ConfigManager.h index de2be855e8..973f49939a 100644 --- a/Source/Core/Core/ConfigManager.h +++ b/Source/Core/Core/ConfigManager.h @@ -196,8 +196,7 @@ struct SConfig : NonCopyable // interface language int m_InterfaceLanguage; - // framelimit choose - unsigned int m_Framelimit; + float m_EmulationSpeed; bool m_OCEnable; float m_OCFactor; // other interface settings diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index c49d89c847..b6669b57d2 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -110,7 +110,7 @@ static StoppedCallbackFunc s_on_stopped_callback = nullptr; static std::thread s_cpu_thread; static bool s_request_refresh_info = false; static int s_pause_and_lock_depth = 0; -static bool s_is_framelimiter_temp_disabled = false; +static bool s_is_throttler_temp_disabled = false; #ifdef USE_MEMORYWATCHER static std::unique_ptr s_memory_watcher; @@ -127,14 +127,14 @@ static void InitIsCPUKey() } #endif -bool GetIsFramelimiterTempDisabled() +bool GetIsThrottlerTempDisabled() { - return s_is_framelimiter_temp_disabled; + return s_is_throttler_temp_disabled; } -void SetIsFramelimiterTempDisabled(bool disable) +void SetIsThrottlerTempDisabled(bool disable) { - s_is_framelimiter_temp_disabled = disable; + s_is_throttler_temp_disabled = disable; } std::string GetStateFileName() { return s_state_filename; } @@ -746,7 +746,7 @@ bool PauseAndLock(bool doLock, bool unpauseOnUnlock) return wasUnpaused; } -// Apply Frame Limit and Display FPS info +// Display FPS info // This should only be called from VI void VideoThrottle() { @@ -767,12 +767,12 @@ void VideoThrottle() // Executed from GPU thread // reports if a frame should be skipped or not -// depending on the framelimit set +// depending on the emulation speed set bool ShouldSkipFrame(int skipped) { - const u32 TargetFPS = (SConfig::GetInstance().m_Framelimit > 1) - ? (SConfig::GetInstance().m_Framelimit - 1) * 5 - : VideoInterface::TargetRefreshRate; + u32 TargetFPS = VideoInterface::TargetRefreshRate; + if (SConfig::GetInstance().m_EmulationSpeed > 0.0f) + TargetFPS = u32(TargetFPS * SConfig::GetInstance().m_EmulationSpeed); const u32 frames = s_drawn_frame.load(); const bool fps_slow = !(s_timer.GetTimeDifference() < (frames + skipped) * 1000 / TargetFPS); diff --git a/Source/Core/Core/Core.h b/Source/Core/Core/Core.h index 8389f9e308..e9f179579d 100644 --- a/Source/Core/Core/Core.h +++ b/Source/Core/Core/Core.h @@ -24,8 +24,8 @@ extern bool g_aspect_wide; extern bool g_want_determinism; -bool GetIsFramelimiterTempDisabled(); -void SetIsFramelimiterTempDisabled(bool disable); +bool GetIsThrottlerTempDisabled(); +void SetIsThrottlerTempDisabled(bool disable); void Callback_VideoCopiedToXFB(bool video_update); diff --git a/Source/Core/Core/HW/SystemTimers.cpp b/Source/Core/Core/HW/SystemTimers.cpp index 9ef8e45d31..e95d207863 100644 --- a/Source/Core/Core/HW/SystemTimers.cpp +++ b/Source/Core/Core/HW/SystemTimers.cpp @@ -195,21 +195,21 @@ static void ThrottleCallback(u64 last_time, int cyclesLate) int diff = (u32)last_time - time; const SConfig& config = SConfig::GetInstance(); - bool frame_limiter = config.m_Framelimit && !Core::GetIsFramelimiterTempDisabled(); + bool frame_limiter = config.m_EmulationSpeed > 0.0f && !Core::GetIsThrottlerTempDisabled(); u32 next_event = GetTicksPerSecond()/1000; - if (config.m_Framelimit > 1) + if (frame_limiter) { - next_event = next_event * (config.m_Framelimit - 1) * 5 / VideoInterface::TargetRefreshRate; + if (config.m_EmulationSpeed != 1.0f) + next_event = u32(next_event * config.m_EmulationSpeed); + const int max_fallback = config.iTimingVariance; + if (abs(diff) > max_fallback) + { + DEBUG_LOG(COMMON, "system too %s, %d ms skipped", diff<0 ? "slow" : "fast", abs(diff) - max_fallback); + last_time = time - max_fallback; + } + else if (diff > 0) + Common::SleepCurrentThread(diff); } - - const int max_fallback = config.iTimingVariance; - if (frame_limiter && abs(diff) > max_fallback) - { - DEBUG_LOG(COMMON, "system too %s, %d ms skipped", diff<0 ? "slow" : "fast", abs(diff) - max_fallback); - last_time = time - max_fallback; - } - else if (frame_limiter && diff > 0) - Common::SleepCurrentThread(diff); CoreTiming::ScheduleEvent(next_event - cyclesLate, et_Throttle, last_time + 1); } diff --git a/Source/Core/Core/HotkeyManager.cpp b/Source/Core/Core/HotkeyManager.cpp index 8fd54029c5..b838a45fea 100644 --- a/Source/Core/Core/HotkeyManager.cpp +++ b/Source/Core/Core/HotkeyManager.cpp @@ -51,8 +51,8 @@ const std::string hotkey_labels[] = _trans("Toggle EFB Copies"), _trans("Toggle Fog"), _trans("Toggle Frame limit"), - _trans("Decrease Frame limit"), - _trans("Increase Frame limit"), + _trans("Decrease Emulation Speed"), + _trans("Increase Emulation Speed"), _trans("Freelook Decrease Speed"), _trans("Freelook Increase Speed"), diff --git a/Source/Core/Core/HotkeyManager.h b/Source/Core/Core/HotkeyManager.h index d1049c22c5..cb41840457 100644 --- a/Source/Core/Core/HotkeyManager.h +++ b/Source/Core/Core/HotkeyManager.h @@ -50,8 +50,8 @@ enum Hotkey HK_TOGGLE_FOG, HK_TOGGLE_THROTTLE, - HK_DECREASE_FRAME_LIMIT, - HK_INCREASE_FRAME_LIMIT, + HK_DECREASE_EMULATION_SPEED, + HK_INCREASE_EMULATION_SPEED, HK_FREELOOK_DECREASE_SPEED, HK_FREELOOK_INCREASE_SPEED, diff --git a/Source/Core/DolphinWX/Config/GeneralConfigPane.cpp b/Source/Core/DolphinWX/Config/GeneralConfigPane.cpp index 38485ed79e..0477419fc9 100644 --- a/Source/Core/DolphinWX/Config/GeneralConfigPane.cpp +++ b/Source/Core/DolphinWX/Config/GeneralConfigPane.cpp @@ -39,10 +39,9 @@ GeneralConfigPane::GeneralConfigPane(wxWindow* parent, wxWindowID id) void GeneralConfigPane::InitializeGUI() { - m_frame_limit_array_string.Add(_("Off")); - m_frame_limit_array_string.Add(_("Auto")); - for (int i = 5; i <= 120; i += 5) // from 5 to 120 - m_frame_limit_array_string.Add(wxString::Format("%i", i)); + m_throttler_array_string.Add(_("Unlimited")); + for (int i = 10; i <= 200; i += 10) // from 10% to 200% + m_throttler_array_string.Add(wxString::Format("%i%%", i)); for (const CPUCore& cpu_core : cpu_cores) m_cpu_engine_array_string.Add(cpu_core.name); @@ -51,31 +50,31 @@ void GeneralConfigPane::InitializeGUI() m_idle_skip_checkbox = new wxCheckBox(this, wxID_ANY, _("Enable Idle Skipping (speedup)")); m_cheats_checkbox = new wxCheckBox(this, wxID_ANY, _("Enable Cheats")); m_force_ntscj_checkbox = new wxCheckBox(this, wxID_ANY, _("Force Console as NTSC-J")); - m_frame_limit_choice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_frame_limit_array_string); + m_throttler_choice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_throttler_array_string); m_cpu_engine_radiobox = new wxRadioBox(this, wxID_ANY, _("CPU Emulator Engine"), wxDefaultPosition, wxDefaultSize, m_cpu_engine_array_string, 0, wxRA_SPECIFY_ROWS); m_dual_core_checkbox->SetToolTip(_("Splits the CPU and GPU threads so they can be run on separate cores.\nProvides major speed improvements on most modern PCs, but can cause occasional crashes/glitches.")); m_idle_skip_checkbox->SetToolTip(_("Attempt to detect and skip wait-loops.\nIf unsure, leave this checked.")); m_cheats_checkbox->SetToolTip(_("Enables the use of Action Replay and Gecko cheats.")); m_force_ntscj_checkbox->SetToolTip(_("Forces NTSC-J mode for using the Japanese ROM font.\nIf left unchecked, Dolphin defaults to NTSC-U and automatically enables this setting when playing Japanese games.")); - m_frame_limit_choice->SetToolTip(_("Limits the game speed to the specified number of frames per second (full speed is 60 for NTSC and 50 for PAL).")); + m_throttler_choice->SetToolTip(_("Limits the emulation speed to the specified percentage.\nNote that raising or lowering the emulation speed will also raise or lower the audio pitch to prevent audio from stuttering.")); m_dual_core_checkbox->Bind(wxEVT_CHECKBOX, &GeneralConfigPane::OnDualCoreCheckBoxChanged, this); m_idle_skip_checkbox->Bind(wxEVT_CHECKBOX, &GeneralConfigPane::OnIdleSkipCheckBoxChanged, this); m_cheats_checkbox->Bind(wxEVT_CHECKBOX, &GeneralConfigPane::OnCheatCheckBoxChanged, this); m_force_ntscj_checkbox->Bind(wxEVT_CHECKBOX, &GeneralConfigPane::OnForceNTSCJCheckBoxChanged, this); - m_frame_limit_choice->Bind(wxEVT_CHOICE, &GeneralConfigPane::OnFrameLimitChoiceChanged, this); + m_throttler_choice->Bind(wxEVT_CHOICE, &GeneralConfigPane::OnThrottlerChoiceChanged, this); m_cpu_engine_radiobox->Bind(wxEVT_RADIOBOX, &GeneralConfigPane::OnCPUEngineRadioBoxChanged, this); - wxBoxSizer* const frame_limit_sizer = new wxBoxSizer(wxHORIZONTAL); - frame_limit_sizer->Add(new wxStaticText(this, wxID_ANY, _("Framelimit:")), 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5); - frame_limit_sizer->Add(m_frame_limit_choice, 0, wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND, 5); + wxBoxSizer* const throttler_sizer = new wxBoxSizer(wxHORIZONTAL); + throttler_sizer->Add(new wxStaticText(this, wxID_ANY, _("Speed Limit:")), 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5); + throttler_sizer->Add(m_throttler_choice, 0, wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND, 5); wxStaticBoxSizer* const basic_settings_sizer = new wxStaticBoxSizer(wxVERTICAL, this, _("Basic Settings")); basic_settings_sizer->Add(m_dual_core_checkbox, 0, wxALL, 5); basic_settings_sizer->Add(m_idle_skip_checkbox, 0, wxALL, 5); basic_settings_sizer->Add(m_cheats_checkbox, 0, wxALL, 5); - basic_settings_sizer->Add(frame_limit_sizer); + basic_settings_sizer->Add(throttler_sizer); wxStaticBoxSizer* const advanced_settings_sizer = new wxStaticBoxSizer(wxVERTICAL, this, _("Advanced Settings")); advanced_settings_sizer->Add(m_cpu_engine_radiobox, 0, wxALL, 5); @@ -96,7 +95,9 @@ void GeneralConfigPane::LoadGUIValues() m_idle_skip_checkbox->SetValue(startup_params.bSkipIdle); m_cheats_checkbox->SetValue(startup_params.bEnableCheats); m_force_ntscj_checkbox->SetValue(startup_params.bForceNTSCJ); - m_frame_limit_choice->SetSelection(SConfig::GetInstance().m_Framelimit); + u32 selection = std::lround(startup_params.m_EmulationSpeed * 10.0f); + if (selection < m_throttler_array_string.size()) + m_throttler_choice->SetSelection(selection); for (size_t i = 0; i < cpu_cores.size(); ++i) { @@ -140,9 +141,10 @@ void GeneralConfigPane::OnForceNTSCJCheckBoxChanged(wxCommandEvent& event) SConfig::GetInstance().bForceNTSCJ = m_force_ntscj_checkbox->IsChecked(); } -void GeneralConfigPane::OnFrameLimitChoiceChanged(wxCommandEvent& event) +void GeneralConfigPane::OnThrottlerChoiceChanged(wxCommandEvent& event) { - SConfig::GetInstance().m_Framelimit = m_frame_limit_choice->GetSelection(); + if (m_throttler_choice->GetSelection() != wxNOT_FOUND) + SConfig::GetInstance().m_EmulationSpeed = m_throttler_choice->GetSelection() * 0.1f; } void GeneralConfigPane::OnCPUEngineRadioBoxChanged(wxCommandEvent& event) diff --git a/Source/Core/DolphinWX/Config/GeneralConfigPane.h b/Source/Core/DolphinWX/Config/GeneralConfigPane.h index f431246582..d4394bed87 100644 --- a/Source/Core/DolphinWX/Config/GeneralConfigPane.h +++ b/Source/Core/DolphinWX/Config/GeneralConfigPane.h @@ -32,10 +32,10 @@ private: void OnIdleSkipCheckBoxChanged(wxCommandEvent&); void OnCheatCheckBoxChanged(wxCommandEvent&); void OnForceNTSCJCheckBoxChanged(wxCommandEvent&); - void OnFrameLimitChoiceChanged(wxCommandEvent&); + void OnThrottlerChoiceChanged(wxCommandEvent&); void OnCPUEngineRadioBoxChanged(wxCommandEvent&); - wxArrayString m_frame_limit_array_string; + wxArrayString m_throttler_array_string; wxArrayString m_cpu_engine_array_string; wxCheckBox* m_dual_core_checkbox; @@ -43,7 +43,7 @@ private: wxCheckBox* m_cheats_checkbox; wxCheckBox* m_force_ntscj_checkbox; - wxChoice* m_frame_limit_choice; + wxChoice* m_throttler_choice; wxRadioBox* m_cpu_engine_radiobox; }; diff --git a/Source/Core/DolphinWX/Frame.cpp b/Source/Core/DolphinWX/Frame.cpp index 4972bb6b4e..88e3128a78 100644 --- a/Source/Core/DolphinWX/Frame.cpp +++ b/Source/Core/DolphinWX/Frame.cpp @@ -1404,16 +1404,30 @@ void CFrame::ParseHotkeys() OSDChoice = 4; g_Config.bDisableFog = !g_Config.bDisableFog; } - Core::SetIsFramelimiterTempDisabled(IsHotkey(HK_TOGGLE_THROTTLE, true)); - if (IsHotkey(HK_DECREASE_FRAME_LIMIT)) + Core::SetIsThrottlerTempDisabled(IsHotkey(HK_TOGGLE_THROTTLE, true)); + if (IsHotkey(HK_DECREASE_EMULATION_SPEED)) { - if (--SConfig::GetInstance().m_Framelimit > 0x19) - SConfig::GetInstance().m_Framelimit = 0x19; + OSDChoice = 5; + + if (SConfig::GetInstance().m_EmulationSpeed <= 0.0f) + SConfig::GetInstance().m_EmulationSpeed = 1.0f; + else if (SConfig::GetInstance().m_EmulationSpeed >= 0.2f) + SConfig::GetInstance().m_EmulationSpeed -= 0.1f; + else + SConfig::GetInstance().m_EmulationSpeed = 0.1f; + + if (SConfig::GetInstance().m_EmulationSpeed >= 0.95f && SConfig::GetInstance().m_EmulationSpeed <= 1.05f) + SConfig::GetInstance().m_EmulationSpeed = 1.0f; } - if (IsHotkey(HK_INCREASE_FRAME_LIMIT)) + if (IsHotkey(HK_INCREASE_EMULATION_SPEED)) { - if (++SConfig::GetInstance().m_Framelimit > 0x19) - SConfig::GetInstance().m_Framelimit = 0; + OSDChoice = 5; + + if (SConfig::GetInstance().m_EmulationSpeed > 0.0f) + SConfig::GetInstance().m_EmulationSpeed += 0.1f; + + if (SConfig::GetInstance().m_EmulationSpeed >= 0.95f && SConfig::GetInstance().m_EmulationSpeed <= 1.05f) + SConfig::GetInstance().m_EmulationSpeed = 1.0f; } if (IsHotkey(HK_SAVE_STATE_SLOT_SELECTED)) { diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index 8b8d0aa8f7..c52263843f 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -379,6 +379,8 @@ void Renderer::DrawDebugText() std::string("Aspect Ratio: ") + ar_text + (g_ActiveConfig.bCrop ? " (crop)" : ""), std::string("Copy EFB: ") + efbcopy_text, std::string("Fog: ") + (g_ActiveConfig.bDisableFog ? "Disabled" : "Enabled"), + SConfig::GetInstance().m_EmulationSpeed <= 0 ? "Speed Limit: Unlimited" : + StringFromFormat("Speed Limit: %li%%", std::lround(SConfig::GetInstance().m_EmulationSpeed * 100.f)), }; enum { lines_count = sizeof(lines) / sizeof(*lines) }; diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp index 5e3c468d21..626e1f0bd0 100644 --- a/Source/Core/VideoCommon/VideoConfig.cpp +++ b/Source/Core/VideoCommon/VideoConfig.cpp @@ -311,5 +311,5 @@ void VideoConfig::Save(const std::string& ini_file) bool VideoConfig::IsVSync() { - return bVSync && !Core::GetIsFramelimiterTempDisabled(); + return bVSync && !Core::GetIsThrottlerTempDisabled(); }