From ca7300a52b89762c1cfa4378f1c407877654e038 Mon Sep 17 00:00:00 2001 From: Jonathan Flueren Date: Wed, 18 May 2022 16:45:50 +0200 Subject: [PATCH] Try Multithreadding with Arc (not successfully) --- Cargo.lock | 16 ++++++++-------- src/hittable_list.rs | 13 ++++++++++--- src/main.rs | 17 +++++++++-------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba36ca2..37381b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -157,9 +157,9 @@ dependencies = [ [[package]] name = "jpeg-decoder" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be7ef4b99870f0c9f2fc2f20dbef72707e2bcca675bb9196734cf433e999b0c5" +checksum = "9478aa10f73e7528198d75109c8be5cd7d15fb530238040148d5f9a22d4c5b3b" [[package]] name = "lazy_static" @@ -169,9 +169,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "memoffset" @@ -292,9 +292,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ "autocfg", "crossbeam-deque", @@ -304,9 +304,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f51245e1e62e1f1629cbfec37b5793bbabcaeb90f30e94d2ba03564687353e4" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" dependencies = [ "crossbeam-channel", "crossbeam-deque", diff --git a/src/hittable_list.rs b/src/hittable_list.rs index 6a877f8..5c3d206 100644 --- a/src/hittable_list.rs +++ b/src/hittable_list.rs @@ -1,15 +1,16 @@ use super::HitRecord; use super::Hittable; use super::Ray; +use super::Arc; pub struct HittableList { - objects: Vec>, + objects: Vec>, } impl HittableList { pub fn new() -> Self { HittableList { - objects: Vec::>::new(), + objects: Vec::>::new(), } } @@ -17,10 +18,16 @@ impl HittableList { self.objects.clear(); } - pub fn add(&mut self, obj: Box) { + pub fn add(&mut self, obj: Arc) { self.objects.push(obj); } + pub fn clone(&self) -> Self { + HittableList { + objects : self.objects.clone() + } + } + pub fn hit(&self, r: &Ray, t_min: f64, t_max: f64, rec: &mut HitRecord) -> bool { let mut hit_anything = false; let mut closest_so_far = t_max; diff --git a/src/main.rs b/src/main.rs index 19f9406..2109031 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ mod utility; mod vec3; use std::env; +use std::sync::Arc; //use std::fs::File; //use std::io::BufWriter; //use std::io::Write; @@ -43,23 +44,23 @@ fn main() { // World let mut world = HittableList::new(); - world.add(Box::::new(Sphere::new( + world.add(Arc::::new(Sphere::new( Point3::new(0.0, 0.0, -1.0), 0.5, ))); - world.add(Box::::new(Sphere::new( + world.add(Arc::::new(Sphere::new( Point3::new(0.0, -100.5, -150.0), 100.0, ))); - world.add(Box::::new(Sphere::new( + world.add(Arc::::new(Sphere::new( Point3::new(1.0, 0.0, -1.5), 0.3, ))); - world.add(Box::::new(Sphere::new( + world.add(Arc::::new(Sphere::new( Point3::new(1.0, 1.1, -1.5), 0.3, ))); - world.add(Box::::new(Sphere::new( + world.add(Arc::::new(Sphere::new( Point3::new(-1.0, 1.1, -1.5), 0.3, ))); @@ -67,7 +68,7 @@ fn main() { /* for i in -15..15 { for j in -15..15 { - world.add(Box::::new(Sphere::new(Point3::new(j as f64/6.0 as f64, i as f64/6.0 as f64, -1.5), 0.05))); + world.add(Arc::::new(Sphere::new(Point3::new(j as f64/6.0 as f64, i as f64/6.0 as f64, -1.5), 0.05))); } } */ @@ -86,11 +87,11 @@ fn main() { //let mut file = BufWriter::new(File::create(default_file).unwrap()); //writeln!(&mut file, "P3\n{image_width} {image_height}\n255\n").unwrap(); - TODO: // world in vec umwandeln + //TODO: // world in vec umwandeln for j in (0..image_height).rev() { eprint!("\rScanlines remaining: {j:5}"); - (0..image_width).into_par_iter().for_each(|i| pixel_color_calc(&mut image, &cam, &world, j, i, image_width, image_height, samples_per_pixel)); + (0..image_width).into_par_iter().for_each(|i| pixel_color_calc(&mut image, &cam, &world.clone(), j, i, image_width, image_height, samples_per_pixel)); } image.save(default_file).unwrap(); eprintln!("\nDone!");