2008-09-18 80 views
16

我有一些製作多人遊戲的經驗回合制遊戲使用套接字遊戲,但我從來沒有嘗試過實時動作遊戲。我需要處理哪些額外的問題?我是否需要保留球員行動的歷史記錄,以防過去的球員做些什麼?我真的需要使用UDP數據包還是TCP足夠?還有什麼?實現實時多人遊戲有什麼樣的問題

我還沒有真正決定做什麼,但對於這個問題的目的,你可以考慮一個10人2D遊戲與X Y的運動。

回答

19
  • '客戶端服務器'或'點對點'或之間的某事:哪臺計算機有權控制哪些遊戲動作。

對於基於回合的遊戲,通常很簡單的說'服務器擁有最終權限,我們完成'。對於實時遊戲,設計通常是一個很好的開始,但只要您添加延遲,客戶端移動/操作就會變得無法響應。因此,您添加了某種'延遲隱藏',允許客戶端輸入立即影響他們的角色或單位以解決該問題,現在當客戶端和服務器遊戲狀態開始出現分歧時,您必須處理協調問題。 9次,超過10次,這很好,你可以將客戶影響到的對象放到權威的位置,但是10次中有1次是對象是玩家頭像或其他東西,這個解決方案是不可接受的,所以你開始給予客戶一些行爲的權力。現在,您必須協調服務器上的多個遊戲狀態,並且如果您關心這類事情,則可以通過惡意客戶端向潛在的「作弊」敞開大門。這基本上就是每個瞬間/欺騙/任何錯誤/欺騙出現的地方。

當然,你可以從一個模型開始,「每個客戶對'他們的'對象'擁有權限並且忽略作弊問題(在很多情況下罰款)。但是現在,如果客戶退出,或者甚至「在跟上模擬時略微落後」,您就容易受到對遊戲模擬的巨大影響 - 實際上,每個玩家遊戲最終都會/感受到滯後或以其他方式表現不佳的客戶,以等待滯後的客戶追趕或者讓他們控制的遊戲狀態不同步的形式。

  • 「同步」或「asynchronus」

一個常見的策略,以確保所有的玩家在同一遊戲狀態操作是簡單地同意的玩家輸入(在列表上經由上述模型的一個),然後讓遊戲模擬在所有機器上同步播放。這意味着模擬邏輯必須完全匹配,否則遊戲將失去同步。這實際上比聽起來更容易和更難。這很容易,因爲遊戲只是代碼,並且代碼在給出相同的輸入時甚至可以執行完全相同的操作(即使是隨機數生成器)。這很困難,因爲有兩種情況並非如此:(1)當您意外地在遊戲模擬外使用隨機遊戲時;(2)當您使用浮游物時。前者通過對哪些遊戲系統使用RNGs有嚴格的規則/斷言進行糾正。後者通過不使用浮動來解決。 (浮動實際上有兩個問題,一個是基於項目的優化配置,它們的工作方式非常不同,但即使這個問題已經解決,它們在不同的處理器體系結構中也不一致)。星際爭霸/魔獸和任何提供「重放」的遊戲都可能使用這種模式。事實上,擁有重播系統是測試您的RNG保持同步的好方法。

有了異步解決方案,遊戲狀態機構只需以某個頻率將整個狀態廣播給所有其他客戶端。客戶端將這些數據放入其遊戲狀態(並且在進行下一次更新之前,通常會做一些簡單的推斷)。這裏'udp'成爲一個可行的選擇,因爲你每1秒左右發送一次垃圾郵件就會造成整個遊戲狀態,放棄這些更新的一部分是無關緊要的。對於遊戲狀態相對較少的遊戲(地震,魔獸世界)來說,這通常是最簡單的解決方案。

6

有參與建立多人

  1. 協議的幾個因素,重要的是你決定是否要TCP或UDP是非常重要的。 UDP的開銷較少,但不能保證交付。相反,TCP更值得信賴。每場比賽都會有他們喜歡的協議。例如,UDP可用於第一人稱射擊遊戲,但可能不適用於信息需要一致的RTS

  2. 防火牆/連接。確保您的多人遊戲不必進行2000出站連接並使用標準端口,因此portforwarding非常簡單。將它與Windows防火牆對接可能會帶來額外的好處。

  3. 帶寬。這很重要,您打算通過網絡連接推送多少數據?我想這會降低測試和錄製吞吐量。如果你需要每個客戶端200GB/s以上的速度,你可能需要重新思考一些事情。

  4. 服務器負載。這也很重要,服務器對普通遊戲需要多少處理?你需要一些帶有16GB內存的超級8核心服務器來運行它嗎?有減少它的方法嗎?

我想還有更多的堆,但是你真的想要一款能夠在網絡和各種連接上暢玩的遊戲。

4

避免作弊有多重要? [你能相信任何信息,從客戶端來了?或者他們信任和認證的?]如何從一臺計算機傳送到另一對象

對象模型 ?如何對對象執行操作?

你在做客戶端/服務器還是點對點?

隨機數字 如果你做了點對點,那麼你需要保持它們鎖步和隨機數同步。

如果您在做客戶端/服務器,您是如何處理滯後的? [航位推算?]

網絡編碼涉及很多不平凡的問題。

檢查RakNet它是免費下載代碼,它是討論組。

6

規劃是你最好的朋友。找出你真正需要的東西。

加載數據:是否每臺計算機都具有相同的型號和圖形,並且名稱和位置都通過網絡移動。如果每個玩家都可以自定義他們的角色或其他物品,那麼您將不得不移動這些數據。

作弊:你有沒有擔心呢?你能相信每個客戶在說什麼嗎?如果沒有,那麼你的服務器端邏輯將看起來不同於你的客戶端邏輯。想象一下這個簡單的例子,你的10個玩家中的每一個都可能因爲能量提升而具有不同的移動速度。爲了最大限度地減少作弊,你應該計算每個玩家可以在服務器的通信更新之間移動多遠,否則玩家可能會加快攻擊速度,沒有任何東西可以阻止他們。如果玩家一直比預期的要快一點,或者跳過一次,服務器就會將它們重新放置在最近的位置,因爲它可能是時鐘偏差或通信中斷一次。但是,如果玩家不斷移動兩次,那麼將他們踢出遊戲可能會比較謹慎。數學越多,遊戲狀態越多,你可以仔細檢查服務器,遊戲將會更加一致,順便說一句,這會讓作弊更加困難。

點對點是如何的:即使遊戲是點對點的,你可能希望有一個玩家開始遊戲並將它們用作服務器,這比試圖管理一些遊戲更容易基於雲的方法越多。如果沒有服務器,那麼你需要制定一個協議來解決具有不一致遊戲狀態的兩臺機器之間的爭議。

再次規劃是你最好的朋友計劃,計劃,計劃。如果你足夠考慮一個問題,你可以想辦法解決大部分問題。然後你可以開始思考你還沒有解決的問題。

0

如果你在局域網上運行,TCP是好的。但是如果你想在線玩,你必須使用UDP並且實現你自己的類TCP層:必須傳遞拋出的NAT路由器。

您需要在對等或客戶端 - 服務器通信之間進行選擇。在Client-Server模型中,世界的同步和狀態更容易實現,但您可能缺乏在線反應。在點對點中,它更復雜,但對於玩家來說更快。

不要爲遊戲目的保留玩家動作的歷史記錄(這樣做,但僅限於重放功能)。如果你達到了必要的地步,那麼最好讓每個玩家等待。