Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix stuttering FPS and ETA on progress bar #684

Merged
merged 1 commit into from
Nov 16, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 47 additions & 23 deletions av1an-core/src/progress_bar.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
use std::fmt::Write;
use std::time::Duration;

use indicatif::{
HumanBytes, MultiProgress, ProgressBar, ProgressDrawTarget, ProgressState, ProgressStyle,
HumanBytes, HumanDuration, MultiProgress, ProgressBar, ProgressDrawTarget, ProgressState,
ProgressStyle,
};
use once_cell::sync::OnceCell;

Expand All @@ -13,9 +15,9 @@ const PROGRESS_CHARS: &str = "█▉▊▋▌▍▎▏ ";
const INDICATIF_PROGRESS_TEMPLATE: &str = if cfg!(windows) {
// Do not use a spinner on Windows since the default console cannot display
// the characters used for the spinner
"{elapsed_precise:.bold} ▕{wide_bar:.blue/white.dim}▏ {percent:.bold} {pos} ({fps:.bold}, eta {eta}{msg})"
"{elapsed_precise:.bold} ▕{wide_bar:.blue/white.dim}▏ {percent:.bold} {pos} ({fps:.bold}, eta {fixed_eta}{msg})"
} else {
"{spinner:.green.bold} {elapsed_precise:.bold} ▕{wide_bar:.blue/white.dim}▏ {percent:.bold} {pos} ({fps:.bold}, eta {eta}{msg})"
"{spinner:.green.bold} {elapsed_precise:.bold} ▕{wide_bar:.blue/white.dim}▏ {percent:.bold} {pos} ({fps:.bold}, eta {fixed_eta}{msg})"
};

const INDICATIF_SPINNER_TEMPLATE: &str = if cfg!(windows) {
Expand All @@ -36,14 +38,32 @@ fn pretty_progress_style() -> ProgressStyle {
ProgressStyle::default_bar()
.template(INDICATIF_PROGRESS_TEMPLATE)
.unwrap()
.with_key(
"fps",
|state: &ProgressState, w: &mut dyn Write| match state.per_sec() {
fps if fps.abs() < f64::EPSILON => write!(w, "0 fps").unwrap(),
fps if fps < 1.0 => write!(w, "{:.2} s/fr", 1.0 / fps).unwrap(),
fps => write!(w, "{:.2} fps", fps).unwrap(),
},
)
.with_key("fps", |state: &ProgressState, w: &mut dyn Write| {
if state.pos() == 0 || state.elapsed().as_secs_f32() < f32::EPSILON {
write!(w, "0 fps").unwrap();
} else {
let fps = state.pos() as f32 / state.elapsed().as_secs_f32();
if fps < 1.0 {
write!(w, "{:.2} s/fr", 1.0 / fps).unwrap();
} else {
write!(w, "{:.2} fps", fps).unwrap();
}
}
})
.with_key("fixed_eta", |state: &ProgressState, w: &mut dyn Write| {
if state.pos() == 0 || state.elapsed().as_secs_f32() < f32::EPSILON {
write!(w, "unknown").unwrap();
} else {
let spf = state.elapsed().as_secs_f32() / state.pos() as f32;
let remaining = state.len().unwrap_or(0) - state.pos();
write!(
w,
"{:#}",
HumanDuration(Duration::from_secs_f32(spf * remaining as f32))
)
.unwrap();
}
})
.with_key("pos", |state: &ProgressState, w: &mut dyn Write| {
write!(w, "{}/{}", state.pos(), state.len().unwrap_or(0)).unwrap();
})
Expand All @@ -57,14 +77,18 @@ fn spinner_style() -> ProgressStyle {
ProgressStyle::default_spinner()
.template(INDICATIF_SPINNER_TEMPLATE)
.unwrap()
.with_key(
"fps",
|state: &ProgressState, w: &mut dyn Write| match state.per_sec() {
fps if fps.abs() < f64::EPSILON => write!(w, "0 fps").unwrap(),
fps if fps < 1.0 => write!(w, "{:.2} s/fr", 1.0 / fps).unwrap(),
fps => write!(w, "{:.2} fps", fps).unwrap(),
},
)
.with_key("fps", |state: &ProgressState, w: &mut dyn Write| {
if state.pos() == 0 || state.elapsed().as_secs_f32() < f32::EPSILON {
write!(w, "0 fps").unwrap();
} else {
let fps = state.pos() as f32 / state.elapsed().as_secs_f32();
if fps < 1.0 {
write!(w, "{:.2} s/fr", 1.0 / fps).unwrap();
} else {
write!(w, "{:.2} fps", fps).unwrap();
}
}
})
.with_key("pos", |state: &ProgressState, w: &mut dyn Write| {
write!(w, "{}", state.pos()).unwrap();
})
Expand All @@ -81,8 +105,8 @@ pub fn init_progress_bar(len: u64) {
// Affects scenechange progress.
PROGRESS_BAR.get_or_init(|| ProgressBar::new(len).with_style(spinner_style()))
};
pb.set_draw_target(ProgressDrawTarget::stderr_with_hz(60));
// pb.enable_steady_tick(Duration::from_millis(100));
pb.set_draw_target(ProgressDrawTarget::stderr());
pb.enable_steady_tick(Duration::from_millis(100));
pb.reset();
pb.reset_eta();
pb.reset_elapsed();
Expand Down Expand Up @@ -186,15 +210,15 @@ pub fn init_multi_progress_bar(len: u64, workers: usize, total_chunks: usize) {

let pb = ProgressBar::hidden();
pb.set_style(pretty_progress_style());
// pb.enable_steady_tick(Duration::from_millis(100));
pb.enable_steady_tick(Duration::from_millis(100));
pb.reset_elapsed();
pb.reset_eta();
pb.set_position(0);
pb.set_length(len);
pb.reset();
pbs.push(mpb.add(pb));

mpb.set_draw_target(ProgressDrawTarget::stderr_with_hz(60));
mpb.set_draw_target(ProgressDrawTarget::stderr());

(mpb, pbs)
});
Expand Down