[Bf-blender-cvs] [5247ebc36bb] cycles-x: Cycles X: Improve average time report in the log

Sergey Sharybin noreply at git.blender.org
Mon Jul 12 15:00:10 CEST 2021


Commit: 5247ebc36bb54871e82ebc705e3df43385e5922f
Author: Sergey Sharybin
Date:   Mon Jul 12 12:50:08 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB5247ebc36bb54871e82ebc705e3df43385e5922f

Cycles X: Improve average time report in the log

Don't count non-finial resolution divider in the average as it is not
accurate.
The wall time is still counted.

===================================================================

M	intern/cycles/integrator/render_scheduler.cpp
M	intern/cycles/integrator/render_scheduler.h

===================================================================

diff --git a/intern/cycles/integrator/render_scheduler.cpp b/intern/cycles/integrator/render_scheduler.cpp
index e9586075a5b..17c90a789a9 100644
--- a/intern/cycles/integrator/render_scheduler.cpp
+++ b/intern/cycles/integrator/render_scheduler.cpp
@@ -287,6 +287,10 @@ void RenderScheduler::report_path_trace_time(const RenderWork &render_work,
                                                render_work.path_trace.num_samples;
   }
 
+  if (work_report_reset_average(render_work)) {
+    path_trace_time_.reset_average();
+  }
+
   path_trace_time_.add_average(final_time_approx, render_work.path_trace.num_samples);
 
   VLOG(4) << "Average path tracing time: " << path_trace_time_.get_average() << " seconds.";
@@ -304,6 +308,10 @@ void RenderScheduler::report_adaptive_filter_time(const RenderWork &render_work,
 
   const double final_time_approx = approximate_final_time(render_work, time);
 
+  if (work_report_reset_average(render_work)) {
+    adaptive_filter_time_.reset_average();
+  }
+
   adaptive_filter_time_.add_average(final_time_approx, render_work.path_trace.num_samples);
 
   VLOG(4) << "Average adaptive sampling filter  time: " << adaptive_filter_time_.get_average()
@@ -320,6 +328,10 @@ void RenderScheduler::report_denoise_time(const RenderWork &render_work, double
     first_render_time_.denoise_time = final_time_approx;
   }
 
+  if (work_report_reset_average(render_work)) {
+    denoise_time_.reset_average();
+  }
+
   denoise_time_.add_average(final_time_approx);
 
   VLOG(4) << "Average denoising time: " << denoise_time_.get_average() << " seconds.";
@@ -335,6 +347,10 @@ void RenderScheduler::report_display_update_time(const RenderWork &render_work,
     first_render_time_.display_update_time = final_time_approx;
   }
 
+  if (work_report_reset_average(render_work)) {
+    display_update_time_.reset_average();
+  }
+
   display_update_time_.add_average(final_time_approx);
 
   VLOG(4) << "Average display update time: " << display_update_time_.get_average() << " seconds.";
@@ -815,6 +831,16 @@ bool RenderScheduler::work_is_usable_for_first_render_estimation(const RenderWor
          render_work.path_trace.start_sample == start_sample_;
 }
 
+bool RenderScheduler::work_report_reset_average(const RenderWork &render_work)
+{
+  /* When rendering at a non-final resolution divider time average is not very useful because it
+   * will either bias average down (due to lower render times on the smaller images) or will give
+   * incorrect result when trying to estimate time which would have spent on the final resolution.
+   *
+   * So we only accumulate average for the latest resolution divider which was rendered. */
+  return render_work.resolution_divider != pixel_size_;
+}
+
 void RenderScheduler::set_start_render_time_if_needed()
 {
   /* Start counting render time when rendering sampels at their final resolution. */
diff --git a/intern/cycles/integrator/render_scheduler.h b/intern/cycles/integrator/render_scheduler.h
index 8551c806ec6..097a3927e30 100644
--- a/intern/cycles/integrator/render_scheduler.h
+++ b/intern/cycles/integrator/render_scheduler.h
@@ -200,6 +200,9 @@ class RenderScheduler {
    * for the resolution divider calculation. */
   bool work_is_usable_for_first_render_estimation(const RenderWork &render_work);
 
+  /* Check whether timing report about the given work need to reset accumulated average time. */
+  bool work_report_reset_average(const RenderWork &render_work);
+
   void set_start_render_time_if_needed();
 
   /* CHeck whether render time limit has been reached (or exceeded), and if so store related
@@ -248,6 +251,12 @@ class RenderScheduler {
       return average_time_accumulator_ / num_average_times_;
     }
 
+    inline void reset_average()
+    {
+      average_time_accumulator_ = 0.0;
+      num_average_times_ = 0;
+    }
+
    protected:
     double total_wall_time_ = 0.0;



More information about the Bf-blender-cvs mailing list