我正在研究一款靠经典小行星的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 well处Timer
实际上是一个不错的选择:
此类可扩展为同时执行的大量计划任务(成千上万个问题不会出现)
但是,我建议将allObjectsThatNeedPeriodicUpdates
分为:allObjectsThatNeedUpdateEveryFrame
,allObjectsThatNeedUpdateEverySecond
等。为第一个收集创建一个定期任务,为另一个收集创建另一个(具有不同的间隔)任务。
关于java - 如何处理许多对象的定期更新?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8072602/