From 9b59214c1dfacf432616600436ea580789af7a25 Mon Sep 17 00:00:00 2001 From: dani Date: Sun, 9 Jul 2023 23:45:12 +0000 Subject: [PATCH] optimised draw to screen, and prepared for threaded --- Cargo.lock | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 +- examples/test.rs | 2 +- src/window.rs | 44 +++++++++++++++++++++- 4 files changed, 142 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7953d1c..49ec0cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -236,6 +236,49 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.9.0", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -257,6 +300,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + [[package]] name = "equivalent" version = "1.0.0" @@ -505,6 +554,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -687,6 +745,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "num_enum" version = "0.5.11" @@ -898,6 +966,28 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + [[package]] name = "redox_syscall" version = "0.3.5" @@ -913,6 +1003,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + [[package]] name = "sctk-adwaita" version = "0.5.4" @@ -940,6 +1036,7 @@ dependencies = [ "measure_time", "num", "rand", + "rayon", "softbuffer", "winit", ] diff --git a/Cargo.toml b/Cargo.toml index 241e59f..32a9a7c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,4 +11,5 @@ gif = "0.12.0" rand = "0.8.5" num = "0.4.0" measure_time = "0.8.2" -softbuffer = "0.3.0" \ No newline at end of file +softbuffer = "0.3.0" +rayon = "1.7.0" \ No newline at end of file diff --git a/examples/test.rs b/examples/test.rs index 2a50f4e..4b645f8 100644 --- a/examples/test.rs +++ b/examples/test.rs @@ -14,7 +14,7 @@ struct World { fn main() { rand::thread_rng().gen::(); - run::(WIDTH, HEIGHT, 240); + run::(WIDTH, HEIGHT, 10000); } impl Game for World { diff --git a/src/window.rs b/src/window.rs index 25d132e..f1b6dff 100644 --- a/src/window.rs +++ b/src/window.rs @@ -3,6 +3,7 @@ use crate::image::Image; use crate::vec2::Vec2; use crate::Tileset; use rand::Rng; +use rayon::prelude::*; use std::cmp::{max, min}; use std::num::NonZeroU32; use std::time::{Duration, Instant}; @@ -222,7 +223,46 @@ pub fn run(width: i32, height: i32, target_fps: u32) { *off_y = (size.height as usize - height as usize * *scale) / 2; let mut buf = surface.buffer_mut().unwrap(); - for y in 0..height as usize { + //for y in 0..height as usize { + + { + let width = width as usize; + let height = height as usize; + let window_width = size.width as usize; + let window_height = size.height as usize; + let scale = *scale; + let chunk_size = scale * window_width; + let screen_data = screen.data(); + buf.chunks_exact_mut(chunk_size) + .into_iter() + .enumerate() + .for_each(|(y, chunk)| { + for x in 0..width { + //let p = window_state.palette[screen_data[x + y * width] as usize]; + let p = 0; + for scaley in 0..scale { + for scalex in 0..scale { + let sx = x * scale + scalex; + chunk[sx + scaley * window_width] = p; + } + } + } + /* + for (chunk_i, data) in chunk.iter_mut().enumerate() { + let i = chunk_i + chunk_idx * chunk_size; + let sx = i % window_width; + let sy = i / window_width; + let bx = sx / scale; + let by = sy / scale; + let p = + window_state.palette[screen_data[bx + by * width] as usize]; + *data = p; + } + + */ + }); + } + /*(0..height as usize).for_each(|y| { for x in 0..width as usize { let p = window_state.palette [screen.data()[x + y * width as usize] as usize]; @@ -234,7 +274,7 @@ pub fn run(width: i32, height: i32, target_fps: u32) { } } } - } + });*/ buf.present().unwrap(); frames_since_last_second += 1; last_frame += target_frame_duration;