Cycles: update buffers only once in a while when progressive refine is used

It'll mimic the same behavior as regular tile rendering update and it should
give pretty noticeable boost on simpler scenes.
This commit is contained in:
Sergey Sharybin 2012-10-23 17:24:23 +00:00
parent a32d134dc7
commit 40242c2f44
2 changed files with 17 additions and 2 deletions

@ -186,6 +186,7 @@ void Session::run_gpu()
start_time = time_dt();
reset_time = time_dt();
paused_time = 0.0;
last_update_time = time_dt();
if(!params.background)
progress.set_start_time(start_time + paused_time);
@ -447,6 +448,8 @@ void Session::run_cpu()
{
bool tiles_written = false;
last_update_time = time_dt();
{
/* reset once to start */
thread_scoped_lock reset_lock(delayed_reset.mutex);
@ -807,6 +810,15 @@ void Session::tonemap()
bool Session::update_progressive_refine(bool cancel)
{
int sample = tile_manager.state.sample + 1;
bool write = sample == params.samples || cancel;
double current_time = time_dt();
if (current_time - last_update_time < 1.0f) {
/* if last sample was processed, we need to write buffers anyway */
if (!write)
return false;
}
if(params.progressive_refine) {
foreach(RenderBuffers *buffers, tile_buffers) {
@ -814,14 +826,16 @@ bool Session::update_progressive_refine(bool cancel)
rtile.buffers = buffers;
rtile.sample = sample;
if(rtile.sample == params.samples || cancel)
if(write)
write_render_tile_cb(rtile);
else
update_render_tile_cb(rtile);
}
}
return sample == params.samples;
last_update_time = current_time;
return write;
}
CCL_NAMESPACE_END

@ -179,6 +179,7 @@ protected:
double paused_time;
/* progressive refine */
double last_update_time;
bool update_progressive_refine(bool cancel);
vector<RenderBuffers *> tile_buffers;