Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,12 @@ public void run() {
getRenderer().sceneReset(this, reason, resetCount);
getPreviewRenderer().sceneReset(this, reason, resetCount);

// Reset sps rolling average
spp_history.clear();
spp_history_times.clear();
spp_history.addLast(0);
spp_history_times.addLast(0.0);

// Select the correct renderer
Renderer render = mode == RenderMode.PREVIEW ? getPreviewRenderer() : getRenderer();

Expand Down Expand Up @@ -370,6 +376,10 @@ private void updateRenderState(Scene scene) {
}
}

private static final int SPS_AVERAGE_TIME = 30;
private LinkedList<Integer> spp_history = new LinkedList<Integer>();
private LinkedList<Double> spp_history_times = new LinkedList<Double>();

/**
* @return the current rendering speed in samples per second (SPS)
*/
Expand All @@ -378,7 +388,10 @@ private int samplesPerSecond() {
int canvasHeight = bufferedScene.canvasHeight();
long pixelsPerFrame = (long) canvasWidth * canvasHeight;
double renderTime = bufferedScene.renderTime / 1000.0;
return (int) ((bufferedScene.spp * pixelsPerFrame) / renderTime);

double timeDiff = renderTime - spp_history_times.getFirst();
int sppDiff = bufferedScene.spp - spp_history.getFirst();
return (int) (sppDiff * pixelsPerFrame / timeDiff);
}

private void updateRenderProgress() {
Expand All @@ -398,6 +411,15 @@ private void updateRenderProgress() {
}

synchronized (this) {
// Update list of spp values
spp_history_times.addLast(renderTime);
spp_history.addLast(bufferedScene.spp);
// These lists shouldn't contain information older than SPS_AVERAGE_TIME, but must contain at least one old value
while ((spp_history_times.getFirst() + SPS_AVERAGE_TIME < renderTime) && (spp_history_times.size() > 2)) {
spp_history_times.removeFirst();
spp_history.removeFirst();
}

// Update render status display.
renderStatusListeners.forEach(listener -> {
listener.setRenderTime(bufferedScene.renderTime);
Expand Down