JavaFX:在窗格内同时移动数百个ImageView(性能问题)

时间:2018-12-03 14:11:53

标签: java performance javafx lag

我目前正在为大学项目开发​​塔防游戏。 在更高的浪潮中,有数百名敌人四处移动。我的问题是,同时移动约300个以上的敌人时,它会变得非常破洞。 每个敌人都是显示在我的场景中的Pane的孩子。

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

    public class EnemyGraphics extends ImageView implements EventObserver {

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

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

是否可以在不重绘场景的情况下为ImageView对象设置新坐标,并且在主FX-Thread中创建一个计时器以一定间隔重绘整个场景?还是我可以调用其他解决方案/方法来在窗格上高效地移动图像?

1 个答案:

答案 0 :(得分:1)

好的,我发现了我的错误。每当我的敌人逻辑类计算一个新位置时,它就会调用敌人图形对象来更新其位置。在测试过程中,我删除了敌人图形类中方法的功能,但未删除调用。

要更新所有敌人的位置,我在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());
        }
}