Preallocated the u16 pixel buffer and made the -v output more detailed.

This commit is contained in:
jan 2024-12-19 13:38:35 +01:00
parent 3cbeba00ee
commit a229e6d378
4 changed files with 22 additions and 8 deletions

2
Cargo.lock generated
View File

@ -1346,7 +1346,7 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]] [[package]]
name = "svc16" name = "svc16"
version = "0.4.0" version = "0.4.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap", "clap",

View File

@ -1,6 +1,6 @@
[package] [package]
name = "svc16" name = "svc16"
version = "0.4.0" version = "0.4.1"
edition = "2021" edition = "2021"
authors = ["Jan Neuendorf"] authors = ["Jan Neuendorf"]
description = "An emulator for a simple virtual computer" description = "An emulator for a simple virtual computer"

View File

@ -1,7 +1,7 @@
use std::ops::{BitAnd, BitXor}; use std::ops::{BitAnd, BitXor};
use thiserror::Error; use thiserror::Error;
const MEMSIZE: usize = u16::MAX as usize + 1; pub const MEMSIZE: usize = u16::MAX as usize + 1;
const SET: u16 = 0; const SET: u16 = 0;
const GOTO: u16 = 1; const GOTO: u16 = 1;
@ -71,10 +71,15 @@ impl Engine {
self.pos_code = pos_code; self.pos_code = pos_code;
self.key_code = key_code; self.key_code = key_code;
} }
pub fn perform_sync(&mut self, pos_code: u16, key_code: u16) -> [u16; MEMSIZE] { pub fn perform_sync(
&mut self,
pos_code: u16,
key_code: u16,
buffer: &mut [u16; MEMSIZE],
) -> () {
self.set_input(pos_code, key_code); self.set_input(pos_code, key_code);
self.sync_called = false; self.sync_called = false;
return self.screen.clone(); *buffer = self.screen;
} }
} }
impl Engine { impl Engine {

View File

@ -49,6 +49,8 @@ fn main() -> Result<()> {
Pixels::new(RES as u32, RES as u32, surface_texture)? Pixels::new(RES as u32, RES as u32, surface_texture)?
}; };
let mut raw_buffer = [0 as u16; engine::MEMSIZE];
event_loop.run(|event, elwt| { event_loop.run(|event, elwt| {
let start_time = Instant::now(); let start_time = Instant::now();
if input.update(&event) { if input.update(&event) {
@ -65,6 +67,7 @@ fn main() -> Result<()> {
} }
let mut ipf = 0; let mut ipf = 0;
let engine_start = Instant::now();
while !engine.wants_to_sync() && ipf <= cli.max_ipf { while !engine.wants_to_sync() && ipf <= cli.max_ipf {
match engine.step() { match engine.step() {
Err(_) => { Err(_) => {
@ -75,13 +78,19 @@ fn main() -> Result<()> {
} }
ipf += 1; ipf += 1;
} }
let engine_elapsed = engine_start.elapsed();
let (c1, c2) = get_input_code(&input, &pixels); let (c1, c2) = get_input_code(&input, &pixels);
let nb = engine.perform_sync(c1, c2); engine.perform_sync(c1, c2, &mut raw_buffer);
update_image_buffer(pixels.frame_mut(), &nb); update_image_buffer(pixels.frame_mut(), &raw_buffer);
let elapsed = start_time.elapsed(); let elapsed = start_time.elapsed();
if cli.verbose { if cli.verbose {
println!("Instructions: {} Frametime: {}ms", ipf, elapsed.as_millis()); println!(
"Instructions: {} Frametime: {}ms (Engine only: {}ms)",
ipf,
elapsed.as_millis(),
engine_elapsed.as_millis()
);
} }
if elapsed < FRAMETIME { if elapsed < FRAMETIME {
std::thread::sleep(FRAMETIME - elapsed); std::thread::sleep(FRAMETIME - elapsed);