diff --git a/assets/voxygen/i18n/en/hud/settings.ron b/assets/voxygen/i18n/en/hud/settings.ron index c605d1093b..7f8f21ee63 100644 --- a/assets/voxygen/i18n/en/hud/settings.ron +++ b/assets/voxygen/i18n/en/hud/settings.ron @@ -61,6 +61,7 @@ "hud.settings.sprites_view_distance": "Sprites View Distance", "hud.settings.figures_view_distance": "Entities View Distance", "hud.settings.maximum_fps": "Maximum FPS", + "hud.settings.background_fps": "Background FPS", "hud.settings.present_mode": "Present Mode", "hud.settings.present_mode.fifo": "Fifo", "hud.settings.present_mode.mailbox": "Mailbox", diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index 3f720e327b..47df156335 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -51,6 +51,9 @@ widget_ids! { max_fps_slider, max_fps_text, max_fps_value, + max_background_fps_slider, + max_background_fps_text, + max_background_fps_value, present_mode_text, present_mode_list, fov_slider, @@ -144,17 +147,44 @@ pub struct State { // Resolution, Bit Depth and Refresh Rate video_modes: Vec, } -const FPS_CHOICES: [Fps; 12] = [ +const FPS_CHOICES: [Fps; 17] = [ Fps::Max(15), Fps::Max(30), Fps::Max(40), Fps::Max(50), Fps::Max(60), + Fps::Max(75), Fps::Max(90), + Fps::Max(100), Fps::Max(120), Fps::Max(144), + Fps::Max(165), + Fps::Max(200), Fps::Max(240), - Fps::Max(300), + Fps::Max(280), + Fps::Max(360), + Fps::Max(500), + Fps::Unlimited, +]; +const BG_FPS_CHOICES: [Fps; 20] = [ + Fps::Max(5), + Fps::Max(10), + Fps::Max(15), + Fps::Max(20), + Fps::Max(30), + Fps::Max(40), + Fps::Max(50), + Fps::Max(60), + Fps::Max(75), + Fps::Max(90), + Fps::Max(100), + Fps::Max(120), + Fps::Max(144), + Fps::Max(165), + Fps::Max(200), + Fps::Max(240), + Fps::Max(280), + Fps::Max(360), Fps::Max(500), Fps::Unlimited, ]; @@ -306,13 +336,58 @@ impl<'a> Widget for Video<'a> { .color(TEXT_COLOR) .set(state.ids.max_fps_value, ui); + // Max Background FPS + Text::new(self.localized_strings.get("hud.settings.background_fps")) + .down_from(state.ids.vd_slider, 10.0) + .right_from(state.ids.max_fps_value, 30.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.max_background_fps_text, ui); + + if let Some(which) = ImageSlider::discrete( + BG_FPS_CHOICES + .iter() + .position(|&x| x == self.global_state.settings.graphics.max_background_fps) + .unwrap_or(5), + 0, + BG_FPS_CHOICES.len() - 1, + self.imgs.slider_indicator, + self.imgs.slider, + ) + .w_h(104.0, 22.0) + .down_from(state.ids.max_background_fps_text, 8.0) + .track_breadth(12.0) + .slider_length(10.0) + .pad_track((5.0, 5.0)) + .set(state.ids.max_background_fps_slider, ui) + { + events.push(GraphicsChange::ChangeMaxBackgroundFPS( + BG_FPS_CHOICES[which], + )); + } + + Text::new( + &self + .global_state + .settings + .graphics + .max_background_fps + .to_string(), + ) + .right_from(state.ids.max_background_fps_slider, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.max_background_fps_value, ui); + // Get render mode let render_mode = &self.global_state.settings.graphics.render_mode; // Present Mode Text::new(self.localized_strings.get("hud.settings.present_mode")) .down_from(state.ids.vd_slider, 10.0) - .right_from(state.ids.max_fps_value, 30.0) + .right_from(state.ids.max_background_fps_value, 30.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) diff --git a/voxygen/src/run.rs b/voxygen/src/run.rs index 3244b8e3ee..4358fb10fb 100644 --- a/voxygen/src/run.rs +++ b/voxygen/src/run.rs @@ -230,8 +230,11 @@ fn handle_main_events_cleared( // running at hundreds/thousands of FPS resulting in high GPU usage for // effectively doing nothing. let max_fps = get_fps(global_state.settings.graphics.max_fps); + let max_background_fps = get_fps(global_state.settings.graphics.max_background_fps); const TITLE_SCREEN_FPS_CAP: u32 = 60; - let target_fps = if capped_fps { + let target_fps = if !global_state.window.focused { + u32::min(max_background_fps, max_fps) + } else if capped_fps { u32::min(TITLE_SCREEN_FPS_CAP, max_fps) } else { max_fps diff --git a/voxygen/src/session/settings_change.rs b/voxygen/src/session/settings_change.rs index 11c215cd4b..e2d9e3dbf8 100644 --- a/voxygen/src/session/settings_change.rs +++ b/voxygen/src/session/settings_change.rs @@ -72,6 +72,7 @@ pub enum Graphics { AdjustFigureLoDRenderDistance(u32), ChangeMaxFPS(Fps), + ChangeMaxBackgroundFPS(Fps), ChangeFOV(u16), ChangeGamma(f32), @@ -346,6 +347,9 @@ impl SettingsChange { Graphics::ChangeMaxFPS(fps) => { settings.graphics.max_fps = fps; }, + Graphics::ChangeMaxBackgroundFPS(fps) => { + settings.graphics.max_background_fps = fps; + }, Graphics::ChangeFOV(new_fov) => { settings.graphics.fov = new_fov; session_state.scene.camera_mut().set_fov_deg(new_fov); diff --git a/voxygen/src/settings/graphics.rs b/voxygen/src/settings/graphics.rs index 1155a7a131..d0874f6723 100644 --- a/voxygen/src/settings/graphics.rs +++ b/voxygen/src/settings/graphics.rs @@ -35,6 +35,7 @@ pub struct GraphicsSettings { pub lossy_terrain_compression: bool, pub figure_lod_render_distance: u32, pub max_fps: Fps, + pub max_background_fps: Fps, pub fov: u16, pub gamma: f32, pub exposure: f32, @@ -54,6 +55,7 @@ impl Default for GraphicsSettings { lossy_terrain_compression: false, figure_lod_render_distance: 300, max_fps: Fps::Max(60), + max_background_fps: Fps::Max(30), fov: 70, gamma: 1.0, exposure: 1.0, diff --git a/voxygen/src/window.rs b/voxygen/src/window.rs index eacc4319be..9ff56f6f72 100644 --- a/voxygen/src/window.rs +++ b/voxygen/src/window.rs @@ -386,7 +386,7 @@ pub struct Window { keypress_map: HashMap, pub remapping_keybindings: Option, events: Vec, - focused: bool, + pub focused: bool, gilrs: Option, pub controller_settings: ControllerSettings, cursor_position: winit::dpi::PhysicalPosition,