2010-10-11 64 views
1

我不確定這裏的術語實時性是否被濫用,但是這個想法是服務器上的許多玩家都有一個產生每秒n資源的城市。可能有一千個這樣的城市。獎勵所有玩家城市的最佳方式是什麼?編碼實時多人遊戲的最佳方式

是像這樣的環置於無限循環運行時的遊戲是「活」的最佳方式? (請用這種簡單的邏輯忽略這些明顯的錯誤)

foreach(City c in AllCities){ 
    if(c.lastTouched < DateTime.Now.AddSeconds(-10)){ 
    c.resources += (DateTime.Now-c.lastTouched).Seconds * c.resourcesPerSecond; 
    c.lastTouched = DateTime.Now; 
    c.saveChanges(); 
    } 
} 

回答

5

我不認爲你想要一個無限循環,因爲這會浪費很多CPU週期。這基本上是一個常見的模擬情況Wikipedia Simulation Software並有我能想到的幾種方法:

  1. ,你通過一個固定的時間增加了時鐘,並重新計算系統的狀態的離散時間的方法。這與上面的方法類似,除了定期進行計算並刪除10秒if子句。
  2. ,你有一箇中心事件隊列,每一個時間戳,按時間排序離散事件的方法。你睡覺,直到下一個事件到期,然後發送它。例如。該事件可能意味着添加單個資源。 Wikipedia Discrete Event Simulation
  3. 每當有人問了資源的數量計算它的基礎上的速度,初始時間和當前時間。當預計查詢次數相對於城市數量和經過時間而言很小時,這可以非常有效。
+0

2.當你在你選擇的語言好的活動的支持是特別好。 3.當存在可能會改變生產速率的外部因素時,可能會有點棘手,儘管可以將這些因素推入堆棧,然後在需要時及時重新計算。 – 2010-10-11 13:01:15

1

同時可以存儲每個對象的最後選中的時間,例如舉例來說,往往更容易只是有一個全球性的時間步長

while(1) { 
    currentTime = now(); 
    dt = currentTime - lastUpdateTime; 

    foreach(whatever) 
    whatever.update(dt); 

    lastUpdateTime = currentTime; 
} 

如果有不需要頻繁更新不同的系統:

while(1) { 
    currentTime = now(); 
    dt = currentTime - lastUpdateTime; 

    subsystem.timer += dt 
    while (subsystem.timer > subsystem.updatePeriod) {// need to be careful 
     subsystem.timer -= subsystem.updatePeriod; // that the system.update() 
     subsystem.update(subsytem.updatePeriod);  // is faster than the 
    }             // system.period 

    // ... 
} 

(你會發現幾乎是你在做基於每個城市的基礎是什麼)

另一個可能會遇到不同子系統時鐘頻率的情況,您可能會得到重疊(即將許多子系統放在同一幀中),從而導致幀時間不一致,這有時會成爲問題。