Java 如何处理许多对象的定期更新?
我正在做一个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
每秒钟:游戏计时器。
每隔几秒钟:敌人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: