快節奏多人遊戲同步(1)-ClientServer架構

PART 1 概述

本文是關於探索快節奏多人遊戲的技術和算法系列的第一篇,因此對多人遊戲概念非常熟悉的同學可以隨意的跳過這一篇就好啦~因爲接下來只是一些介紹性質的討論。。。

任何類型的遊戲開發都是某種挑戰,然而在多人遊戲中我們還有更多全新的問題函待解決~最最 Interesting 的地方在於其核心問題其實是人類和物理!- - 好吧其實是作弊和地理限制造成的網絡延時。。

PART 2 反作弊

所有的一切的起源都是作弊。

作爲一個遊戲開發者,你一般不會去擔心有人在你的單人遊戲中去作弊 - 因爲他的行爲不會給其他人帶來影響,一個作弊的玩家可能並不會按你設計的套路去進行遊戲,但是遊戲是他的,他們有權利去選擇怎麼去玩。

多人遊戲則不同。在任何的有競爭關係的遊戲中,一個作弊玩家不僅僅給自己帶來了更好的體驗,他也毀了其他的玩家的遊戲。作爲開發者,你可能希望避免出現這樣的情況,因爲這會讓玩家流失。

爲了防止作弊,有很多事可以去做,但是最重要最(可能也是唯一有意義的)的事非常簡單:不要相信玩家。就做最壞的打算:所有玩家都想要作弊。

PART 3 權威服務器和靜默客戶端

有一個非常簡單的解決方案 - 你將遊戲中所有的邏輯都放在你控制的服務器來做,而客戶端只是遊戲的旁觀者,換句話說,你遊戲的客戶端把輸入(按鍵,命令)發送到服務器,服務器來運行這個遊戲,然後你把結果返回給客戶端。這就是常說的權威服務器,因爲遊戲世界中發生的一切都在服務器中進行。

當然,你的服務器還是可能被發現漏洞,但是這就不屬於我們要談論的範圍了。使用權威服務器可以防止很多的漏洞,比如,服務器不信任玩家的在客戶端的血量,客戶端想要作弊,把本地的血量調到10000%,但服務器知道血量只有10% - 當玩家被攻擊的時候它還是會死掉,不管客戶端的血量是多少。

服務器同樣不信任玩家的位置。你可能會這樣做,在這一秒你告訴服務器“我在(10,10)”,然而下一秒你告訴服務器“我在(20,10)”,這樣就可以穿過一堵牆或者超快速的移動。但是,權威服務器知道玩家在(10,10),當客戶端告知服務器他要往右動一格的時候,客戶端的位置會由服務器來處理,將位置更新爲(11,10),然後告知玩家“你在(11,10)”。如下圖所示:

總的來說,遊戲的狀態由服務器獨自管理。客戶端將動作發送給服務器,服務器來週期性地更新遊戲狀態,然後將新的遊戲狀態發送給客戶端,客戶端對結果進行渲染呈現。

PART 4 考慮網絡問題

上面的處理方式對於回合制的遊戲非常適合,比如策略遊戲或者棋牌類的遊戲。它在LAN中也能工作的很好,在這種情況下,通信是瞬發的。但是對於一些對實時性要求很高的遊戲,而且在internet環境中,這種解決方案就會出問題了。

下面來談一些物理的問題。假如你在舊金山,連接了一個在紐約的服務器,兩地相距4000km或者2500英里(大概是里斯本到莫斯科的距離)。任何東西都不能比光快吧,即使是Internet上的數據(數據傳播的底層可能是光的脈衝,線纜中的電子,或者是電磁波),光傳播的速度大概是300000km/s,所以傳播4000km需要13ms。

這聽起來可能很快,但這實際是最樂觀的情況 - 假設數據傳播的速度是光速,沿着直線傳播,這些通常是不可能的。在真實情況下,數據是由無數個路由經過一系列的跳(在計算機網絡裏的屬於叫做hops)進行傳播的,而且大部分的傳播速度都達不到光速;路由在傳播的時候也會產生一些延遲,因爲包必須被打包,檢查和分發。

所以保險起見,我們假設數據從客戶端到服務器需要50ms,這接近最好的場景了 - 當你在紐約而服務器在東京呢?假設網絡因爲什麼原因發生阻塞了呢?100ms,200ms,500ms的延遲也是有可能的。

回到我們的例子,你的客戶端將輸入“我按下了向右的按鍵”發給服務器,服務器在50ms之後獲取了數據,現在假設服務器能夠立即響應並且將結果返回,那麼客戶端在50ms之後獲得新的遊戲狀態“你現在在(1,0)”。

從你的視角來看,情況是這樣的:你按下了向右的按鍵,但是什麼事都沒發生,直到一百年後你的角色向右移動了一格。這樣的延遲是顯而易見的,當然延遲半秒不僅僅是顯而易見,它讓整個遊戲沒法玩了。

PART 5 總結

通過網絡連接的多人遊戲是超級有趣的,但是引入了一系列的難題和挑戰。權威服務器架構能夠防止很多的作弊,但是直接用這種方法會讓遊戲的響應變得遲緩。

在下面的文章,我們會介紹我們怎麼圍繞權威服務器來建立一個系統,能夠最小的減少玩家的延遲體驗,就像在玩單機遊戲一樣順暢。

  • http://www.gabrielgambetta.com/client-server-game-architecture.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章