【问题标题】:Java Game with JavaFX Canvas | Canvas stops updatingJava 游戏与 JavaFX 画布 |画布停止更新
【发布时间】:2018-10-21 17:50:01
【问题描述】:

我使用 Java 通过 JavaFX Canvas 创建游戏。

我将 Canvas graphicsContext 传递给我的 GameLoop,它会启动一个额外的线程。从那里,我通过 ObjectHandler 将我的 graphicsContext 传递给要在画布上绘制的每个对象。

它以这种方式工作了一段时间,但随后画布以某种方式停止并且没有重绘任何对象。游戏仍在后台运行。在日志中,我可以看到所有对象都在继续运行和更新。 有谁知道为什么会这样或我该如何解决?

这是我的窗口类的一部分:

canvas = new Canvas(Config.getCANVAS_WIDTH(), Config.getCANVAS_HEIGHT());
canvas.setFocusTraversable(true);
gc = new GameContainer(canvas.getGraphicsContext2D(), canvas);
primaryStage.setTitle(gc.getTitle());
primaryStage.setResizable(false);

这是我的 Gameloop 的一部分:

if (render) {
    gc.clearRect(0, 0, width, height);
    handler.render(gc);
    gc.setFill(Color.GRAY);
    if (Config.isDebug()) {
         debugText.printDebug(fps);
    }
    frames++;
}

HandlerClass 只是一个包含一个 arrayList 和两个循环(用于刻度和渲染)的列表。 这是一个典型的渲染函数的例子

public void render(GraphicsContext gc) {
    gc.save();
    gc.translate(x, y);
    gc.rotate(rotation);
    gc.setFill(Color.RED);
    gc.fillRect(-4, -4, 8, 8);
    gc.restore();
}

【问题讨论】:

  • 给我们一些可以合作的东西。请提供Minimal, Complete, and Verifiable example
  • @JKostikiadis 更新
  • ui需要从javafx应用线程修改,因为节点的数据没有同步。我想在你的情况下发生的事情是,在几次更新后,java 确定它可以提高性能,如果画布数据不再在两个线程之间共享,但每个线程都使用它自己的数据副本。 (Java 可以这样做,除非你明确告诉它不要这样做,这在这种情况下是不可能的。)
  • 所以最好的方法就是将渲染函数引入 Javafx 线程,并且刻度应该留在 Gameloop 中,对吗? @fabian
  • 不妨看看AnimationTimer

标签: java javafx java-8


【解决方案1】:

带有 GraphicsContext 的画布上的绘图必须在

Platform.runLater (() -> {});

JavavFX is not thread safe

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2011-12-02
    相关资源
    最近更新 更多