From c4234becb9bd6def5cb21b8aaef0055aa96f469c Mon Sep 17 00:00:00 2001 From: Nova Date: Fri, 19 May 2023 18:11:52 -0400 Subject: [PATCH] feat: clean up main function --- src/main.rs | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4f05358..ce36cab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -220,26 +220,13 @@ fn main() -> Result<()> { } input::process_input(); nodes::root::Root::send_frame_events(sk.time_elapsed_unscaled()); - { - let frame_delta = Duration::from_secs_f64(sk.time_elapsed_unscaled()); - if last_frame_delta < frame_delta { - if let Some(frame_delta_delta) = frame_delta.checked_sub(last_frame_delta) { - if let Some(new_sleep_duration) = - sleep_duration.checked_sub(frame_delta_delta) - { - sleep_duration = new_sleep_duration; - } - } - } else { - sleep_duration += Duration::from_micros(250); - } + adaptive_sleep( + sk, + &mut last_frame_delta, + &mut sleep_duration, + Duration::from_micros(250), + ); - debug_span!("Sleep", ?sleep_duration, ?frame_delta, ?last_frame_delta) - .in_scope(|| { - last_frame_delta = frame_delta; - std::thread::sleep(sleep_duration); // to give clients a chance to even update anything before drawing - }); - } #[cfg(feature = "wayland")] wayland.update(sk); drawable::draw(sk); @@ -264,6 +251,29 @@ fn main() -> Result<()> { Ok(()) } +fn adaptive_sleep( + sk: &impl StereoKitMultiThread, + last_frame_delta: &mut Duration, + sleep_duration: &mut Duration, + sleep_duration_increase: Duration, +) { + let frame_delta = Duration::from_secs_f64(sk.time_elapsed_unscaled()); + if *last_frame_delta < frame_delta { + if let Some(frame_delta_delta) = frame_delta.checked_sub(*last_frame_delta) { + if let Some(new_sleep_duration) = sleep_duration.checked_sub(frame_delta_delta) { + *sleep_duration = new_sleep_duration; + } + } + } else { + *sleep_duration += sleep_duration_increase; + } + + debug_span!("Sleep", ?sleep_duration, ?frame_delta, ?last_frame_delta).in_scope(|| { + *last_frame_delta = frame_delta; + std::thread::sleep(*sleep_duration); // to give clients a chance to even update anything before drawing + }); +} + #[tokio::main] // #[tokio::main(flavor = "current_thread")] async fn event_loop(