我正在研究一個小小的Java遊戲,靠着經典的小行星。如何處理許多對象的定期更新?
在這個遊戲中有一噸,其需要在一定的時間間隔進行更新的對象:
每一幀:Objects的移動或旋轉。
每秒鐘:遊戲計時器。
每隔幾秒鐘:敵人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來完成這樣的任務。
但是,這將需要我一次運行數十個計時器(每個需要更新的對象一個)。
如果我理解正確,Timer的每個實例也會創建一個新線程,所以我擔心這會在某個時候成爲問題(線程處理性能損失超過我的當前系統 - 或線程數量變得太大)。
我對Java很陌生,所以我不知道我的擔心是沒有根據的,或者如果確實有這麼多定時器是一個壞主意。
非常感謝您對此主題的建議,提示和更正!
傳遞deltaTime也是一個好主意,因爲幀渲染可能需要幾毫秒才能完成,您的物理方程需要知道已經過了多少時間。在一個緩慢的時期,讓他們花更長時間的跳躍等等。 – Karl
@Karl,在很多情況下都是如此,但是關於固定與可變時間步長的大量討論值得一讀:http://gamedev.stackexchange。 COM /問題/ 1589 /固定時間步VS-可變時間步 –