From 5207bd4b27b450fa932d2f5af3b493da332ea493 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Sat, 4 Apr 2026 01:27:45 -0600 Subject: [PATCH] remove governor crate (#709) * remove governor crate * more --- Cargo.lock | 128 ----------------------------------------------- Cargo.toml | 1 - src/device.rs | 2 +- src/device/vi.rs | 57 ++++++++++++--------- 4 files changed, 34 insertions(+), 154 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a3ac2fc2..26bb8415 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1148,20 +1148,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "data-encoding" version = "2.10.0" @@ -1793,12 +1779,6 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" - [[package]] name = "futures-util" version = "0.3.32" @@ -2027,7 +2007,6 @@ dependencies = [ "encoding_rs", "fatfs", "futures", - "governor", "mimalloc", "open", "postcard", @@ -2053,29 +2032,6 @@ dependencies = [ "zip", ] -[[package]] -name = "governor" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9efcab3c1958580ff1f25a2a41be1668f7603d849bb63af523b208a3cc1223b8" -dependencies = [ - "cfg-if", - "dashmap", - "futures-sink", - "futures-timer", - "futures-util", - "getrandom 0.3.4", - "hashbrown 0.16.1", - "nonzero_ext", - "parking_lot", - "portable-atomic", - "quanta", - "rand 0.9.2", - "smallvec", - "spinning_top", - "web-time", -] - [[package]] name = "h2" version = "0.4.13" @@ -3388,12 +3344,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "nonzero_ext" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" - [[package]] name = "noop_proc_macro" version = "0.3.0" @@ -3928,29 +3878,6 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.18", - "smallvec", - "windows-link", -] - [[package]] name = "parley" version = "0.7.0" @@ -4245,21 +4172,6 @@ dependencies = [ "bytemuck", ] -[[package]] -name = "quanta" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" -dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi", - "web-sys", - "winapi", -] - [[package]] name = "quick-error" version = "2.0.1" @@ -4448,15 +4360,6 @@ dependencies = [ "rgb", ] -[[package]] -name = "raw-cpuid" -version = "11.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" -dependencies = [ - "bitflags 2.11.0", -] - [[package]] name = "raw-window-handle" version = "0.6.2" @@ -5460,15 +5363,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "spinning_top" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" -dependencies = [ - "lock_api", -] - [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -6571,22 +6465,6 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" version = "0.1.11" @@ -6596,12 +6474,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows" version = "0.58.0" diff --git a/Cargo.toml b/Cargo.toml index 8c29775a..3a1fa3c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,6 @@ rust-version = "1.94.1" [dependencies] dirs = "6.0" zip = "8.0" -governor = "0.10" sevenz-rust2 = "0.20" chrono = "0.4" serde = { version = "1.0", features = ["derive"] } diff --git a/src/device.rs b/src/device.rs index 4c1462ab..f7848516 100644 --- a/src/device.rs +++ b/src/device.rs @@ -474,7 +474,7 @@ impl Device { delay: 0, count_per_scanline: 0, enable_speed_limiter: true, - limiter: None, + next_pace_deadline: None, vi_counter: 0, last_origin: 0, internal_frame_counter: 0, diff --git a/src/device/vi.rs b/src/device/vi.rs index bcb939c0..5020e917 100644 --- a/src/device/vi.rs +++ b/src/device/vi.rs @@ -1,5 +1,4 @@ use crate::{cheats, device, netplay, ui}; -use governor::clock::Clock; const VI_STATUS_REG: u32 = 0; const VI_ORIGIN_REG: u32 = 1; @@ -24,7 +23,7 @@ pub struct Vi { pub delay: u64, pub field: u32, #[serde(skip)] - pub limiter: Option, + pub next_pace_deadline: Option, pub count_per_scanline: u64, pub enable_speed_limiter: bool, pub vi_counter: u64, @@ -50,17 +49,11 @@ pub fn set_expected_refresh_rate(device: &mut device::Device) { device.vi.count_per_scanline = device.vi.delay / (device.vi.regs[VI_V_SYNC_REG as usize] + 1) as u64; - create_limiter(device); + reset_pace_deadline(device); } -fn create_limiter(device: &mut device::Device) { - let quota = governor::Quota::with_period(std::time::Duration::from_secs_f64( - device.vi.frame_time * device.vi.limit_freq as f64, - )) - .unwrap(); - device.vi.limiter = Some(governor::RateLimiter::direct(quota)); - let _ = device.vi.limiter.as_ref().unwrap().check(); - //println!("new limit freq: {}", device.vi.limit_freq); +fn reset_pace_deadline(device: &mut device::Device) { + device.vi.next_pace_deadline = None; } fn set_vertical_interrupt(device: &mut device::Device) { @@ -188,18 +181,34 @@ pub fn init(device: &mut device::Device) { } } -fn speed_limiter(device: &mut device::Device, speed_limiter_toggled: bool) { - let limiter = device.vi.limiter.as_ref().unwrap(); - if let Err(outcome) = limiter.check() { - let dur = outcome.wait_time_from(limiter.clock().now()); - spin_sleep::sleep(dur); - if dur < device.vi.min_wait_time { - device.vi.min_wait_time = dur; - } +fn speed_limiter(device: &mut device::Device, mut speed_limiter_toggled: bool) { + let interval = + std::time::Duration::from_secs_f64(device.vi.frame_time * device.vi.limit_freq as f64); - let _ = limiter.check(); - } else { - device.vi.min_wait_time = std::time::Duration::from_secs(0); + let now = std::time::Instant::now(); + match device.vi.next_pace_deadline { + None => { + device.vi.next_pace_deadline = Some(now + interval); + speed_limiter_toggled = true; + } + Some(deadline) => { + if now < deadline { + let dur = deadline - now; + spin_sleep::sleep(dur); + if dur < device.vi.min_wait_time { + device.vi.min_wait_time = dur; + } + } else { + //println!("did not sleep"); + device.vi.min_wait_time = std::time::Duration::from_secs(0); + } + let mut next = deadline + interval; + let t = std::time::Instant::now(); + while next <= t { + next += interval; + } + device.vi.next_pace_deadline = Some(next); + } } if std::time::Instant::now().duration_since(device.vi.limit_freq_check) @@ -210,13 +219,13 @@ fn speed_limiter(device: &mut device::Device, speed_limiter_toggled: bool) { && device.vi.limit_freq < MAX_LIMIT_FREQ { device.vi.limit_freq += 1; - create_limiter(device); + reset_pace_deadline(device); } else if device.vi.min_wait_time > std::time::Duration::from_secs_f64(device.vi.frame_time) && device.vi.limit_freq > 1 { device.vi.limit_freq -= 1; - create_limiter(device); + reset_pace_deadline(device); } }