From e8b706df2089adfd72e9191eba42da80257c496f Mon Sep 17 00:00:00 2001 From: Simon Gellis Date: Sun, 10 Nov 2024 15:53:14 -0500 Subject: [PATCH] Use high-priority thread for emulation --- Cargo.lock | 21 +++++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 27 ++++++++++++++++----------- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8db4c14..a61b2f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1892,6 +1892,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rustversion" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" + [[package]] name = "same-file" version = "1.0.6" @@ -1972,6 +1978,7 @@ dependencies = [ "pollster", "rtrb", "rubato", + "thread-priority", "wgpu", "winit", ] @@ -2118,6 +2125,20 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "thread-priority" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe075d7053dae61ac5413a34ea7d4913b6e6207844fd726bdd858b37ff72bf5" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "libc", + "log", + "rustversion", + "winapi", +] + [[package]] name = "tiny-skia" version = "0.11.4" diff --git a/Cargo.toml b/Cargo.toml index 23abe96..73f97d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ num-traits = "0.2" pollster = "0.4" rtrb = "0.3" rubato = "0.16" +thread-priority = "1" wgpu = "22.1" winit = "0.30" diff --git a/src/main.rs b/src/main.rs index 1b79b00..b8de1cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,10 @@ -use std::{path::PathBuf, process, thread}; +use std::{path::PathBuf, process}; use anyhow::Result; use app::App; use clap::Parser; use emulator::EmulatorBuilder; +use thread_priority::{ThreadBuilder, ThreadPriority}; use winit::event_loop::{ControlFlow, EventLoop}; mod app; @@ -26,16 +27,20 @@ fn main() -> Result<()> { if let Some(path) = args.rom { builder = builder.with_rom(&path); } - thread::spawn(move || { - let mut emulator = match builder.build() { - Ok(e) => e, - Err(err) => { - eprintln!("Error initializing emulator: {err}"); - process::exit(1); - } - }; - emulator.run(); - }); + + ThreadBuilder::default() + .name("Emulator".to_owned()) + .priority(ThreadPriority::Max) + .spawn_careless(move || { + let mut emulator = match builder.build() { + Ok(e) => e, + Err(err) => { + eprintln!("Error initializing emulator: {err}"); + process::exit(1); + } + }; + emulator.run(); + })?; let event_loop = EventLoop::with_user_event().build().unwrap(); event_loop.set_control_flow(ControlFlow::Poll);