【问题标题】:JavaFX: Moving hundreds of ImageViews simultaneously inside a Pane (Performance problems)JavaFX:在窗格内同时移动数百个 ImageView(性能问题)
【发布时间】: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


【解决方案1】:

好的,我发现了我的错误。每次我的enemyLogic 类计算一个新位置时,它都会调用enemyGraphic 对象来更新它的位置。在测试期间,我删除了enemyGraphics 类中方法的功能,但没有删除调用。

为了更新所有敌人的位置,我在我的 GUIcontroller 类中编写了一个方法:

private void startUpdateTicker() {
    final AnimationTimer timer = new AnimationTimer() {
        @Override
        public void handle(long timestamp) {
                updateEnemies();
        }
    };
    timer.start();
}

public synchronized void updateEnemies() {
        for (EnemieGUI enemy : enemyList) {
            enemy.relocate(enemy.getEnemie().getxCoordinate(), enemy.getEnemie().getyCoordinate());
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多