Replace unnecessary Arcs with Boxes.
This commit is contained in:
parent
50d9848faa
commit
bbeb39ba5d
|
|
@ -17,18 +17,18 @@ fn simple_scene(bencher: &mut Criterion) {
|
|||
let image_width = 6;
|
||||
let image_height = 6;
|
||||
|
||||
let scene = Arc::new(Scene {
|
||||
let scene = Scene {
|
||||
camera_location: Point3::new(-2.0, 1.0, -5.0),
|
||||
objects: vec![
|
||||
Arc::new(Plane::new(
|
||||
Box::new(Plane::new(
|
||||
Vector3::new(0.0, 1.0, 0.0),
|
||||
-2.0,
|
||||
Arc::new(LambertianMaterial {
|
||||
colour: ColourRgbF::new(0.55, 0.27, 0.04),
|
||||
diffuse_strength: 0.1,
|
||||
}),
|
||||
)) as Arc<dyn Primitive<f64>>,
|
||||
Arc::new(Sphere::new(
|
||||
)) as Box<dyn Primitive<f64>>,
|
||||
Box::new(Sphere::new(
|
||||
Point3::new(-6.25, -0.5, 1.0),
|
||||
1.0,
|
||||
Arc::new(LambertianMaterial {
|
||||
|
|
@ -36,7 +36,7 @@ fn simple_scene(bencher: &mut Criterion) {
|
|||
diffuse_strength: 0.1,
|
||||
}),
|
||||
)),
|
||||
Arc::new(Sphere::new(
|
||||
Box::new(Sphere::new(
|
||||
Point3::new(-4.25, -0.5, 2.0),
|
||||
1.0,
|
||||
Arc::new(ReflectiveMaterial {
|
||||
|
|
@ -45,7 +45,7 @@ fn simple_scene(bencher: &mut Criterion) {
|
|||
reflection_strength: 0.99,
|
||||
}),
|
||||
)),
|
||||
Arc::new(Sphere::new(
|
||||
Box::new(Sphere::new(
|
||||
Point3::new(-5.0, 1.5, 1.0),
|
||||
1.0,
|
||||
Arc::new(PhongMaterial {
|
||||
|
|
@ -55,7 +55,7 @@ fn simple_scene(bencher: &mut Criterion) {
|
|||
specular_strength: 1.0,
|
||||
}),
|
||||
)),
|
||||
Arc::new(BoundingVolumeHierarchy::build(
|
||||
Box::new(BoundingVolumeHierarchy::build(
|
||||
&load_obj(
|
||||
Path::new("/home/matthew/Downloads/bunny.obj"),
|
||||
Arc::new(PhongMaterial {
|
||||
|
|
@ -68,19 +68,17 @@ fn simple_scene(bencher: &mut Criterion) {
|
|||
.unwrap(),
|
||||
)),
|
||||
],
|
||||
});
|
||||
};
|
||||
|
||||
bencher.bench_function("simple_scene", move |b| {
|
||||
let scene = Arc::clone(&scene);
|
||||
b.iter(move || {
|
||||
let scene = Arc::clone(&scene);
|
||||
bencher.bench_function("simple_scene", |b| {
|
||||
b.iter(|| {
|
||||
let tile = Tile {
|
||||
start_column: 0,
|
||||
end_column: image_width,
|
||||
start_row: 0,
|
||||
end_row: image_height,
|
||||
};
|
||||
partial_render_scene(scene, tile, image_height, image_width);
|
||||
partial_render_scene(&scene, tile, image_height, image_width);
|
||||
})
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,8 +10,6 @@ use super::util::Tile;
|
|||
|
||||
use crate::Real;
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
struct ImageSampler<T: Real> {
|
||||
image_height_pixels: usize,
|
||||
image_width_pixels: usize,
|
||||
|
|
@ -70,7 +68,7 @@ impl<T: Real> ImageSampler<T> {
|
|||
const RECURSION_LIMIT: u16 = 32;
|
||||
|
||||
pub fn partial_render_scene<T: Real>(
|
||||
scene: Arc<Scene<T>>,
|
||||
scene: &Scene<T>,
|
||||
tile: Tile,
|
||||
height: usize,
|
||||
width: usize,
|
||||
|
|
|
|||
25
src/main.rs
25
src/main.rs
|
|
@ -11,8 +11,7 @@ use std::time::Duration;
|
|||
use nalgebra::{Point3, Vector3};
|
||||
|
||||
use std::path::Path;
|
||||
use std::sync::mpsc;
|
||||
use std::sync::Arc;
|
||||
use std::sync::{mpsc, Arc};
|
||||
|
||||
use vanrijn::camera::partial_render_scene;
|
||||
use vanrijn::colour::{ColourRgbF, NamedColour};
|
||||
|
|
@ -68,18 +67,18 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
image_height as u32,
|
||||
)?;
|
||||
|
||||
let scene = Arc::new(Scene {
|
||||
let scene = Scene {
|
||||
camera_location: Point3::new(-2.0, 1.0, -5.0),
|
||||
objects: vec![
|
||||
Arc::new(Plane::new(
|
||||
Box::new(Plane::new(
|
||||
Vector3::new(0.0, 1.0, 0.0),
|
||||
-2.0,
|
||||
Arc::new(LambertianMaterial {
|
||||
colour: ColourRgbF::new(0.55, 0.27, 0.04),
|
||||
diffuse_strength: 0.1,
|
||||
}),
|
||||
)) as Arc<dyn Primitive<f64>>,
|
||||
Arc::new(Sphere::new(
|
||||
)) as Box<dyn Primitive<f64>>,
|
||||
Box::new(Sphere::new(
|
||||
Point3::new(-6.25, -0.5, 1.0),
|
||||
1.0,
|
||||
Arc::new(LambertianMaterial {
|
||||
|
|
@ -87,7 +86,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
diffuse_strength: 0.1,
|
||||
}),
|
||||
)),
|
||||
Arc::new(Sphere::new(
|
||||
Box::new(Sphere::new(
|
||||
Point3::new(-4.25, -0.5, 2.0),
|
||||
1.0,
|
||||
Arc::new(ReflectiveMaterial {
|
||||
|
|
@ -96,7 +95,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
reflection_strength: 0.99,
|
||||
}),
|
||||
)),
|
||||
Arc::new(Sphere::new(
|
||||
Box::new(Sphere::new(
|
||||
Point3::new(-5.0, 1.5, 1.0),
|
||||
1.0,
|
||||
Arc::new(PhongMaterial {
|
||||
|
|
@ -106,7 +105,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
specular_strength: 1.0,
|
||||
}),
|
||||
)),
|
||||
Arc::new(BoundingVolumeHierarchy::build(
|
||||
Box::new(BoundingVolumeHierarchy::build(
|
||||
&load_obj(
|
||||
Path::new("/home/matthew/Downloads/bunny.obj"),
|
||||
Arc::new(ReflectiveMaterial {
|
||||
|
|
@ -118,21 +117,19 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
.unwrap(),
|
||||
)),
|
||||
],
|
||||
});
|
||||
};
|
||||
|
||||
let mut event_pump = sdl_context.event_pump()?;
|
||||
|
||||
let (tile_tx, tile_rx) = mpsc::channel();
|
||||
let mut tile_rx = Some(tile_rx);
|
||||
|
||||
let worker_boss = std::thread::spawn(move || {
|
||||
let worker_boss = std::thread::spawn(move|| {
|
||||
TileIterator::new(image_width as usize, image_height as usize, 32)
|
||||
.map(move |tile| (tile, tile_tx.clone()))
|
||||
.par_bridge()
|
||||
.try_for_each(|(tile, tx)| {
|
||||
let scene_ptr = scene.clone();
|
||||
let rendered_tile =
|
||||
partial_render_scene(scene_ptr, tile, image_height, image_width);
|
||||
let rendered_tile = partial_render_scene(&scene, tile, image_height, image_width);
|
||||
|
||||
// There's nothing we can do if this fails, and we're already
|
||||
// at the end of the function anyway, so just ignore result.
|
||||
|
|
|
|||
|
|
@ -3,9 +3,7 @@ use nalgebra::{Point3};
|
|||
use crate::raycasting::Primitive;
|
||||
use crate::Real;
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
pub struct Scene<T: Real> {
|
||||
pub camera_location: Point3<T>,
|
||||
pub objects: Vec<Arc<dyn Primitive<T>>>,
|
||||
pub objects: Vec<Box<dyn Primitive<T>>>,
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue