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
diff options
context:
space:
mode:
authorLukas Stockner <lukas.stockner@freenet.de>2016-11-26 06:22:34 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2016-12-03 07:02:21 +0300
commita2ebc5268f2b98ee7335e0054c177c849a45cfba (patch)
treef1c08ab691cc93b08df0a387b037d1e0a45e9a53 /intern/cycles/util/util_progress.h
parent35d490b3f13c75e9a62cb30f3842ed38a27f6dbc (diff)
Cycles: Refactor Progress system to provide better estimates
The Progress system in Cycles had two limitations so far: - It just counted tiles, but ignored their size. For example, when rendering a 600x500 image with 512x512 tiles, the right 88x500 tile would count for 50% of the progress, although it only covers 15% of the image. - Scene update time was incorrectly counted as rendering time - therefore, the remaining time started very long and gradually decreased. This patch fixes both problems: First of all, the Progress now has a function to ignore time spans, and that is used to ignore scene update time. The larger change is the tile size: Instead of counting samples per tile, so that the final value is num_samples*num_tiles, the code now counts every sample for every pixel, so that the final value is num_samples*num_pixels. Along with that, some unused variables were removed from the Progress and Session classes. Reviewers: brecht, sergey, #cycles Subscribers: brecht, candreacchio, sergey Differential Revision: https://developer.blender.org/D2214
Diffstat (limited to 'intern/cycles/util/util_progress.h')
-rw-r--r--intern/cycles/util/util_progress.h123
1 files changed, 73 insertions, 50 deletions
diff --git a/intern/cycles/util/util_progress.h b/intern/cycles/util/util_progress.h
index 4ae1d61dd17..14215056840 100644
--- a/intern/cycles/util/util_progress.h
+++ b/intern/cycles/util/util_progress.h
@@ -34,12 +34,12 @@ class Progress {
public:
Progress()
{
- tile = 0;
- sample = 0;
+ pixel_samples = 0;
+ total_pixel_samples = 0;
+ current_tile_sample = 0;
+ finished_tiles = 0;
start_time = time_dt();
- total_time = 0.0;
- render_time = 0.0;
- tile_time = 0.0;
+ render_start_time = time_dt();
status = "Initializing";
substatus = "";
sync_status = "";
@@ -62,22 +62,22 @@ public:
thread_scoped_lock lock(progress.progress_mutex);
progress.get_status(status, substatus);
- progress.get_tile(tile, total_time, render_time, tile_time);
- sample = progress.get_sample();
+ pixel_samples = progress.pixel_samples;
+ total_pixel_samples = progress.total_pixel_samples;
+ current_tile_sample = progress.get_current_sample();
return *this;
}
void reset()
{
- tile = 0;
- sample = 0;
+ pixel_samples = 0;
+ total_pixel_samples = 0;
+ current_tile_sample = 0;
+ finished_tiles = 0;
start_time = time_dt();
render_start_time = time_dt();
- total_time = 0.0;
- render_time = 0.0;
- tile_time = 0.0;
status = "Initializing";
substatus = "";
sync_status = "";
@@ -139,69 +139,93 @@ public:
/* tile and timing information */
- void set_start_time(double start_time_)
+ void set_start_time()
{
thread_scoped_lock lock(progress_mutex);
- start_time = start_time_;
+ start_time = time_dt();
}
- void set_render_start_time(double render_start_time_)
+ void set_render_start_time()
{
thread_scoped_lock lock(progress_mutex);
- render_start_time = render_start_time_;
+ render_start_time = time_dt();
}
- void set_tile(int tile_, double tile_time_)
+ void add_skip_time(const scoped_timer &start_timer, bool only_render)
{
- thread_scoped_lock lock(progress_mutex);
+ double skip_time = time_dt() - start_timer.get_start();
- tile = tile_;
- total_time = time_dt() - start_time;
- render_time = time_dt() - render_start_time;
- tile_time = tile_time_;
+ render_start_time += skip_time;
+ if(!only_render) {
+ start_time += skip_time;
+ }
}
- void get_tile(int& tile_, double& total_time_, double& render_time_, double& tile_time_)
+ void get_time(double& total_time_, double& render_time_)
{
thread_scoped_lock lock(progress_mutex);
- tile_ = tile;
- total_time_ = (total_time > 0.0)? total_time: 0.0;
- render_time_ = (render_time > 0.0)? render_time: 0.0;
- tile_time_ = tile_time;
+ total_time_ = time_dt() - start_time;
+ render_time_ = time_dt() - render_start_time;
}
- void get_time(double& total_time_, double& render_time_)
+ void reset_sample()
{
- total_time_ = (total_time > 0.0)? total_time: 0.0;
- render_time_ = (render_time > 0.0)? render_time: 0.0;
+ thread_scoped_lock lock(progress_mutex);
+
+ pixel_samples = 0;
+ current_tile_sample = 0;
+ finished_tiles = 0;
}
- void reset_sample()
+ void set_total_pixel_samples(uint64_t total_pixel_samples_)
{
thread_scoped_lock lock(progress_mutex);
- sample = 0;
+ total_pixel_samples = total_pixel_samples_;
}
- void increment_sample()
+ float get_progress()
+ {
+ if(total_pixel_samples > 0) {
+ return ((float) pixel_samples) / total_pixel_samples;
+ }
+ return 0.0f;
+ }
+
+ void add_samples(uint64_t pixel_samples_, int tile_sample)
{
thread_scoped_lock lock(progress_mutex);
- sample++;
+ pixel_samples += pixel_samples_;
+ current_tile_sample = tile_sample;
}
- void increment_sample_update()
+ void add_samples_update(uint64_t pixel_samples_, int tile_sample)
{
- increment_sample();
+ add_samples(pixel_samples_, tile_sample);
set_update();
}
- int get_sample()
+ void add_finished_tile()
+ {
+ thread_scoped_lock lock(progress_mutex);
+
+ finished_tiles++;
+ }
+
+ int get_current_sample()
+ {
+ /* Note that the value here always belongs to the last tile that updated,
+ * so it's only useful if there is only one active tile. */
+ return current_tile_sample;
+ }
+
+ int get_finished_tiles()
{
- return sample;
+ return finished_tiles;
}
/* status messages */
@@ -212,8 +236,6 @@ public:
thread_scoped_lock lock(progress_mutex);
status = status_;
substatus = substatus_;
- total_time = time_dt() - start_time;
- render_time = time_dt() - render_start_time;
}
set_update();
@@ -224,8 +246,6 @@ public:
{
thread_scoped_lock lock(progress_mutex);
substatus = substatus_;
- total_time = time_dt() - start_time;
- render_time = time_dt() - render_start_time;
}
set_update();
@@ -237,8 +257,6 @@ public:
thread_scoped_lock lock(progress_mutex);
sync_status = status_;
sync_substatus = substatus_;
- total_time = time_dt() - start_time;
- render_time = time_dt() - render_start_time;
}
set_update();
@@ -250,8 +268,6 @@ public:
{
thread_scoped_lock lock(progress_mutex);
sync_substatus = substatus_;
- total_time = time_dt() - start_time;
- render_time = time_dt() - render_start_time;
}
set_update();
@@ -292,12 +308,19 @@ protected:
function<void(void)> update_cb;
function<void(void)> cancel_cb;
- int tile; /* counter for rendered tiles */
- int sample; /* counter of rendered samples, global for all tiles */
+ /* pixel_samples counts how many samples have been rendered over all pixel, not just per pixel.
+ * This makes the progress estimate more accurate when tiles with different sizes are used.
+ *
+ * total_pixel_samples is the total amount of pixel samples that will be rendered. */
+ uint64_t pixel_samples, total_pixel_samples;
+ /* Stores the current sample count of the last tile that called the update function.
+ * It's used to display the sample count if only one tile is active. */
+ int current_tile_sample;
+ /* Stores the number of tiles that's already finished.
+ * Used to determine whether all but the last tile are finished rendering, in which case the current_tile_sample is displayed. */
+ int finished_tiles;
double start_time, render_start_time;
- double total_time, render_time;
- double tile_time;
string status;
string substatus;