MMO遊戲中服務端與客戶端分別承擔怎樣的計算才即安全又可靠呢?
客戶端運算可以有效減少服務端的負載,但很容易讓外掛、封包等作弊行為出現。那麼在實際MMO遊戲中服務端與客戶端分別承擔什麼樣的計算呢?
例如:傷害運算、自動尋路、道具獲得合成概率運算、碰撞檢測等等。如果自動尋路和碰撞檢測在客戶端里運算,如何避免瞬移、穿牆等行為呢?
原則一:安全第一,永不信任客戶端
所有能影響戰鬥勝負結果的數值及運算,影響成長收益的數值及運算,都必須放到服務端保存及運算或者是高頻度的驗算。影響戰鬥勝負結果的:
人物屬性 戰鬥公式 行走速度 施法距離 技能CD等影響成長收益的:
各種物品掉率 物品強化/合成概率等原則二:保持流暢的遊戲體驗
根據遊戲對網速的要求,合理調整各種發包及驗算的頻率。自動尋路的運算可以放在客戶端做,但是行走的同步必須放到伺服器驗算。碰撞檢測需要考慮性價比,如果卡位等等玩法是在策劃的戰鬥設計中占重要位置的話,就需要雙端都進行檢測,kubisoft說的平行於坐標軸的矩陣是個方法。但如果碰撞檢測僅僅是策劃一時拍腦袋或者為了不想讓怪物堆疊在一個位置上而已的話,考慮到如果不影響其他玩家,放客戶端即可。
伺服器端做的碰撞檢測可以粒度非常粗,只要無法作弊帶來利益就行。所以直接用平行於坐標軸的AABB矩形就可以了,開銷極低。
能為玩家帶來實際利益的所有運算都應該放在服務端進行。自動尋路這種不是直接為玩家帶來利益的高開銷運算採用客戶端計算服務端驗證的方法是最好的。舉個例子:客戶端來根據碰撞體和地形設置計算尋路軌跡,然後每隔一段時間把當前玩家坐標點提交給伺服器驗證此處是否是正常的落腳點,同時伺服器還需要驗證一下玩家的移動速度是否正常以防客戶端瞬移以及一些其他的數據驗證。這些數據驗證運算對伺服器來說開銷是不大的。
先明確一個問題:玩家哪些行為能夠帶來收益,什麼樣的收益
能夠帶來收益的運算最好都放到伺服器運算,至少是驗算
尤其是會其他玩家產生影響的,比如資源產出,比如戰鬥相關的屬性和技能屬性一定要放到伺服器算至於尋路,可以放到客戶端算,但是伺服器要定期校驗,只要速度不超過理論上限(在玩家當前能力範圍內),都可以而一些不影響其他玩家的行為,比如改模型或者穿牆(牆那邊什麼都沒有),放到客戶端讓他改唄,只要不產生其他BUG就好
讓客戶端承擔一部分運算不僅僅是減少伺服器負載的問題,有些情況下是為了保證流暢的遊戲體驗所必須的,有些遊戲中,200ms 的延遲對玩家的體驗有致命的傷害。所以如果成本允許的話,我會盡量把更多的實時運算放到客戶端,用伺服器來做安全校驗,甚至同樣的邏輯,兩邊都做一遍。這麼做確實違反一些程序開發的原則,同一份邏輯兩套代碼,並且要做到同步更新,這帶來的開發成本、維護成本及潛在的 bug 顯然會更多。有時候可以通過腳本或者 DSL 讓兩端共用同一套代碼,不過總歸都會帶來額外的開發成本。成本和用戶體驗的平衡需要根據特定情景和經驗做取捨。
下面是我的一些基本原則:
1. 有些求解和驗算計算量差別很大的計算,可以把求解部分放到客戶端,驗算放到伺服器。例如自動尋路,尋路的計算量是遠遠大於驗算一條路徑是否合法的計算量的。
2. 有些計算可以通過低精度的計算來驗算的,可以把低精度的驗算放在伺服器。例如碰撞監測,可以在客戶端做,伺服器用更低精度的模型和更低的頻率來進行驗算。
3. 有些計算無法做低精度驗算,但是可以做非實時的非同步驗算而不對其他玩家造成影響的,可以由專門的驗算伺服器來驗算,而不影響主遊戲進程的負載。這條有點繞,比如《Clash of Clans》,其戰鬥的特點是,玩家 A 不會與另一個玩家 B 互動,只是與 NPC 互動,而 NPC 所代表的玩家 B 必定是離線狀態。這樣就使得戰鬥過程可以完全在客戶端計算,否則在移動網路的不穩定情況下,遊戲體驗必定會大打折扣。伺服器只需要拿到兩方玩家的初始數據以及戰鬥的操作數據就可以對戰鬥進行重現來驗算結果是否合法,這個校驗可以放到任何一台校驗伺服器上,而校驗伺服器是可以近乎無限擴容的,這就不存在伺服器負載過高的問題。
這個校驗結果不必同步返回給客戶端,延遲幾秒再返回都可以,客戶端也不必等待校驗結果,直接呈現本地計算的戰鬥結果就可以。如果校驗成功,伺服器更新玩家數據,客戶端什麼事也不會發生;如果校驗失敗,可以令客戶端強制下線或者隨便怎麼樣——反正也不需要在乎作弊者的體驗。真實 coc 伺服器的細節我並不了解,以上只是我認為的一個可行方案。當然 coc 不是傳統的 mmo,是天然適合分散式架構的。但在傳統的 mmo 遊戲中,總有些功能是可以通過這種方式來降低伺服器負載的。4. 不想讓玩家了解的邏輯細節,不要放到客戶端。例如物品掉落方面的邏輯,如果不想讓玩家了解掉率等細節,就不要放在客戶端。即使加密,也總有辦法被逆向出來。
5. 可能會經常變動的邏輯,不要放在客戶端。例如技能傷害,如果需要經常做平衡性調整的話,在伺服器修改總比頻繁更新客戶端要好。
最後說點題外話,安全性、用戶體驗以及低開發成本三者是不可能同時滿足的,不同類型的遊戲有不同的取捨。犧牲一部分安全性帶來用戶體驗的提升以及開發成本的降低是可以接受的,那部分犧牲的安全性可以盡量由運營手段來彌補,例如封號,《魔獸世界》就是這麼做的。其實正常流程應該客戶端先檢測一下所有的條件是否滿足 然後再發包給伺服器 當然伺服器收到包後其實也會做和客戶端一樣的條件檢測 這樣可以適當的減少不必要的消息包 減輕伺服器壓力
mark, 關注中... 自動尋路應該可以在客戶端做. 碰撞檢測需要在客戶端和伺服器端都做, 伺服器端也需要建模.. 我現在也在找一些處理方案..如果有資料希望共享下... 關於自動尋路,剛剛看了篇文章,感覺真的沒有那麼多必要, 但這篇文章只能作為參考. lnk: http://www.pixelgame.net/bbs/viewthread.php?tid=7774
推薦閱讀:
※這個戰力數值問題有沒有算錯?怎麼理解?
※如何自動生成lua綁定C++的代碼?
※文明5渲染分析:樹林
※3D遊戲開發團隊使用git進行版本控制時,怎麼處理二進位文件?
※為什麼遠程合作的遊戲項目不好做(1)