library: render: split rows in chunks for perf

This commit is contained in:
Antoine Martin 2020-03-19 20:54:20 +01:00 committed by Bruno BELANYI
parent 40c2ae1bc9
commit ce64403449

View file

@ -61,15 +61,20 @@ impl Scene {
Self::pixel Self::pixel
}; };
let mut rows: Vec<_> = image.enumerate_rows_mut().collect();
rayon::scope(|s| { rayon::scope(|s| {
// FIXME(Bruno): it would go even faster to cut the image in blocks of rows, leading to // FIXME(Bruno): it would go even faster to cut the image in blocks of rows, leading to
// better cache-line behaviour... // better cache-line behaviour...
for (_, row) in image.enumerate_rows_mut() { let chunk_size = self.camera.film().height() as usize / rayon::current_num_threads();
// `chunks_size + 1` to have exactly num_threads tasks spawned, even with rounding
for chunk in rows.chunks_mut(chunk_size + 1) {
s.spawn(|_| { s.spawn(|_| {
for (_, row) in chunk {
for (x, y, pixel) in row { for (x, y, pixel) in row {
*pixel = pixel_func(&self, x as f32, y as f32).into(); *pixel = pixel_func(&self, x as f32, y as f32).into();
pb.inc(1); pb.inc(1);
} }
}
}) })
} }
}); });