2011-08-24 186 views
16

我打算創建一個基於WebGL的實時策略遊戲,玩家可以一起玩。我將使用Node.js創建遊戲服務器,並使用websockets實現實時連接。策略遊戲服務器概念

我打破了關於什麼是最好的概念來同步客戶端。

一種可能性是僅將用戶(移動單元,建築物等)的訂單發送到服務器,服務器將它們發送給所有其他客戶端。但在這裏,我有延遲的問題。我認爲遊戲會以這種方式獲得異步。

另一種可能性是在服務器上計算遊戲。客戶端仍然向服務器發送指令,但是服務器現在將所有單元&建築物的所有改變的狀態以高時間間隔發送給客戶端。問題是這裏的數據量很大,速度有多快......

您是否有其他想法或改進建議?

謝謝!

回答

20

基本上你必須決定在速度安全

讓客戶端完成這項工作,計算速度更快,但數據處於風險之中,因爲客戶端可以操縱數據。

另一方面,讓服務器完成所有工作比較慢,但數據更安全。

您可以選擇雙重方法,決定讓客戶端只計算一些數據,同步並檢查其有效性,並讓其餘的在服務器上執行。

這也取決於如何快速的遊戲運行,數據量來計算,服務器和樂隊/連接的速度,等等

你應該原型兩種方法,並嘗試了一些測試,以模擬客戶端和服務器加載。

如果遊戲很小,我會選擇更多的服務器端工作。另一方面,對於一個非常複雜的遊戲來說,向客戶分享更多的工作可能是最好的。無論如何,我認爲總是需要權衡。

這裏有幾個鏈接對您有所幫助

Multiplayer Game Programming Introduction

Real time strategy networking

Multiplayer Programming thread (old but still with many useful links)

Lag Compensation

Prevent Multiplayer Cheating

第一個環節在當時幫了我很大的忙,imho仍然是這方面最好的資源之一。

書籍

Multiplayer Game Programming

1

不幸的是,我沒有基於WebGL的在線遊戲的經驗,但通常這是讓遊戲邏輯在客戶端執行並同步結果的好方法。

在這種方法中,跟蹤什麼遊戲對象是由什麼客戶「擁有」是很重要的。客戶端僅從其自己的對象發送更新(創建,更新,刪除),並從其他客戶端接收其他遊戲對象的更新。

此外,您可以設置一個消息框架來傳遞其他消息,如「玩家已進入/離開」或類似的東西。

這個概念已經證明對我創建的遊戲很有用,我希望它對你有用。

0

不知道有關WebGL的,但我的理解下面的方法將是很好的。

  1. 初始化服務器上​​的所有對象(這是整個玩家常見),並運行它們
  2. 在客戶端啓動,它會請求在服務器上運行對象的所有渲染器(與特定的客戶端)。
  3. 客戶端將爲所有接收到的渲染器渲染UI上的對象。
  4. 當客戶端作出UI任何更新,改變將被通知給服務器,服務器將更新對象相應
  5. 當對象玩家之間共同由一個玩家被修改,每個玩家(客戶端)將被通知,使UI變化。

這種方法將特定於通用對象而不是UI /客戶端特定對象。

1

你應該有比賽的狀態和邏輯在服務器上,否則你的遊戲是敞開的作弊。服務器是遊戲狀態的最終權威。

0

出於安全原因,所有的邏輯應該在服務器端,並且所有的數據更新都在服務器上。

但客戶端能夠預測一些邏輯並首先播放動畫,這被稱爲客戶端預測。

服務器端負責驗證客戶端邏輯,如果沒有作弊,全部完成。 如果有人作弊,服務器可以告訴客戶返回到正確的狀態。

如果您使用node.js作爲服務器,則有一個開源框架pomelo。 另外還有一個完整的源代碼演示和在線演示:lordofpomelo