最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

MMORPG網絡游戲如何實現玩家同步

2022-10-31 17:34 作者:游戲開發(fā)RAIN  | 我要投稿

在很多開發(fā)者的眼里,網絡游戲是如何實現玩家同步,這點一直很神秘,特別是沒有做過大型網絡游戲項目的小伙伴,今天我們一起來分享一下網絡游戲是如何來實現多玩家同步的。網絡游戲同步,從技術方向來說有兩個,一個是狀態(tài)同步,一個是幀同步。

???狀態(tài)同步是如何實現的呢?其實很簡單,就是服務器上跑游戲邏輯,服務器通過網絡接收玩家的輸入,在服務器計算游戲邏輯,推進游戲進度向前發(fā)展,如果有狀態(tài)改變和產生了重要的事件,把狀態(tài)同步給感興趣的客戶端,客戶端播放動畫即可。這里需要重點解決的一些技術問題,接下來我們總結并分析下如何實現。

1: 服務器基于幀率來迭代游戲邏輯

服務端游戲邏輯和客戶端一樣,也是基于幀頻來迭代計算的,這個幀率的設置目前有兩大方向,一個是固定的幀率(比如1秒20次迭代計算),有一種是動態(tài)的改變幀率。很多游戲都采用簡單一點的固定幀率來做。幀率沒有必要像客戶端一樣,60FPS,客戶端維持60FPS是為了維持動畫的流暢,而服務器上完全沒有必要維持這么高的幀率,幀率越低,意味著計算量越少,同時為了游戲手感,一般服務器的以幀率15FPS--->20FPS來觸發(fā)。如果有一些迭代進度比較高的可以采用FixedUpdate機制,拿20FPS為例, 那么幀的時間間隔就是50ms, 如果有一些高精度的迭代,要求60FPS,也就是16ms就要迭代一次,這個怎么辦呢?那么采用fixedUpdate, 將50ms 分成幾次迭代,每次迭代的時間間隔為16ms這個就是FixedUpdate機制。如物理引擎,為了防止穿透,如果你迭代的次數少,時間間隔長,那么迭代計算后,可能容易穿透,那FixedUpdate來迭代物理引擎,增加迭代次數,這樣能讓物理計算更精準。基于幀頻,我們編寫游戲邏輯就像客戶端一樣了,但是只是不用管UI,和動畫這些表現而已。聽上去很蠻煩,其實寫起來也簡單。基于幀率的模式設計完成后,再實現一些基于幀率的常用的模塊,比如游戲中的定時器等。

2: 服務器上跑游戲地圖

???服務器上幀頻的機制確立好以后,接下來就是要部署一個地圖在服務器上,服務器的地圖如何做呢?其實很簡單,如果是2D地圖,我們把地圖看作是一個xoy平面,把地圖分成一些小塊,并在平面上標記出來哪些區(qū)域塊是障礙物,哪些可以行走。這個數據可以在客戶端的地圖編輯器編輯好,并把這個數據導出來給服務器用。如果是3D游戲,俯瞰游戲3D地圖,將地圖看作一個平面,和2D一樣標記區(qū)域,哪些是障礙物,哪些是路徑,如果你的3D游戲地圖中,沒有上坡和下坡,那么就和普通的2D游戲沒有區(qū)別,如果有上坡下坡,就讓客戶端把地圖的高度圖導出來,你給定一個(x, z), 可以得到一個y的高度值。 地圖數據確立好后,接下來就要編寫服務器上的尋路算法與導航,能控制服務器上的玩家對象在地圖上移動,當然這些都是數據,沒有圖像。

服務器上跑地圖,要結合客戶端做一個地圖編輯器,地圖編輯器導出地圖數據給服務器。

3:玩家行走時,服務器如何同步?

??服務器上的地圖數據,尋路導航模塊做好以后,就可以獨立的讓游戲角色在地圖上移動了。那么有一個很經典的問題就出現了,這也是很多小伙伴搞不懂的一個點,服務器上游戲角色每次移動的時候,是否要把位置同步給客戶端呢?答案肯定是不用,也沒有必要。那么什么時候同步位置,客戶端有如何處理呢?我們一起來分析詳細的過程。

??先考慮一個客戶端,當玩家A在客戶端的地圖上點了一下鼠標以后,它會把地圖的目標點發(fā)送給服務器,服務器檢查這個目標點,玩家A是否可以行走,(點是否為障礙物,點是否距離玩家A太遠,疑似外掛等)如果玩家A不可以行走,什么都不處理或返回一個狀態(tài)碼給客戶端,表示不可行走。如果玩家A可以走到目標點,那么服務器會通知所有能看見玩家A的客戶端(包含玩家A),告訴它們,玩家A要走向那個目的地,這些客戶端收到消息后,本地尋路導航移動播放動畫,在這個過程中,不用同步任何服務器上的數據,服務器跑服務器的,客戶端跑客戶端的。直到服務器上玩家A走到目的地,然后服務器又給能看見玩家A的所有客戶端(包含玩家A)同步一下服務器中玩家A的位置,這樣這些客戶端玩家A的位置就同步到服務器上對應的點了。這里其實就是征詢一個原則,行走的時候,如果狀態(tài)變化,那么先同步位置等狀態(tài),再基于同步后的狀態(tài)處理下一件事情。服務器玩家A開始行走,到達后狀態(tài)變化,由行走變?yōu)榇龣C,這樣就要同步位置。

如果在行走中遇到了一個敵人,發(fā)起攻擊怎么辦呢?還是遵循這個原則,只要狀態(tài)變化了,先同步玩家的最新狀態(tài)(位置,方向等)。再做后面的動作。這樣會不會有作弊呢?不會,因為服務器上跑的是真實的數據,所有結果都是服務器算出來后通知客戶端的。

4: AOI技術: 如何查找感興趣的其他玩家。

???AOI算法主要由兩個方向,九宮格與十字鏈表。今天來給大家分享九宮格算法。九宮格算法其實非常簡單,如圖:

我們對整個地圖,用一個個視野塊來劃分(藍色線框為一個塊,和地圖塊是不一樣的), ?以玩家所在的區(qū)域為中心,周圍一圈就是這個玩家的AOI區(qū)域形狀,?先確定把地圖分成幾x幾的視野塊, 以多大的視野塊來地圖合適呢?確定視野大小, 可以根據攝象機來的視野來預估。攝像機的視野多寬,我們大概預估一下計算出來視野塊大小。?九宮格算法還有一個優(yōu)勢, 對"我"敢興趣的玩家在九宮格里面, 我感興趣的玩家也在九宮格里面。每個格子負責維護它里面的玩家,這樣我們就可以快速的找出來"我"感興趣的玩家,和對"我"感興趣的玩家。

?????當玩家移動的時候,如果我們會發(fā)生了AOI區(qū)域的變化,如圖: 新的AOI為紅色框。


a: 不在原來的AOI區(qū)域,?在新的AOI區(qū)域內新加的塊,那我們就要把這些新加的塊里的玩家先同步到你這個客戶端,你所在的客戶端把新進入視野的玩家創(chuàng)建出來,同時你要把你自己的最新狀態(tài),同步給新進來的玩家客戶端,新進玩家的客戶端,也會把你這個角色創(chuàng)建出來,你看到別人的同時,也要讓別人看到你。

?b: 在原AOI區(qū)域又在新AOI區(qū)域,?AOI區(qū)域沒有變化的塊,我們不用做任何處理;

c: 在原來的AOI區(qū)域內,但是不在新的AOI區(qū)域內: ?你就要告訴這些玩家,你離開了,這些玩家的客戶端,就把你刪掉,它們就看不見你了,同時還要把這些玩家發(fā)給你,表示說這些玩家你看不見了,你把這些角色刪除就可以了。

?今天MMORPG 狀態(tài)同步要解決的主要的核心問題,就寫到這里,下次再寫幀同步。

?


MMORPG網絡游戲如何實現玩家同步的評論 (共 條)

分享到微博請遵守國家法律
湖口县| 诸暨市| 库车县| 铁岭市| 梨树县| 秦皇岛市| 当涂县| 辽中县| 墨竹工卡县| 邵阳市| 永川市| 许昌县| 法库县| 平潭县| 太谷县| 凤冈县| 海安县| 保山市| 通许县| 连山| 涪陵区| 同仁县| 嘉祥县| 新晃| 托克托县| 平昌县| 嫩江县| 嘉黎县| 洪泽县| 防城港市| 呼图壁县| 郁南县| 吉木乃县| 烟台市| 巫溪县| 道真| 沭阳县| 渝北区| 海晏县| 稷山县| 饶河县|