Cycles: take into account time limit for progress bar

This change allows the Cycles progress report system to take into conderation
the time limit property. This allows for more accuracte progress reports for
high sample count renders with short time limits.

Contributed by Alaska.

Differential Revision: https://developer.blender.org/D15599
This commit is contained in:
Brecht Van Lommel 2022-08-11 19:35:45 +02:00
parent ef5a44df2d
commit c9d821294f
2 changed files with 21 additions and 4 deletions

View File

@ -495,7 +495,9 @@ void Session::do_delayed_reset()
if (!params.background) {
progress.set_start_time();
}
const double time_limit = params.time_limit * ((double)tile_manager_.get_num_tiles());
progress.set_render_start_time();
progress.set_time_limit(time_limit);
}
void Session::reset(const SessionParams &session_params, const BufferParams &buffer_params)
@ -590,7 +592,8 @@ double Session::get_estimated_remaining_time() const
progress.get_time(total_time, render_time);
double remaining = (1.0 - (double)completed) * (render_time / (double)completed);
const double time_limit = render_scheduler_.get_time_limit();
const double time_limit = render_scheduler_.get_time_limit() *
((double)tile_manager_.get_num_tiles());
if (time_limit != 0.0) {
remaining = min(remaining, max(time_limit - render_time, 0.0));
}

View File

@ -28,6 +28,7 @@ class Progress {
denoised_tiles = 0;
start_time = time_dt();
render_start_time = time_dt();
time_limit = 0.0;
end_time = 0.0;
status = "Initializing";
substatus = "";
@ -68,6 +69,7 @@ class Progress {
denoised_tiles = 0;
start_time = time_dt();
render_start_time = time_dt();
time_limit = 0.0;
end_time = 0.0;
status = "Initializing";
substatus = "";
@ -145,6 +147,13 @@ class Progress {
render_start_time = time_dt();
}
void set_time_limit(double time_limit_)
{
thread_scoped_lock lock(progress_mutex);
time_limit = time_limit_;
}
void add_skip_time(const scoped_timer &start_timer, bool only_render)
{
double skip_time = time_dt() - start_timer.get_start();
@ -191,8 +200,13 @@ class Progress {
{
thread_scoped_lock lock(progress_mutex);
if (total_pixel_samples > 0) {
return ((double)pixel_samples) / (double)total_pixel_samples;
if (pixel_samples > 0) {
double progress_percent = (double)pixel_samples / (double)total_pixel_samples;
if (time_limit != 0.0) {
double time_since_render_start = time_dt() - render_start_time;
progress_percent = max(progress_percent, time_since_render_start / time_limit);
}
return min(1.0, progress_percent);
}
return 0.0;
}
@ -335,7 +349,7 @@ class Progress {
* in which case the current_tile_sample is displayed. */
int rendered_tiles, denoised_tiles;
double start_time, render_start_time;
double start_time, render_start_time, time_limit;
/* End time written when render is done, so it doesn't keep increasing on redraws. */
double end_time;