我正在研究一款靠经典小行星的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;
        }
    }
}


当然,这仅是我如何使用它的一个示例,因此我删除了不必要的部分。

我的问题是:
那是实现这样一个更新系统的正确方法(一种好方法)吗?
在阅读时,我注意到大多数时候都使用计时器来完成这项任务。

但这需要我同时运行多个计时器(每个需要更新的对象一个)。
如果我正确理解了Timer的每个实例,还会创建一个新线程,那么我担心这可能会在某个时候成为问题(线程处理性能损失超过了当前系统的重量-或线程数量变得太大)。

我是Java的新手,所以我不知道我的担心是没有根据的,还是拥有这么多Timers真的不是一个坏主意。

非常感谢您提供有关此主题的建议,技巧和更正!

最佳答案

我真的很喜欢您的设计,它的Updating界面抽象了实际需要更新的细节。当然,您当前的实现不是很好。也许您应该创建几种方法,例如updateEveryFrame()updateEverySecond()等?每个对象仅实现其需要工作的方法,而其他对象则无法操作。

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


此类可扩展为同时执行的大量计划任务(成千上万个问题不会出现)


但是,我建议将allObjectsThatNeedPeriodicUpdates分为:allObjectsThatNeedUpdateEveryFrameallObjectsThatNeedUpdateEverySecond等。为第一个收集创建一个定期任务,为另一个收集创建另一个(具有不同的间隔)任务。

关于java - 如何处理许多对象的定期更新?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8072602/

10-11 22:12
查看更多