在Java 6中,在不同时间间隔内运行很多东西的最有效方法是什么

时间:2012-02-17 07:21:13

标签: java swing

我正在使用Java的侧滚动GUI游戏。我有很多种类的敌人,他们的AI会使用Swing计时器。据我了解,Swing计时器是一种资源密集型,但我仍然希望我的敌人以不同的间隔移动。对于每种敌人,使用不同的Swing计时器是否有更有效的方法来运行?

2 个答案:

答案 0 :(得分:4)

解决这个问题的一个更好的方法是保留屏幕上存在的敌人列表,每次渲染下一个屏幕时你的主渲染循环应该决定它应该调用Enemy对象上的任何方法的天气

public interface Enemy { 
   public void doNextThing();
}

public class TimedEnemy implements Enemy {
    private long lastExecute; 
    private Enemy enemy;
    private long threshHold; 

    public TimedEnemy(Enemy enemy, long threshold)
    {
       this.lastExecute = System.currentTimeMills();
       this.enemy = enemy; 
       this.threshold = threshold; 
    } 

    public void doNextThing()
    {
          long duration  = System.currentTimeMills() - lastExecute;
          if( duration >= threshold) {
              lastExecute = System.currentTimeMills();
              this.enemy.doNextThing();
          }
    }
}

// main Render Loop 
List<Enemy> enemies = new ArrayList<Enemy>();
TimedEnemy easy = new TimedEnemy(new EasyEnemy(),1000);
TimedEnemy hard = new TimeEnemy(new HardBadGuyEnemy(),100);
TimedEnemy boss = new TimeEnemy(new VeryBadBossEnemy(),50);

enemies.add(easy);
enemies.add(hard);
enemies.add(boss);

for( Enemy enemy : enemies) {
     enemy.doNextThing():
}

如果你真的需要让每个敌人AI都在自己的线程上运行,那么你需要使用Java 5的TaskExecutor功能,以及Futures概念。尽管在不同的线程上运行每个AI意味着您必须小心线程同步。

答案 1 :(得分:1)