From f349d516f22c72f9c6c1854e6ba36a9e66028e0d Mon Sep 17 00:00:00 2001 From: TheUnnamedDude Date: Sun, 10 Apr 2016 23:05:05 +0200 Subject: [PATCH] Implement frame limit and configurable vsync (Fixes #29) --- src/main.rs | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index af89815..e0ce4fa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -151,14 +151,15 @@ impl Game { fn main() { let con = Arc::new(Mutex::new(console::Console::new())); - { + let mut vsync = { let mut con = con.lock().unwrap(); con.register(CL_BRAND); auth::register_vars(&mut con); settings::register_vars(&mut con); con.load_config(); con.save_config(); - } + *con.get(settings::R_VSYNC) + }; let proxy = console::ConsoleProxy::new(con.clone()); @@ -176,9 +177,6 @@ fn main() { let sdl = sdl2::init().unwrap(); let sdl_video = sdl.video().unwrap(); - - sdl_video.gl_set_swap_interval(1); - let window = sdl2::video::WindowBuilder::new(&sdl_video, "Steven", 854, 480) .opengl() .resizable() @@ -196,6 +194,9 @@ fn main() { gl::init(&sdl_video); + sdl_video.gl_set_swap_interval(if vsync { 1 } else { 0 }); + + let renderer = render::Renderer::new(resource_manager.clone()); let mut ui_container = ui::Container::new(); @@ -233,6 +234,16 @@ fn main() { let delta = (diff.num_nanoseconds().unwrap() as f64) / frame_time; let (width, height) = window.drawable_size(); + let fps_cap = { + let console = game.console.lock().unwrap(); + let vsync_changed = *console.get(settings::R_VSYNC); + if vsync != vsync_changed { + vsync = vsync_changed; + sdl_video.gl_set_swap_interval(if vsync { 1 } else { 0 }); + } + *console.get(settings::R_MAX_FPS) + }; + game.tick(delta); game.server.tick(&mut game.renderer, delta); @@ -248,6 +259,14 @@ fn main() { ui_container.tick(&mut game.renderer, delta, width as f64, height as f64); game.renderer.tick(&mut game.server.world, delta, width, height); + + if fps_cap > 0 && !vsync { + let frame_time = time::now() - now; + let sleep_interval = time::Duration::milliseconds(1000 / fps_cap); + if frame_time < sleep_interval { + thread::sleep_ms((sleep_interval - frame_time).num_milliseconds() as u32); + } + } window.gl_swap_window(); for event in events.poll_iter() {