Compare commits
2 Commits
94cb5a542d
...
99d6970323
Author | SHA1 | Date |
---|---|---|
Simon Gellis | 99d6970323 | |
Simon Gellis | e8b706df20 |
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ use std::{
|
|||
path::{Path, PathBuf},
|
||||
sync::{
|
||||
atomic::{AtomicBool, Ordering},
|
||||
mpsc::{self, TryRecvError},
|
||||
mpsc::{self, RecvError, TryRecvError},
|
||||
Arc,
|
||||
},
|
||||
};
|
||||
|
@ -94,19 +94,33 @@ impl Emulator {
|
|||
let mut eye_contents = vec![0u8; 384 * 224 * 2];
|
||||
let mut audio_samples = vec![];
|
||||
loop {
|
||||
let mut idle = true;
|
||||
if self.running.load(Ordering::Acquire) {
|
||||
idle = false;
|
||||
self.sim.emulate_frame();
|
||||
}
|
||||
if let Some(renderer) = &mut self.renderer {
|
||||
if self.sim.read_pixels(&mut eye_contents) {
|
||||
idle = false;
|
||||
renderer.render(&eye_contents);
|
||||
}
|
||||
}
|
||||
self.sim.read_samples(&mut audio_samples);
|
||||
if !audio_samples.is_empty() {
|
||||
idle = false;
|
||||
self.audio.update(&audio_samples);
|
||||
audio_samples.clear();
|
||||
}
|
||||
if idle {
|
||||
// The game is paused, and we have output all the video/audio we have.
|
||||
// Block the thread until a new command comes in.
|
||||
match self.commands.recv() {
|
||||
Ok(command) => self.handle_command(command),
|
||||
Err(RecvError) => {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
loop {
|
||||
match self.commands.try_recv() {
|
||||
Ok(command) => self.handle_command(command),
|
||||
|
|
11
src/main.rs
11
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,7 +27,11 @@ fn main() -> Result<()> {
|
|||
if let Some(path) = args.rom {
|
||||
builder = builder.with_rom(&path);
|
||||
}
|
||||
thread::spawn(move || {
|
||||
|
||||
ThreadBuilder::default()
|
||||
.name("Emulator".to_owned())
|
||||
.priority(ThreadPriority::Max)
|
||||
.spawn_careless(move || {
|
||||
let mut emulator = match builder.build() {
|
||||
Ok(e) => e,
|
||||
Err(err) => {
|
||||
|
@ -35,7 +40,7 @@ fn main() -> Result<()> {
|
|||
}
|
||||
};
|
||||
emulator.run();
|
||||
});
|
||||
})?;
|
||||
|
||||
let event_loop = EventLoop::with_user_event().build().unwrap();
|
||||
event_loop.set_control_flow(ControlFlow::Poll);
|
||||
|
|
Loading…
Reference in New Issue