mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	citra-qt: Add customizable speed limit target (#3353)
citra-qt: Add customizable speed limit target * Update SDL config for the new frame_limit option * Made max lag time a function of target speed percent. * Added a checkbox to enable/disable frame limiter * UI: Prevent frame_limit from under/overflowing * UI: Hide target speed percent when frame limiter is off * Disable frame limit spin box when framelimit isn't enabled
This commit is contained in:
		
							parent
							
								
									33b0b5163f
								
							
						
					
					
						commit
						b002511df0
					
				
					 12 changed files with 155 additions and 96 deletions
				
			
		|  | @ -75,24 +75,27 @@ double PerfStats::GetLastFrameTimeScale() { | |||
| } | ||||
| 
 | ||||
| void FrameLimiter::DoFrameLimiting(u64 current_system_time_us) { | ||||
|     // Max lag caused by slow frames. Can be adjusted to compensate for too many slow frames. Higher
 | ||||
|     // values increase the time needed to recover and limit framerate again after spikes.
 | ||||
|     constexpr microseconds MAX_LAG_TIME_US = 25ms; | ||||
| 
 | ||||
|     if (!Settings::values.toggle_framelimit) { | ||||
|     if (!Settings::values.use_frame_limit) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     auto now = Clock::now(); | ||||
|     double sleep_scale = Settings::values.frame_limit / 100.0; | ||||
| 
 | ||||
|     frame_limiting_delta_err += microseconds(current_system_time_us - previous_system_time_us); | ||||
|     // Max lag caused by slow frames. Shouldn't be more than the length of a frame at the current
 | ||||
|     // speed percent or it will clamp too much and prevent this from properly limiting to that
 | ||||
|     // percent. High values means it'll take longer after a slow frame to recover and start limiting
 | ||||
|     const microseconds max_lag_time_us = duration_cast<microseconds>( | ||||
|         std::chrono::duration<double, std::chrono::microseconds::period>(25ms / sleep_scale)); | ||||
|     frame_limiting_delta_err += duration_cast<microseconds>( | ||||
|         std::chrono::duration<double, std::chrono::microseconds::period>( | ||||
|             (current_system_time_us - previous_system_time_us) / sleep_scale)); | ||||
|     frame_limiting_delta_err -= duration_cast<microseconds>(now - previous_walltime); | ||||
|     frame_limiting_delta_err = | ||||
|         MathUtil::Clamp(frame_limiting_delta_err, -MAX_LAG_TIME_US, MAX_LAG_TIME_US); | ||||
|         MathUtil::Clamp(frame_limiting_delta_err, -max_lag_time_us, max_lag_time_us); | ||||
| 
 | ||||
|     if (frame_limiting_delta_err > microseconds::zero()) { | ||||
|         std::this_thread::sleep_for(frame_limiting_delta_err); | ||||
| 
 | ||||
|         auto now_after_sleep = Clock::now(); | ||||
|         frame_limiting_delta_err -= duration_cast<microseconds>(now_after_sleep - now); | ||||
|         now = now_after_sleep; | ||||
|  |  | |||
|  | @ -22,7 +22,6 @@ void Apply() { | |||
| 
 | ||||
|     VideoCore::g_hw_renderer_enabled = values.use_hw_renderer; | ||||
|     VideoCore::g_shader_jit_enabled = values.use_shader_jit; | ||||
|     VideoCore::g_toggle_framelimit_enabled = values.toggle_framelimit; | ||||
| 
 | ||||
|     if (VideoCore::g_emu_window) { | ||||
|         auto layout = VideoCore::g_emu_window->GetFramebufferLayout(); | ||||
|  |  | |||
|  | @ -97,7 +97,8 @@ struct Values { | |||
|     bool use_shader_jit; | ||||
|     float resolution_factor; | ||||
|     bool use_vsync; | ||||
|     bool toggle_framelimit; | ||||
|     bool use_frame_limit; | ||||
|     u16 frame_limit; | ||||
| 
 | ||||
|     LayoutOption layout_option; | ||||
|     bool swap_screen; | ||||
|  |  | |||
|  | @ -167,8 +167,9 @@ TelemetrySession::TelemetrySession() { | |||
|     AddField(Telemetry::FieldType::UserConfig, "Core_UseCpuJit", Settings::values.use_cpu_jit); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_ResolutionFactor", | ||||
|              Settings::values.resolution_factor); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_ToggleFramelimit", | ||||
|              Settings::values.toggle_framelimit); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_UseFrameLimit", | ||||
|              Settings::values.use_frame_limit); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_FrameLimit", Settings::values.frame_limit); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_UseHwRenderer", | ||||
|              Settings::values.use_hw_renderer); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_UseShaderJit", | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue