【发布时间】: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。