Java 如何处理许多对象的定期更新?

Java 如何处理许多对象的定期更新?,java,coding-style,timer,Java,Coding Style,Timer,我正在做一个Java小游戏,学习经典的小行星 在这个游戏中,有大量的对象需要在特定的时间间隔内更新: 每帧:移动或旋转的对象。 每秒钟:游戏计时器。 每隔几秒钟:敌人AI,敌人产卵 每隔几秒钟:从船上武器发射一颗新子弹 目前我是这样处理的: //This method is called by a timer that is run every 30 milliseconds //It will iterate through all objects that require periodic

我正在做一个Java小游戏,学习经典的小行星

在这个游戏中,有大量的对象需要在特定的时间间隔内更新:

每帧:移动或旋转的对象。
每秒钟:游戏计时器。
每隔几秒钟:敌人AI,敌人产卵
每隔几秒钟:从船上武器发射一颗新子弹

目前我是这样处理的:

//This method is called by a timer that is run every 30 milliseconds
//It will iterate through all objects that require periodic updates and call their
//update method every 30ms.
public void frameUpdateLoop(){
    for( Updating u : allObjectsThatNeedPeriodicUpdates ){
        u.update();
    }
}

public class EnemySpawner implements Updating{
    private static final int SPAWN_TRESHOLD=500;
    private int timeUntilNewEnemySpawns=SPAWN_TRESHOLD;

    //This method is called by frameUpdateLoop()
    //It is only supposed to do work once every 500ms, but is called every
    //30ms nonetheless.
    public void update(){
        timeUntilNewEnemySpawns -= 30; //Subtract time since last update
        if( timeUntilNewEnemySpawns <= 0){
            SpawnNewEnemy();
            timeUntilNewEnemySpawns = SPAWN_TRESHOLD;
        }
    }
}
//此方法由每30毫秒运行一次的计时器调用
//它将遍历所有需要定期更新的对象,并调用它们的
//每30毫秒更新一次方法。
public void frameUpdateLoop(){
用于(更新u:AllObjectSthatNeedPeriodicUpdate){
u、 更新();
}
}
公共类EnemySpawner实现更新{
私有静态最终int SPAWN_TRESHOLD=500;
private int timeuntilnewenemyspowns=SPAWN\u TRESHOLD;
//此方法由frameUpdateLoop()调用
//它应该每500毫秒只工作一次,但称为“每分钟”
//30毫秒。
公共无效更新(){
timeUntilNewEnemySpawns-=30;//减去自上次更新以来的时间

如果(timeUntilNewEnemySpawns我真的很喜欢你的设计,
更新
接口抽象出实际需要更新的细节。当然你当前的实现不是很优雅。也许你应该创建一些方法,比如
updateEveryFrame()
updateEverySecond()
,等等?每个对象只实现它需要工作的方法,而其他对象则没有操作

Timer
实际上是一个不错的选择:

此类可扩展到大量并发计划任务(数千个任务应该不会出现问题)


但是,我建议将
allobjectsthateneedperiodicupdates
拆分为:
allobjectsthateneedupdateeveryframe
allobjectsthateneedupdateeverysecond
,等等。为第一个集合创建一个定期任务,另一个(具有不同的间隔)另一方面。

您的方法看起来不错,这就是半衰期的作用。唯一的区别是半衰期(以及包括您在内的许多其他方法)向更新函数发送增量时间,这样您就不必在每个更新函数中硬编码30ms。因此:

public void update(int deltaTime){
    timeUntilNewEnemySpawns -= deltaTime; //Subtract the delta time
    if( timeUntilNewEnemySpawns <= 0){
        SpawnNewEnemy();
        timeUntilNewEnemySpawns = SPAWN_TRESHOLD;
    }
}
public void更新(int deltaTime){
timeUntilNewEnemySpawns-=deltaTime;//减去delta时间

如果(timeUntilNewEnemySpawns传递一个deltaTime也是一个好主意,因为帧渲染可能需要可变毫秒才能完成,你的物理方程需要知道经过了多少时间。在一个缓慢的时期,让它们进行更长的跳跃,等等。@Karl,这在很多情况下都是正确的,但是关于固定与可变的tim有大量的讨论这里值得一读的esteps: