java - 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 线程中创建一个计时器,该计时器在一定间隔内重绘整个场景?还是我可以调用其他解决方案/方法来在窗格上高效地移动图像?
解决方案
好的,我发现了我的错误。每次我的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());
}
}
推荐阅读
- scala - 为什么隐式参数的顺序有时很重要?
- javascript - 您可以将 Material-UI Link 与 react-router-dom Link 一起使用吗?
- python - 堆叠卷积层如何在 CNN 中工作?
- python-3.x - 有没有办法解决这段代码中的运行时错误?
- java - 图 java 中的 BFS 问题。它没有返回任何东西
- php - 如果儿子是,那么来自列表 1 的下拉列表应该出现如果儿子下拉列表不是,那么来自列表 2 的下拉列表必须出现
- javascript - 在 Vuex 4 和 Vue 3 中使用 `mapActions` 或 `mapGetters`
- java - 如何使用 apache camel 对相似文件进行分组
- scala - 将 DataFrame 发布到 Kafka
- ios - SwiftUI Horizontal ScrollView onTapGesture 在它后面的垂直滚动视图上注册点击