快节奏多人游戏同步:技术与算法的实现
介紹
這是系列的第一章,主要介紹快節奏游戲所用到的技術和算法。如果你熟悉多人游戲背后的概念,你完全可以跳過接下來介紹性質的內容。
開發任何一種游戲都是一項挑戰,特別是多人游戲,有全新的一套問題需要解決。網絡游戲的核心技術問題是作弊和通信。
作弊問題
作為游戲開發者,一般是不需要擔心玩家在單機中作弊的,他的行為只能影響到自己。作弊者可能沒法按照你設計的去體驗,但這是他們的游戲,他們怎么做都行。
多人游戲就不同了。在任何競技游戲中,作弊玩家不僅僅讓自己體驗更好而已,還讓其他人體驗更差。這回導致沒人愿意繼續玩,作為開發者,你肯定不想遇到這種情況。
防止作弊的方法有很多,但是最重要的方法(也很可能是唯一的方法)最簡單:別信任玩家。永遠假定最壞情況:玩家會作弊。
權威服務器和傀儡客戶端
這就有了一種看起來最簡單的方法,讓所有事情都在服務器發生并且受控。客戶端只是受限的旁觀者。換句話說,你的游戲客戶端只是發送輸入(按鍵、命令)到服務器,服務器運行游戲,然后將結果傳回客戶端。之所以叫權威服務器,是因為所有事情的發生都在服務器。
當然,你的服務器也會有漏洞,但這不在這系列文章的討論范圍。用權威服務器能夠阻止大范圍的破解行為。比如說,你不信任客戶端的血量,但被破解的客戶端可以本地修改血量到10000%,但服務器知道它實際只有10%。接下來玩家再被攻擊就會死亡,不管客戶端怎么破解。
你同樣不信任玩家的坐標。如果這么做了,一個破解了的客戶端會告訴服務器“我在(10,10)”接著下一秒會告訴服務器“我在(20,20)”,這就會讓玩家穿墻或者跑得比其他人要快。相反,服務器知道玩家在(10,10),客戶端會告訴服務器“我想往右邊一點點”,服務器就會更新坐標到(11,10),然后告訴客戶端“你在(11,10)”。
?
總的來講,游戲狀態只由服務器來管理。客戶端會發送他們的行為到服務器。服務器定期更新狀態,然后將狀態發回去,客戶端只要顯示可以了。
處理網絡
傀儡客戶端對于回合制游戲來講能良好工作,比如策略游戲或者撲克牌。它在局域網下也會有不錯的表現,通信幾乎是立刻到達。但這對于因特網上互聯的快節奏游戲來講是不可行。
這里算一下網速。假設你在舊金山,連接到紐約的QQ靚號交易服務器。這大概有4000km,也就是2500里(差不多等于里斯本到莫斯科)。沒有東西能比光速快,就算是在互聯網上的字節(微觀上是光脈沖,在電纜中的電流,也就是電磁波)。光傳播速度大約是300,000 km/s,所以穿越4000km需要13毫秒。
這可能聽起來很快,但這是基于非常樂觀的假設–這里假設了數據以光速在直線上傳輸,這幾乎是不可能的事情。在現實生活中,數據需要經過一個個路由器跳躍,大多數都沒有到達光速;路由器本身還存在一定的延遲,需要對數據包進行拷貝、檢查、發送。
為了便于討論,假設數據包從客戶端到服務器需要50毫秒,這已經是很好的情況–如果你在紐約連接到東京會怎樣?如果網絡阻塞會怎樣?100、200甚至500毫秒的延遲也不是沒有的。
回到我們的例子,你的客戶端發送輸入信息到服務器“我按下右鍵”。服務器在50毫秒后收到。假設服務器處理請求并且馬上回包。你的客戶端會在50毫秒后收到“你在(1,0)”。
在你看來,所發生的事情無非就是按下右鍵有十分之一秒沒有響應而已,接著角色才開始往右走。這個在你輸入與結果之間的延遲聽起來不是特別嚴重,但這會影響手感。如果延遲到了半秒鐘,這就不僅僅是影響手感,而是這游戲沒法玩了。
總結
網絡多人游戲非常有趣,但是帶來了全新的挑戰。權威服務器架構能解決大部分作弊問題。簡單的實現方式能讓游戲沒有響應性。
在接下來的文章里,我們將會基于權威服務器去構建系統,同時會去最小化延遲給玩家帶來的不良體驗,讓玩家感受到單機游戲般順暢。
總結
以上是生活随笔為你收集整理的快节奏多人游戏同步:技术与算法的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏中的实时光线追踪技术与技巧
- 下一篇: 游戏与算法的必经之路