地圖伺服器要判斷玩家的移動是否合法 那是不是要載入整個地圖數據到內存 出入遊戲圈 多謝前輩指點


不是遊戲製作人員,靠經驗來猜測一下地圖地形是封裝在客戶端里的,障礙和能否越過應該是遊戲引擎里寫好的東西,不用反饋給伺服器,但是百密總有一疏,所以你可以看到幾乎所有的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表示此格子不可行走)。顯示部分只有客戶端需要,行走功能一般是客戶端計算可行走區域數據來實現,假如伺服器需要驗證當前玩家的位置是否合法,也用數據部分。或者你直接把行走放到伺服器來實現,但這樣很浪費.......
伺服器會有一個簡略版地圖數據

首先,要知道玩家移動合法判斷和載入整個地圖數據沒有任何聯繫。

其次,你遊戲上線的時候伺服器會知道你的位置;

然後,你想要提出移動位置指令的時候,伺服器會經過幾個關口的校驗把控才會發出讓你合法移動的指令。

最後,這個過程想要加掛成本是非常高昂的,基本沒有成功的可能。
推薦閱讀:
相关文章