2012-06-12 43 views
0

我有一個多人遊戲大廳,用戶可以創建私人聊天室並開始私人遊戲。每個用戶在遊戲中都有一個健康欄,它假設每秒緩慢重新生成x點。Node.js異步setInterval遊戲循環?

我想我需要在每場比賽開始的時候,這是類似的東西來啓動服務器端遊戲循環:

setInterval(update('gameID'),1000); 

哪裏更新(「遊戲ID」)增加健康變量中的所有玩家1000 ms = 1秒的特定遊戲。

問題:我認爲這是異步嗎?我可能會有50個單獨的遊戲正在進行,其中有50個正在運行。主流程不會被阻止嗎?

回答

0

它是異步的。但這樣做可能會殺死你的服務器。

我建議讓這些間隔爲被動,即將遊戲的開始保存在內存中,並使客戶端ping數據。當客戶端ping服務器檢查當前日期並將其與存儲的日期進行比較(並在請求結束時更新存儲的日期)。它可以從中評估當前的健康狀況。

該解決方案應該更好地擴展。

+0

是否有足夠的效率讓setInterval客戶端調用服務器端的「updateHealth()」函數?或者我應該按照修改健康點的所有可能行動(攻擊,治療等),並確保他們在使用時調用「updateHealth()」。然後,在同一個有效遊戲中,對所有玩家的所有健康值(最大值爲4)進行客戶端預測。 – Legendre

+0

我認爲你應該觸發客戶端'setInterval',但不是太頻繁。您可以讓客戶端計算健康狀況,並且每調用一次5秒(或更短)的秒數,您就可以調用服務器端的'synchronize'函數來評估真正的健康狀況(和其他值),並將其發回給更新數據的客戶端。我就是這麼做的,但也許是其他更好的方法。 – freakish

+0

同步功能必須在攻擊,治療其他玩家的行爲上被調用嗎?服務器需要更新健康狀況,然後應用更改。 我想,當我在它時,我應該將更新間隔更改爲5秒,以幫助減少服務器負載。 :p – Legendre

0

setInterval肯定是異步的。大多數進行回調的函數都是異步的。如果您有疑問,可以查看文檔或源代碼。

+0

我對Node.js和服務器端腳本一般都很陌生,所以我仔細檢查了我和你們的理解。很高興知道我沒有搞糟這件事。感謝您的快速響應。 :) – Legendre

1

它是異步的,但在描述的情況下不需要50個計時器。

  1. 您可以使用一個計時器重新生成活動遊戲中的玩家。如果你還在推動健康數據,這將是非常低效的。
  2. 你可以做一些類似player.attackedTime = (new Date).getTime()的計算,並計算每次攻擊的再生,如player.health += x_points * ((new Date).getTime() - player.attackedTime)/1000,但你必須在客戶端進行預測性再生。
+0

Doh。是的,我可以運行一個setInterval(update(),1000)並讓update()重新生成所有活動遊戲中所有玩家的健康狀況。 我想我需要一個「updateHealth()」函數,它在所有與玩家健康點有關的操作上都被調用?不僅僅是攻擊,還會因陷阱等而癒合或損壞。 在客戶端,只需顯示一個「虛擬」預測健康值,並在調用「updateHealth()」時與權威服務器端值同步。 – Legendre

+0

如何更新健康取決於您決定如何在服務器上存儲/抽象遊戲狀態。您需要更新客戶端的不可預測的健康變化(攻擊,修復等),但可以預測再生能夠防止頻繁同步,如果您的遊戲需要這種時間精度,則甚至可以考慮延遲。 –

+0

現在它只是一個數組「var games = []」在app.js中。當遊戲創建時,輸入:遊戲['newGameName'] = {「One」:{health:50}}。所以如果玩家得到了20的治療,我會做一個遊戲['newGameName']。One.health + = 20等。 – Legendre