optimised draw to screen, and prepared for threaded
This commit is contained in:
parent
09dada68a9
commit
9b59214c1d
|
@ -236,6 +236,49 @@ dependencies = [
|
||||||
"cfg-if",
|
"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]]
|
[[package]]
|
||||||
name = "dispatch"
|
name = "dispatch"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
|
@ -257,6 +300,12 @@ version = "1.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
|
checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "either"
|
||||||
|
version = "1.8.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "equivalent"
|
name = "equivalent"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
|
@ -505,6 +554,15 @@ dependencies = [
|
||||||
"autocfg",
|
"autocfg",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memoffset"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "minimal-lexical"
|
name = "minimal-lexical"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
|
@ -687,6 +745,16 @@ dependencies = [
|
||||||
"autocfg",
|
"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]]
|
[[package]]
|
||||||
name = "num_enum"
|
name = "num_enum"
|
||||||
version = "0.5.11"
|
version = "0.5.11"
|
||||||
|
@ -898,6 +966,28 @@ version = "0.5.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
|
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]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.3.5"
|
version = "0.3.5"
|
||||||
|
@ -913,6 +1003,12 @@ version = "1.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
|
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "scopeguard"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sctk-adwaita"
|
name = "sctk-adwaita"
|
||||||
version = "0.5.4"
|
version = "0.5.4"
|
||||||
|
@ -940,6 +1036,7 @@ dependencies = [
|
||||||
"measure_time",
|
"measure_time",
|
||||||
"num",
|
"num",
|
||||||
"rand",
|
"rand",
|
||||||
|
"rayon",
|
||||||
"softbuffer",
|
"softbuffer",
|
||||||
"winit",
|
"winit",
|
||||||
]
|
]
|
||||||
|
|
|
@ -11,4 +11,5 @@ gif = "0.12.0"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
num = "0.4.0"
|
num = "0.4.0"
|
||||||
measure_time = "0.8.2"
|
measure_time = "0.8.2"
|
||||||
softbuffer = "0.3.0"
|
softbuffer = "0.3.0"
|
||||||
|
rayon = "1.7.0"
|
|
@ -14,7 +14,7 @@ struct World {
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
rand::thread_rng().gen::<Direction>();
|
rand::thread_rng().gen::<Direction>();
|
||||||
run::<World>(WIDTH, HEIGHT, 240);
|
run::<World>(WIDTH, HEIGHT, 10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Game for World {
|
impl Game for World {
|
||||||
|
|
|
@ -3,6 +3,7 @@ use crate::image::Image;
|
||||||
use crate::vec2::Vec2;
|
use crate::vec2::Vec2;
|
||||||
use crate::Tileset;
|
use crate::Tileset;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
use rayon::prelude::*;
|
||||||
use std::cmp::{max, min};
|
use std::cmp::{max, min};
|
||||||
use std::num::NonZeroU32;
|
use std::num::NonZeroU32;
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
@ -222,7 +223,46 @@ pub fn run<T: Game + 'static>(width: i32, height: i32, target_fps: u32) {
|
||||||
*off_y = (size.height as usize - height as usize * *scale) / 2;
|
*off_y = (size.height as usize - height as usize * *scale) / 2;
|
||||||
|
|
||||||
let mut buf = surface.buffer_mut().unwrap();
|
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 {
|
for x in 0..width as usize {
|
||||||
let p = window_state.palette
|
let p = window_state.palette
|
||||||
[screen.data()[x + y * width as usize] as usize];
|
[screen.data()[x + y * width as usize] as usize];
|
||||||
|
@ -234,7 +274,7 @@ pub fn run<T: Game + 'static>(width: i32, height: i32, target_fps: u32) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});*/
|
||||||
buf.present().unwrap();
|
buf.present().unwrap();
|
||||||
frames_since_last_second += 1;
|
frames_since_last_second += 1;
|
||||||
last_frame += target_frame_duration;
|
last_frame += target_frame_duration;
|
||||||
|
|
Loading…
Reference in New Issue