rtiow: using println and compute ETA in progress.

This commit is contained in:
Bill Thiede 2023-01-19 21:19:05 -08:00
parent 585ad4805c
commit 1d8aff7905

View File

@ -7,7 +7,8 @@ use std::{
mpsc::{sync_channel, Receiver, SyncSender}, mpsc::{sync_channel, Receiver, SyncSender},
Arc, Mutex, Arc, Mutex,
}, },
thread, time, thread,
time::{self, Instant},
}; };
use core_affinity; use core_affinity;
@ -398,6 +399,7 @@ impl AddAssign for RenderStats {
} }
fn progress( fn progress(
start_time: Instant,
last_stat: &RenderStats, last_stat: &RenderStats,
current_stat: &RenderStats, current_stat: &RenderStats,
time_diff: time::Duration, time_diff: time::Duration,
@ -406,13 +408,18 @@ fn progress(
let human = human::Formatter::new(); let human = human::Formatter::new();
let pixel_diff = current_stat.pixels - last_stat.pixels; let pixel_diff = current_stat.pixels - last_stat.pixels;
let ray_diff = current_stat.rays - last_stat.rays; let ray_diff = current_stat.rays - last_stat.rays;
let now = time::Instant::now();
let start_diff = now - start_time;
let percent = 100. * current_stat.pixels as f32 / pixel_total as f32;
let eta = 100. * start_diff.as_secs_f32() / percent;
format!( format!(
"{:7} / {:7}pixels ({:2}%) {:7}pixels/s {:7}rays/s", "{:7} / {:7}pixels ({:2.0}%) {:7}pixels/s {:7}rays/s eta {:.0}s",
human.format(current_stat.pixels as f64), human.format(current_stat.pixels as f64),
human.format(pixel_total as f64), human.format(pixel_total as f64),
100 * current_stat.pixels / pixel_total, percent,
human.format(pixel_diff as f64 / time_diff.as_secs_f64()), human.format(pixel_diff as f64 / time_diff.as_secs_f64()),
human.format(ray_diff as f64 / time_diff.as_secs_f64()) human.format(ray_diff as f64 / time_diff.as_secs_f64()),
eta
) )
} }
@ -580,7 +587,6 @@ pub fn render(scene: Scene, output_dir: &Path) -> std::result::Result<(), std::i
drop(pixel_req_rx); drop(pixel_req_rx);
drop(pixel_resp_tx); drop(pixel_resp_tx);
let start_time = time::Instant::now();
let (w, h) = (scene.width, scene.height); let (w, h) = (scene.width, scene.height);
handles.push(thread::spawn(move || { handles.push(thread::spawn(move || {
let batch_line_requests = false; let batch_line_requests = false;
@ -608,6 +614,7 @@ pub fn render(scene: Scene, output_dir: &Path) -> std::result::Result<(), std::i
let mut last_time = time::Instant::now(); let mut last_time = time::Instant::now();
let mut last_stat: RenderStats = Default::default(); let mut last_stat: RenderStats = Default::default();
let mut current_stat: RenderStats = Default::default(); let mut current_stat: RenderStats = Default::default();
let start_time = time::Instant::now();
for resp in pixel_resp_rx { for resp in pixel_resp_rx {
match resp { match resp {
Response::Pixel { x, y, pixel, rs } => { Response::Pixel { x, y, pixel, rs } => {
@ -625,9 +632,15 @@ pub fn render(scene: Scene, output_dir: &Path) -> std::result::Result<(), std::i
let now = time::Instant::now(); let now = time::Instant::now();
let time_diff = now - last_time; let time_diff = now - last_time;
if time_diff > time::Duration::from_secs(1) { if time_diff > time::Duration::from_secs(1) {
info!( println!(
"{}", "{}",
progress(&last_stat, &current_stat, time_diff, pixel_total) progress(
start_time,
&last_stat,
&current_stat,
time_diff,
pixel_total
)
); );
last_stat = current_stat; last_stat = current_stat;
last_time = now; last_time = now;
@ -637,10 +650,16 @@ pub fn render(scene: Scene, output_dir: &Path) -> std::result::Result<(), std::i
thr.join().expect("thread join"); thr.join().expect("thread join");
} }
let time_diff = time::Instant::now() - start_time; let time_diff = time::Instant::now() - start_time;
info!( println!(
"Runtime {} seconds {}", "Runtime {} seconds {}",
time_diff.as_secs_f32(), time_diff.as_secs_f32(),
progress(&Default::default(), &current_stat, time_diff, pixel_total) progress(
start_time,
&Default::default(),
&current_stat,
time_diff,
pixel_total
)
); );
output::write_images(&scene, time_diff, output_dir) output::write_images(&scene, time_diff, output_dir)