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();