Use high-priority thread for emulation

This commit is contained in:
Simon Gellis 2024-11-10 15:53:14 -05:00
parent 3113934a3a
commit 924c7ea300
3 changed files with 38 additions and 11 deletions

21
Cargo.lock generated
View File

@ -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",
"winver",
@ -2119,6 +2126,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"

View File

@ -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"

View File

@ -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);