gpt4 book ai didi

java - 如何处理多个对象的周期性更新?

转载 作者:行者123 更新时间:2023-12-02 05:19:09 25 4
gpt4 key购买 nike

我正在开发一款小型 Java 游戏,以经典的 Asteroids 为基础。

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

每一帧:移动或旋转的对象。
每秒:游戏计时器。
每隔几秒:敌人人工智能,敌人生成
每隔几秒:从船上武器发射一颗新子弹。

目前我正在这样处理:

//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;
}
}
}

当然这只是我如何使用它的一个例子,所以我删除了不必要的部分。

我的问题是:这是实现此类更新系统的正确方法(=一种好方法)吗?在阅读周围的内容时,我注意到大多数时候计时器都用于此类任务。

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

我对 Java 有点陌生,所以我不知道我的担心是否毫无根据,或者拥有这么多计时器是否真的是一个坏主意。

非常感谢您对此主题的建议、提示和更正!

最佳答案

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

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

This class scales to large numbers of concurrently scheduled tasks (thousands should present no problem)

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com