我写了一个光线跟踪渲染应用程序,现在我正在尝试将它连接到GUI。我想实现从白色画布到结果的逐像素处理渲染效果。具体来说,当我的跟踪应用程序计算某些像素的颜色时,我希望它会立即写入图像。而不是GUI在渲染时被冻结并且仅显示最终结果。然后我决定在后台线程中运行渲染过程来修复它。在阅读了一些文档后,我发现为了动态更新GUI,请使用Tasks和Platform.runLater方法。那是与我的问题相关的代码: 在RenderWindowController中,我将ImageView连接到XML表单
@FXML
private volatile ImageView imageView;
创建场景后,此代码运行渲染过程
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
world.getCamera().renderScene(world);
return null;
}
};
方法renderScene遍历图像的行和列,并计算每个像素的颜色
...
WritableImage img = ...
PixelWriter pixelWriter = img.getPixelWriter();
for rows {
for columns {
...
pixelColor = tracer.traceRay();
pixelWriter.setColor(column, row, pixelColor);
Platform.runLater(() -> *reference to my ImageView*.setImage(image));
}
}
这段代码与我没有使用线程的方式相同。 我是线程和JavaFX的新手。谁能指出我做错了什么?
答案 0 :(得分:-3)
这个链接可能对阅读有用。这与Swing中的并发性有关。 该链接包含一些代码示例。
https://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
e.g。
import javafx.concurrent.Task;
Task<Integer> task = new Task<Integer>() {
@Override protected Integer call() throws Exception {
int iterations;
for (iterations = 0; iterations < 100000; iterations++) {
if (isCancelled()) {
break;
}
System.out.println("Iteration " + iterations);
}
return iterations;
}
};
import javafx.concurrent.Task;
Task<Integer> task = new Task<Integer>() {
@Override protected Integer call() throws Exception {
int iterations;
for (iterations = 0; iterations < 100000; iterations++) {
if (isCancelled()) {
break;
}
System.out.println("Iteration " + iterations);
}
return iterations;
}
};