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]]
name = "svc16"
version = "0.4.0"
version = "0.4.1"
dependencies = [
"anyhow",
"clap",

View File

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

View File

@ -1,7 +1,7 @@
use std::ops::{BitAnd, BitXor};
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 GOTO: u16 = 1;
@ -71,10 +71,15 @@ impl Engine {
self.pos_code = pos_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.sync_called = false;
return self.screen.clone();
*buffer = self.screen;
}
}
impl Engine {

View File

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