首页 > 解决方案 > JavaFX:在窗格内同时移动数百个 ImageView(性能问题)

问题描述

我目前正在为一个大学项目开发​​一款塔防游戏。在更高的波浪中,有数百个敌人在四处移动。我的问题是它在大约 300 多个敌人同时移动时性能变得非常差。每个敌人都是我场景中显示的窗格的孩子。

我的 EnemyGraphics 类中有一个方法,它通过调用 update 方法来更新位置:

    public class EnemyGraphics extends ImageView implements EventObserver {

...
    @Override
    public void update() {
            Platform.runLater(() -> {
                    relocate(enemy.getxCoordinate(), enemy.getyCoordinate());
            });
    }
    }

我猜它变得迟钝了,因为每个敌人每次移动时都会通过调用 update() 自行更新其位置。

有没有一种方法可以为我的 ImageView 对象设置新坐标,而无需重绘场景并在主 FX 线程中创建一个计时器,该计时器在一定间隔内重绘整个场景?还是我可以调用其他解决方案/方法来在窗格上高效地移动图像?

标签: javaperformancejavafxlag

解决方案


好的,我发现了我的错误。每次我的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());
        }
}

推荐阅读