Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorSergey Sharybin <sergey@blender.org>2021-11-18 13:25:39 +0300
committerSergey Sharybin <sergey@blender.org>2021-11-18 16:27:45 +0300
commit3ad2bf1327cac5f036d763e1cc690b1b2da8e1c4 (patch)
tree41946b1f3c1af434266e73f462247f0057ee6703 /intern
parentbd2e3bb7bd06bcbb2134e4853a72ab28f5f332b9 (diff)
Cycles: Fix command line render overshooting time limit
The calculation based on preserving device occupancy was conflicting with the fact that time limit needs to render less samples at the last round of render work. For example, rendering BMW27 for 30sec on i9-11900k was actually rendering for almost a minute. Now the render time limit is respected much more close. Differential Revision: https://developer.blender.org/D13269
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/integrator/render_scheduler.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/intern/cycles/integrator/render_scheduler.cpp b/intern/cycles/integrator/render_scheduler.cpp
index f776d01ef67..276453f7aec 100644
--- a/intern/cycles/integrator/render_scheduler.cpp
+++ b/intern/cycles/integrator/render_scheduler.cpp
@@ -827,6 +827,26 @@ int RenderScheduler::get_num_samples_to_path_trace() const
num_samples_to_occupy = lround(state_.occupancy_num_samples * 0.7f / state_.occupancy);
}
+ /* When time limit is used clamp the calculated number of samples to keep occupancy.
+ * This is because time limit causes the last render iteration to happen with less number of
+ * samples, which conflicts with the occupancy (lower number of samples causes lower
+ * occupancy, also the calculation is based on number of previously rendered samples).
+ *
+ * When time limit is not used the number of samples per render iteration is either increasing
+ * or stays the same, so there is no need to clamp number of samples calculated for occupancy.
+ */
+ if (time_limit_ && state_.start_render_time) {
+ const double remaining_render_time = max(
+ 0.0, time_limit_ - (time_dt() - state_.start_render_time));
+ const double time_per_sample_average = path_trace_time_.get_average();
+ const double predicted_render_time = num_samples_to_occupy * time_per_sample_average;
+
+ if (predicted_render_time > remaining_render_time) {
+ num_samples_to_occupy = lround(num_samples_to_occupy *
+ (remaining_render_time / predicted_render_time));
+ }
+ }
+
num_samples_to_render = max(num_samples_to_render,
min(num_samples_to_occupy, max_num_samples_to_render));
}