JavaFX和画布的快速更新

JavaFX和画布的快速更新,java,javafx,javafx-2,javafx-8,java-canvas,Java,Javafx,Javafx 2,Javafx 8,Java Canvas,我试图在JavaFX下创建一个自定义画布小部件,它从许多不相关的工作线程收集信息。“更新”事件可能以不同的速率出现,有时太快,有时根本没有,这意味着需要适当地解决“更新太快”和“空闲时间”需求。更新的数量太多,因此每次执行更新时发出Runnable不是一个好的解决方案 为了进行测试,我的暴力方法是创建一个AnimationTimer来更新画布对象的视觉效果。这个解决方案工作得很好,但是当然有时候画布不需要更新,这使得整个过程效率低下 最接近我的问题的答案似乎是使用GUIUpdater助手类,但C

我试图在JavaFX下创建一个自定义画布小部件,它从许多不相关的工作线程收集信息。“更新”事件可能以不同的速率出现,有时太快,有时根本没有,这意味着需要适当地解决“更新太快”和“空闲时间”需求。更新的数量太多,因此每次执行更新时发出Runnable不是一个好的解决方案

为了进行测试,我的暴力方法是创建一个AnimationTimer来更新画布对象的视觉效果。这个解决方案工作得很好,但是当然有时候画布不需要更新,这使得整个过程效率低下

最接近我的问题的答案似乎是使用GUIUpdater助手类,但Canvas似乎没有直接更新属性。我试图找到一种方法,用绑定的参数“插入”所需的更新功能,但运气好。我甚至试图了解Canvas是否有“更新”事件,但我没有找到它。据我所知,我找到的所有其他答案都不符合要求

提前谢谢

编辑

下面是我用来确保仅当数据更改时,画布才会绘制的代码:

new AnimationTimer() {
    @Override
    public void handle(long now) {
        if (needsUpdate.getAndSet(false)) {
            myCustomCanvasRepaint();
        }
    }
}.start();
这是由以下内容触发的:

AtomicBoolean needsUpdate = new AtomicBoolean(true);
...
public void needsUpdate() {
    needsUpdate.set(true);
}

这确实是的复制品,但您可以这样做

private final AtomicBoolean updated = new AtomicBoolean();

// ...

Thread someBackgroundThread = new Thread(() -> {
    while (true) {
        waitArbitraryTimeForData() ;
        if (updated.getAndSet(false)) {
            updateCanvas();
        }
    }
});

private void updateCanvas() {
    Platform.runLater(() -> {
        updated.set(true);
        // repaint canvas...
    }
}

根据更新所依赖的数据,您可能需要对
平台.runLater()主体周围的数据进行一些额外的锁定。或者(可能更好),用一个不可变类表示累积更新,并用对该类的原子引用替换
原子布尔。

这实际上是的副本,但您可以这样做

private final AtomicBoolean updated = new AtomicBoolean();

// ...

Thread someBackgroundThread = new Thread(() -> {
    while (true) {
        waitArbitraryTimeForData() ;
        if (updated.getAndSet(false)) {
            updateCanvas();
        }
    }
});

private void updateCanvas() {
    Platform.runLater(() -> {
        updated.set(true);
        // repaint canvas...
    }
}

根据更新所依赖的数据,您可能需要对
平台.runLater()主体周围的数据进行一些额外的锁定。或者(可能更好),用一个不可变类表示累积更新,并用对该类的原子引用替换
原子布尔。

关于频繁更新的相关问题:这可能解决“过于频繁”而不是“空闲”的情况。我将更新我的问题,以显示我使用类似方法所做的事情。我不确定我是否理解您所说的“空闲”情况是什么意思。我的意思是,有时需要快速更新(JavaFX无法处理),但有时根本不需要更新。没有固定的更新流;只有在需要的时候。这与示例中的情况不同。这看起来更适合作为一个类似事件的模型吗?我还是不明白。如果示例中的后台线程处于空闲状态,它将不会安排任何
Platform.runLater(…)
调用。有关频繁更新的相关问题:这可能会解决“过于频繁”的问题,但不会解决“空闲”的问题。我将更新我的问题,以显示我使用类似方法所做的事情。我不确定我是否理解您所说的“空闲”情况是什么意思。我的意思是,有时需要快速更新(JavaFX无法处理),但有时根本不需要更新。没有固定的更新流;只有在需要的时候。这与示例中的情况不同。这看起来更适合作为一个类似事件的模型吗?我还是不明白。如果示例中的后台线程处于空闲状态,它将不会安排任何
Platform.runLater(…)
调用。