【发布时间】:2016-05-08 11:49:30
【问题描述】:
我编写了一个光线追踪器渲染应用程序,现在我正在尝试将它连接到 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 的新手。谁能指出我做错了什么?
【问题讨论】:
标签: java multithreading javafx-8