diff --git a/src/bin/rec.rs b/src/bin/rec.rs
index 8cdc50f..c288f86 100644
--- a/src/bin/rec.rs
+++ b/src/bin/rec.rs
@@ -1,7 +1,7 @@
use std::env::args;
use std::error::Error;
use std::io::{stdout, Write};
-use std::path::PathBuf;
+use std::path::{Path, PathBuf};
use std::sync::Arc;
use std::{fs, io};
@@ -50,26 +50,35 @@ fn main() {
}
let n_threads = std::thread::available_parallelism().map(|n| n.get()).unwrap_or(2);
+ let (img_sender, img_receiver) = async_channel::bounded::(2 * n_threads);
std::thread::scope(|s| {
- let (img_sender, img_receiver) = async_channel::bounded::<(u32, Arc)>(2 * n_threads);
for _ in 0..n_threads {
- let img_receiver = img_receiver.clone();
- let path = &path;
- s.spawn(move || {
- while let Ok((frame, buffer)) = img_receiver.recv_blocking() {
- let img = image::RgbaImage::from_raw(SIZE.x, SIZE.y, buffer.slice(..).get_mapped_range().to_vec())
- .expect("read failure!");
- let img: image::RgbImage = img.convert();
- img.save(path.join(&format!("frame{frame:06}.webp")))
- .expect("save failure!");
- }
- });
+ start_saver(s, &path, &img_receiver);
}
do_work(img_sender, start_frame, stop_frame);
});
}
-fn do_work(img_sender: async_channel::Sender<(u32, Arc)>, start_frame: u32, stop_frame: u32) {
+type Frame = (u32, Arc);
+
+fn start_saver<'a>(
+ scope: &'a std::thread::Scope<'a, '_>,
+ path: &'a Path,
+ img_receiver: &'a async_channel::Receiver,
+) {
+ scope.spawn(move || {
+ while let Ok((frame, buffer)) = img_receiver.recv_blocking() {
+ let img = image::RgbaImage::from_raw(SIZE.x, SIZE.y, buffer.slice(..).get_mapped_range().to_vec())
+ .expect("read failure!");
+ let img: image::RgbImage = img.convert();
+ img.save(path.join(&format!("frame{frame:06}.webp")))
+ .expect("save failure!");
+ }
+ });
+}
+
+fn do_work(img_sender: async_channel::Sender, start_frame: u32, stop_frame: u32) {
+ println!("Loading...");
let img_sender = Arc::new(img_sender);
let (device, queue) = pollster::block_on(init_gpu()).unwrap();