【问题标题】:JavaFX and fast update of CanvasJavaFX 和 Canvas 的快速更新
【发布时间】:2016-08-03 03:05:32
【问题描述】:

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

只是为了测试,我的蛮力方法是创建一个 AnimationTimer 来更新 Canvas 对象的视觉效果。该解决方案运行良好,但当然有时 Canvas 不需要更新,导致整个过程效率低下。

与我的问题最接近的答案似乎是 this post 带有 GUIUpdater 帮助器类,但 Canvas 似乎没有直接的 update 属性。我正在尝试找到一种方法来使用绑定参数“插入”所需的更新功能,但很幸运。我什至试图了解 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);
}

【问题讨论】:

  • 频繁更新相关问题:stackoverflow.com/questions/23488280/…
  • 这可能会解决“过于频繁”但不能解决“空闲”的情况。我将更新我的问题以显示我使用类似方法所做的事情。
  • 我不确定我理解你所说的“空闲”情况是什么意思
  • 我的意思是,有时需要快速更新(超出 JavaFX 的处理能力),但有时根本不需要更新。没有持续的更新流;仅在需要时。这与示例中的情况不同。这里看起来更像是一个类似事件的模型?
  • 我还是不明白。如果示例中的后台线程空闲,则不会安排任何Platform.runLater(...) 调用。

标签: java javafx javafx-2 javafx-8 java-canvas


【解决方案1】:

这确实是Throttling javafx gui updates的复制品,但你可以这样做

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...
    }
}

根据您的更新所依赖的数据,您可能需要对Platform.runLater() 正文周围的数据进行额外锁定。或者(可能更好),用不可变类表示累积更新,并将AtomicBoolean 替换为对该类的原子引用。

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 2013-12-04
    • 1970-01-01
    • 2012-10-29
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多