MMORPG 遊戲中的地圖伺服器是如何實現的?
地圖伺服器要判斷玩家的移動是否合法 那是不是要載入整個地圖數據到內存 出入遊戲圈 多謝前輩指點
不是遊戲製作人員,靠經驗來猜測一下地圖地形是封裝在客戶端里的,障礙和能否越過應該是遊戲引擎里寫好的東西,不用反饋給伺服器,但是百密總有一疏,所以你可以看到幾乎所有的3DMMO都有一些地圖上的「死角」
遊戲中的地圖都是分塊載入的,而人物所在的位置數據是用坐標來記錄的,伺服器只用判斷坐標位置是否在當前這塊地圖的範圍內,即可判斷角色的移動是否合法
看情況
比較嚴格的伺服器是和客戶端共享地圖數據的,不同只是伺服器不需要地圖貼圖之類的資源而已。
對於地圖格子,碰撞,都是數據而已,伺服器和客戶端都會持有對應的數據並運行相同的演算法。
這也是為什麼很多遊戲有伺服器導航的功能。
但是這些都是老東西了,新項目一般都不會這麼干,因為費力不討好。
客戶端作弊這種東西,現在是記錄優於防範,目前的流行是伺服器不處理客戶端的玩家動作行為,只校驗,但是不修正,修正成本太高。尤其是移動互聯網,鬼知道他是外掛還是網路不好。
校驗不通過就記錄,超過一定數量自動封停。省時省力省心。首先並不是所有遊戲都有需要 「判斷玩家的移動是否合法」 這個需求的,一般時間收費的遊戲更看重這一點,時間收費的就是希望你多多在大地圖上跑圖,好賺點卡錢,對傳送類外掛的打擊也比較嚴厲的,所以服務端校驗移動包比較嚴格的。
那麼怎麼校驗呢,伺服器上有一張地圖掩碼,比如一個10m×10m的地圖,以1m為單位劃分單元格。希望校驗的更準確就用更小的格子。客戶端和伺服器一般統一標準劃分,因為客戶端也依賴這些劃分的小格子做A*。得到一個10×10的二維數組,每一個元素對應一個格子是否可以通行。能,或者不能,僅有兩個狀態,用1位表示即可。則一個位元組8位,可以表示8個格子。則10m×10m的地圖掩碼需要 10 × 10 / 8 向上取整,13個位元組即可表示。
客戶端滑鼠點擊地面,或者點擊小地圖,尋路這一步一般先由客戶端完成,得到一組拐點,包括起點和終點,拐點和拐點之間就是直線行走了。客戶端的一次不規則移動,由多次的直線移動組成。客戶端每次向伺服器發送下一個拐點(即本次直線移動的目標點),伺服器驗證客戶端當前坐標和目標點之間的連線,所經過的每一個1m×1m的單元格所對應的地圖掩碼是否可以通行。如果本次移動的直線路徑會穿過不可通行的單元格,伺服器計算一個碰到障礙前的新坐標做為目標點返回客戶端(也可以粗暴點,不計算,直接將客戶端拉回本次移動的起點)。多次出現非法路徑的客戶端視為外掛。有個專門的服務用來處理位置問題,載不進去?全國地圖也就幾個G.
根據各種圖片拼接出來的
服務端是要載入所有地圖以及所有在線玩家,按照客戶端發送的操作效驗後廣播給其他玩家。
我說下2D地圖:一般做法會把地圖分成兩部分,一個是顯示(圖片或者動畫),一個是可行走區域的數據(可以用一堆0101.來表示,50*50為一個格子,0表示此格子可行走,1表示此格子不可行走)。顯示部分只有客戶端需要,行走功能一般是客戶端計算可行走區域數據來實現,假如伺服器需要驗證當前玩家的位置是否合法,也用數據部分。或者你直接把行走放到伺服器來實現,但這樣很浪費.......
伺服器會有一個簡略版地圖數據
首先,要知道玩家移動合法判斷和載入整個地圖數據沒有任何聯繫。
其次,你遊戲上線的時候伺服器會知道你的位置;然後,你想要提出移動位置指令的時候,伺服器會經過幾個關口的校驗把控才會發出讓你合法移動的指令。
最後,這個過程想要加掛成本是非常高昂的,基本沒有成功的可能。推薦閱讀: