【发布时间】:2019-05-04 20:30:20
【问题描述】:
我目前正在为一个大学项目开发一款塔防游戏。 在更高的波浪中,有数百个敌人在四处移动。我的问题是它在大约 300 多个敌人同时移动时性能变得非常差。 每个敌人都是我场景中显示的窗格的子级。
我的 EnemyGraphics 类中有一个方法,它通过调用 update 方法来更新位置:
public class EnemyGraphics extends ImageView implements EventObserver {
...
@Override
public void update() {
Platform.runLater(() -> {
relocate(enemy.getxCoordinate(), enemy.getyCoordinate());
});
}
}
我猜它变得迟钝了,因为每个敌人每次移动时都会通过调用 update() 自行更新其位置。
有没有一种方法可以为我的 ImageView 对象设置新坐标,而无需重绘场景并在主 FX 线程中创建一个计时器,该计时器在一定间隔内重绘整个场景?或者我可以调用其他解决方案/方法来在窗格上高效地移动图像?
【问题讨论】:
-
我个人会在分析器下运行代码以查看实际花费最多的时间。是线程创建、计算、垃圾收集还是一些糟糕的代码。您可以创建移动实体的并发队列。这些应该在另一个线程上生成,消费者读取这些更新以在 UI 线程上调用它们。您需要尽可能多地在其他线程上进行计算,以尽量减少在 GUI 线程上完成的工作。另外,看看你是否正在创建大量垃圾收集器必须处理的临时对象。
-
你可能会从here那里得到一些想法。
-
您尝试过使用
Canvas吗? -
@user1803551 是的,我试过了,我没有注意到任何性能差异
-
@Sedrick 我查看了您给定的示例,但我发现移动对象的方式没有太大区别。在示例中,使用 Circle 类中的 setCenterX / Y 方法移动球。我尝试使用 ImageView 类中的 setX / Y 方法,但我没有注意到有什么不同。我还实现了一种通过迭代列表来更新每个对象位置的方法,这给了我一点性能提升,但并不多。
标签: java performance javafx lag