User can choose how much he willing to spent on each frame (based on pull request from 'Rolf Aretz Lap'
This commit is contained in:
@@ -48,6 +48,7 @@ public class Configuration {
|
|||||||
private int maxUploadingJob;
|
private int maxUploadingJob;
|
||||||
private int nbCores;
|
private int nbCores;
|
||||||
private int maxMemory; // max memory allowed for render
|
private int maxMemory; // max memory allowed for render
|
||||||
|
private int maxRenderTime; // max render time per frame allowed
|
||||||
private int priority;
|
private int priority;
|
||||||
private ComputeType computeMethod;
|
private ComputeType computeMethod;
|
||||||
private GPUDevice GPUDevice;
|
private GPUDevice GPUDevice;
|
||||||
@@ -66,6 +67,7 @@ public class Configuration {
|
|||||||
this.maxUploadingJob = 1;
|
this.maxUploadingJob = 1;
|
||||||
this.nbCores = -1; // ie not set
|
this.nbCores = -1; // ie not set
|
||||||
this.maxMemory = -1; // ie not set
|
this.maxMemory = -1; // ie not set
|
||||||
|
this.maxRenderTime = -1; // ie not set
|
||||||
this.priority = 19; // default lowest
|
this.priority = 19; // default lowest
|
||||||
this.computeMethod = null;
|
this.computeMethod = null;
|
||||||
this.GPUDevice = null;
|
this.GPUDevice = null;
|
||||||
@@ -137,6 +139,14 @@ public class Configuration {
|
|||||||
return this.maxMemory;
|
return this.maxMemory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setMaxRenderTime(int max) {
|
||||||
|
this.maxRenderTime = max;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMaxRenderTime() {
|
||||||
|
return this.maxRenderTime;
|
||||||
|
}
|
||||||
|
|
||||||
public void setUsePriority(int priority) {
|
public void setUsePriority(int priority) {
|
||||||
if (priority > 19)
|
if (priority > 19)
|
||||||
priority = 19;
|
priority = 19;
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ public class Error {
|
|||||||
RENDERER_OUT_OF_MEMORY(21),
|
RENDERER_OUT_OF_MEMORY(21),
|
||||||
RENDERER_KILLED(14),
|
RENDERER_KILLED(14),
|
||||||
RENDERER_KILLED_BY_USER(20),
|
RENDERER_KILLED_BY_USER(20),
|
||||||
|
RENDERER_KILLED_BY_USER_OVER_TIME(23),
|
||||||
RENDERER_KILLED_BY_SERVER(22),
|
RENDERER_KILLED_BY_SERVER(22),
|
||||||
RENDERER_MISSING_LIBRARIES(15),
|
RENDERER_MISSING_LIBRARIES(15),
|
||||||
FAILED_TO_EXECUTE(16),
|
FAILED_TO_EXECUTE(16),
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
import com.sheepit.client.Configuration.ComputeType;
|
import com.sheepit.client.Configuration.ComputeType;
|
||||||
import com.sheepit.client.Error.Type;
|
import com.sheepit.client.Error.Type;
|
||||||
@@ -224,6 +226,7 @@ public class Job {
|
|||||||
public Error.Type render() {
|
public Error.Type render() {
|
||||||
gui.status("Rendering");
|
gui.status("Rendering");
|
||||||
RenderProcess process = getProcessRender();
|
RenderProcess process = getProcessRender();
|
||||||
|
Timer timerOfMaxRenderTime = null;
|
||||||
String core_script = "";
|
String core_script = "";
|
||||||
if (getUseGPU() && config.getGPUDevice() != null && config.getComputeMethod() != ComputeType.CPU) {
|
if (getUseGPU() && config.getGPUDevice() != null && config.getComputeMethod() != ComputeType.CPU) {
|
||||||
core_script = "sheepit_set_compute_device(\"CUDA\", \"GPU\", \"" + config.getGPUDevice().getCudaName() + "\")\n";
|
core_script = "sheepit_set_compute_device(\"CUDA\", \"GPU\", \"" + config.getGPUDevice().getCudaName() + "\")\n";
|
||||||
@@ -306,6 +309,24 @@ public class Job {
|
|||||||
getProcessRender().setProcess(os.exec(command, new_env));
|
getProcessRender().setProcess(os.exec(command, new_env));
|
||||||
BufferedReader input = new BufferedReader(new InputStreamReader(getProcessRender().getProcess().getInputStream()));
|
BufferedReader input = new BufferedReader(new InputStreamReader(getProcessRender().getProcess().getInputStream()));
|
||||||
|
|
||||||
|
if (config.getMaxRenderTime() > 0) {
|
||||||
|
timerOfMaxRenderTime = new Timer();
|
||||||
|
timerOfMaxRenderTime.schedule(new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
RenderProcess process = getProcessRender();
|
||||||
|
if (process != null) {
|
||||||
|
long duration = (new Date().getTime() - process.getStartTime() ) / 1000; // in seconds
|
||||||
|
if (config.getMaxRenderTime() != -1 && duration > config.getMaxRenderTime()) {
|
||||||
|
log.debug("Killing render because process duration");
|
||||||
|
OS.getOS().kill(process.getProcess());
|
||||||
|
setAskForRendererKill(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, config.getMaxRenderTime() * 1000 + 2000); // +2s to be sure the delay is over
|
||||||
|
}
|
||||||
|
|
||||||
long last_update_status = 0;
|
long last_update_status = 0;
|
||||||
log.debug("renderer output");
|
log.debug("renderer output");
|
||||||
try {
|
try {
|
||||||
@@ -354,6 +375,9 @@ public class Job {
|
|||||||
|
|
||||||
int exit_value = process.exitValue();
|
int exit_value = process.exitValue();
|
||||||
process.finish();
|
process.finish();
|
||||||
|
if (timerOfMaxRenderTime != null) {
|
||||||
|
timerOfMaxRenderTime.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
if (script_file != null) {
|
if (script_file != null) {
|
||||||
script_file.delete();
|
script_file.delete();
|
||||||
@@ -372,6 +396,13 @@ public class Job {
|
|||||||
|
|
||||||
if (getAskForRendererKill()) {
|
if (getAskForRendererKill()) {
|
||||||
log.debug("Job::render been asked to end render");
|
log.debug("Job::render been asked to end render");
|
||||||
|
|
||||||
|
long duration = (new Date().getTime() - process.getStartTime() ) / 1000; // in seconds
|
||||||
|
if (config.getMaxRenderTime() != -1 && duration > config.getMaxRenderTime()) {
|
||||||
|
log.debug("Render killed because process duration (" + duration + "s) is over user setting (" + config.getMaxRenderTime() + "s)");
|
||||||
|
return Error.Type.RENDERER_KILLED_BY_USER_OVER_TIME;
|
||||||
|
}
|
||||||
|
|
||||||
if (files.length != 0) {
|
if (files.length != 0) {
|
||||||
new File(files[0].getAbsolutePath()).delete();
|
new File(files[0].getAbsolutePath()).delete();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -297,7 +297,7 @@ public class Server extends Thread implements HostnameVerifier, X509TrustManager
|
|||||||
HttpURLConnection connection = null;
|
HttpURLConnection connection = null;
|
||||||
try {
|
try {
|
||||||
OS os = OS.getOS();
|
OS os = OS.getOS();
|
||||||
String url = String.format("%s?computemethod=%s&cpu_cores=%s&ram_max=%s", this.getPage("request-job"), this.user_config.computeMethodToInt(), ((this.user_config.getNbCores() == -1) ? os.getCPU().cores() : this.user_config.getNbCores()), this.user_config.getMaxMemory());
|
String url = String.format("%s?computemethod=%s&cpu_cores=%s&ram_max=%s&rendertime_max=%s", this.getPage("request-job"), this.user_config.computeMethodToInt(), ((this.user_config.getNbCores() == -1) ? os.getCPU().cores() : this.user_config.getNbCores()), this.user_config.getMaxMemory(), this.user_config.getMaxRenderTime());
|
||||||
if (this.user_config.getComputeMethod() != ComputeType.CPU && this.user_config.getGPUDevice() != null) {
|
if (this.user_config.getComputeMethod() != ComputeType.CPU && this.user_config.getGPUDevice() != null) {
|
||||||
String gpu_model = "";
|
String gpu_model = "";
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ public class SettingsLoader {
|
|||||||
private String gpu;
|
private String gpu;
|
||||||
private String cores;
|
private String cores;
|
||||||
private String ram;
|
private String ram;
|
||||||
|
private String renderTime;
|
||||||
private String cacheDir;
|
private String cacheDir;
|
||||||
private String autoSignIn;
|
private String autoSignIn;
|
||||||
private String ui;
|
private String ui;
|
||||||
@@ -61,7 +62,7 @@ public class SettingsLoader {
|
|||||||
path = path_;
|
path = path_;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SettingsLoader(String login_, String password_, String proxy_, ComputeType computeMethod_, GPUDevice gpu_, int cores_, int maxRam_, String cacheDir_, boolean autoSignIn_, String ui_, String tileSize_, int priority_) {
|
public SettingsLoader(String login_, String password_, String proxy_, ComputeType computeMethod_, GPUDevice gpu_, int cores_, int maxRam_, int maxRenderTime_, String cacheDir_, boolean autoSignIn_, String ui_, String tileSize_, int priority_) {
|
||||||
path = getDefaultFilePath();
|
path = getDefaultFilePath();
|
||||||
login = login_;
|
login = login_;
|
||||||
password = password_;
|
password = password_;
|
||||||
@@ -77,6 +78,9 @@ public class SettingsLoader {
|
|||||||
if (maxRam_ > 0) {
|
if (maxRam_ > 0) {
|
||||||
ram = String.valueOf(maxRam_);
|
ram = String.valueOf(maxRam_);
|
||||||
}
|
}
|
||||||
|
if (maxRenderTime_ > 0) {
|
||||||
|
renderTime = String.valueOf(maxRenderTime_);
|
||||||
|
}
|
||||||
if (computeMethod_ != null) {
|
if (computeMethod_ != null) {
|
||||||
try {
|
try {
|
||||||
computeMethod = computeMethod_.name();
|
computeMethod = computeMethod_.name();
|
||||||
@@ -125,6 +129,10 @@ public class SettingsLoader {
|
|||||||
prop.setProperty("ram", ram);
|
prop.setProperty("ram", ram);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (renderTime != null) {
|
||||||
|
prop.setProperty("rendertime", renderTime);
|
||||||
|
}
|
||||||
|
|
||||||
if (login != null) {
|
if (login != null) {
|
||||||
prop.setProperty("login", login);
|
prop.setProperty("login", login);
|
||||||
}
|
}
|
||||||
@@ -193,6 +201,7 @@ public class SettingsLoader {
|
|||||||
this.tileSize = null;
|
this.tileSize = null;
|
||||||
this.priority = 19; // must be the same default as Configuration
|
this.priority = 19; // must be the same default as Configuration
|
||||||
this.ram = null;
|
this.ram = null;
|
||||||
|
this.renderTime = null;
|
||||||
|
|
||||||
if (new File(path).exists() == false) {
|
if (new File(path).exists() == false) {
|
||||||
return;
|
return;
|
||||||
@@ -224,6 +233,10 @@ public class SettingsLoader {
|
|||||||
this.ram = prop.getProperty("ram");
|
this.ram = prop.getProperty("ram");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (prop.containsKey("rendertime")) {
|
||||||
|
this.renderTime = prop.getProperty("rendertime");
|
||||||
|
}
|
||||||
|
|
||||||
if (prop.containsKey("login")) {
|
if (prop.containsKey("login")) {
|
||||||
this.login = prop.getProperty("login");
|
this.login = prop.getProperty("login");
|
||||||
}
|
}
|
||||||
@@ -315,6 +328,10 @@ public class SettingsLoader {
|
|||||||
config.setMaxMemory(Integer.valueOf(ram));
|
config.setMaxMemory(Integer.valueOf(ram));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config.getMaxRenderTime() == -1 && renderTime != null) {
|
||||||
|
config.setMaxRenderTime(Integer.valueOf(renderTime));
|
||||||
|
}
|
||||||
|
|
||||||
if (config.getUserSpecifiedACacheDir() == false && cacheDir != null && new File(cacheDir).exists()) {
|
if (config.getUserSpecifiedACacheDir() == false && cacheDir != null && new File(cacheDir).exists()) {
|
||||||
config.setCacheDir(new File(cacheDir));
|
config.setCacheDir(new File(cacheDir));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,6 +70,9 @@ public class Worker {
|
|||||||
@Option(name = "-memory", usage = "Maximum memory allow to be used by renderer (in MB)", required = false)
|
@Option(name = "-memory", usage = "Maximum memory allow to be used by renderer (in MB)", required = false)
|
||||||
private int max_ram = -1;
|
private int max_ram = -1;
|
||||||
|
|
||||||
|
@Option(name = "-rendertime", usage = "Maximum time allow for each frame (in minute)", required = false)
|
||||||
|
private int max_rendertime = -1;
|
||||||
|
|
||||||
@Option(name = "--verbose", usage = "Display log", required = false)
|
@Option(name = "--verbose", usage = "Display log", required = false)
|
||||||
private boolean print_log = false;
|
private boolean print_log = false;
|
||||||
|
|
||||||
@@ -205,6 +208,10 @@ public class Worker {
|
|||||||
config.setMaxMemory(max_ram * 1000);
|
config.setMaxMemory(max_ram * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (max_rendertime > 0) {
|
||||||
|
config.setMaxRenderTime(max_rendertime * 60);
|
||||||
|
}
|
||||||
|
|
||||||
if (method != null) {
|
if (method != null) {
|
||||||
try {
|
try {
|
||||||
compute_method = ComputeType.valueOf(method);
|
compute_method = ComputeType.valueOf(method);
|
||||||
|
|||||||
@@ -44,7 +44,10 @@ import javax.swing.JOptionPane;
|
|||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.JPasswordField;
|
import javax.swing.JPasswordField;
|
||||||
import javax.swing.JSlider;
|
import javax.swing.JSlider;
|
||||||
|
import javax.swing.JSpinner;
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
|
import javax.swing.SpinnerNumberModel;
|
||||||
|
|
||||||
import com.sheepit.client.Configuration;
|
import com.sheepit.client.Configuration;
|
||||||
import com.sheepit.client.Configuration.ComputeType;
|
import com.sheepit.client.Configuration.ComputeType;
|
||||||
import com.sheepit.client.SettingsLoader;
|
import com.sheepit.client.SettingsLoader;
|
||||||
@@ -69,6 +72,7 @@ public class Settings implements Activity {
|
|||||||
private List<JCheckBoxGPU> useGPUs;
|
private List<JCheckBoxGPU> useGPUs;
|
||||||
private JSlider cpuCores;
|
private JSlider cpuCores;
|
||||||
private JSlider ram;
|
private JSlider ram;
|
||||||
|
private JSpinner renderTime;
|
||||||
private JSlider priority;
|
private JSlider priority;
|
||||||
private JTextField proxy;
|
private JTextField proxy;
|
||||||
|
|
||||||
@@ -303,7 +307,7 @@ public class Settings implements Activity {
|
|||||||
parent.getContentPane().add(compute_devices_panel, constraints);
|
parent.getContentPane().add(compute_devices_panel, constraints);
|
||||||
|
|
||||||
// other
|
// other
|
||||||
JPanel advanced_panel = new JPanel(new GridLayout(3, 2));
|
JPanel advanced_panel = new JPanel(new GridLayout(4, 2));
|
||||||
advanced_panel.setBorder(BorderFactory.createTitledBorder("Advanced options"));
|
advanced_panel.setBorder(BorderFactory.createTitledBorder("Advanced options"));
|
||||||
|
|
||||||
JLabel proxyLabel = new JLabel("Proxy:");
|
JLabel proxyLabel = new JLabel("Proxy:");
|
||||||
@@ -316,6 +320,17 @@ public class Settings implements Activity {
|
|||||||
advanced_panel.add(proxyLabel);
|
advanced_panel.add(proxyLabel);
|
||||||
advanced_panel.add(proxy);
|
advanced_panel.add(proxy);
|
||||||
|
|
||||||
|
|
||||||
|
JLabel renderTimeLabel = new JLabel("Max time per frame (in minute):");
|
||||||
|
int val = 0;
|
||||||
|
if (parent.getConfiguration().getMaxRenderTime() > 0) {
|
||||||
|
val = parent.getConfiguration().getMaxRenderTime() / 60;
|
||||||
|
}
|
||||||
|
renderTime = new JSpinner(new SpinnerNumberModel(val,0,1000,1));
|
||||||
|
|
||||||
|
advanced_panel.add(renderTimeLabel);
|
||||||
|
advanced_panel.add(renderTime);
|
||||||
|
|
||||||
JLabel customTileSizeLabel = new JLabel("Custom render tile size:");
|
JLabel customTileSizeLabel = new JLabel("Custom render tile size:");
|
||||||
customTileSize = new JCheckBox("", config.getTileSize() != -1);
|
customTileSize = new JCheckBox("", config.getTileSize() != -1);
|
||||||
advanced_panel.add(customTileSizeLabel);
|
advanced_panel.add(customTileSizeLabel);
|
||||||
@@ -533,6 +548,12 @@ public class Settings implements Activity {
|
|||||||
config.setMaxMemory(max_ram);
|
config.setMaxMemory(max_ram);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int max_rendertime = -1;
|
||||||
|
if (renderTime != null) {
|
||||||
|
max_rendertime = (Integer)renderTime.getValue() * 60;
|
||||||
|
config.setMaxRenderTime(max_rendertime);
|
||||||
|
}
|
||||||
|
|
||||||
config.setUsePriority(priority.getValue());
|
config.setUsePriority(priority.getValue());
|
||||||
|
|
||||||
String proxyText = null;
|
String proxyText = null;
|
||||||
@@ -572,7 +593,7 @@ public class Settings implements Activity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (saveFile.isSelected()) {
|
if (saveFile.isSelected()) {
|
||||||
new SettingsLoader(login.getText(), new String(password.getPassword()), proxyText, method, selected_gpu, cpu_cores, max_ram, cachePath, autoSignIn.isSelected(), GuiSwing.type, tile, priority.getValue()).saveFile();
|
new SettingsLoader(login.getText(), new String(password.getPassword()), proxyText, method, selected_gpu, cpu_cores, max_ram, max_rendertime, cachePath, autoSignIn.isSelected(), GuiSwing.type, tile, priority.getValue()).saveFile();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user