MMORPG網(wǎng)絡游戲如何實現(xiàn)玩家同步
在很多開發(fā)者的眼里,網(wǎng)絡游戲是如何實現(xiàn)玩家同步,這點一直很神秘,特別是沒有做過大型網(wǎng)絡游戲項目的小伙伴,今天我們一起來分享一下網(wǎng)絡游戲是如何來實現(xiàn)多玩家同步的。網(wǎng)絡游戲同步,從技術方向來說有兩個,一個是狀態(tài)同步,一個是幀同步。
? ?狀態(tài)同步是如何實現(xiàn)的呢?其實很簡單,就是服務器上跑游戲邏輯,服務器通過網(wǎng)絡接收玩家的輸入,在服務器計算游戲邏輯,推進游戲進度向前發(fā)展,如果有狀態(tài)改變和產(chǎn)生了重要的事件,把狀態(tài)同步給感興趣的客戶端,客戶端播放動畫即可。這里需要重點解決的一些技術問題,接下來我們總結并分析下如何實現(xiàn)。

? ?1: 服務器基于幀率來迭代游戲邏輯
服務端游戲邏輯和客戶端一樣,也是基于幀頻來迭代計算的,這個幀率的設置目前有兩大方向,一個是固定的幀率(比如1秒20次迭代計算),有一種是動態(tài)的改變幀率。很多游戲都采用簡單一點的固定幀率來做。幀率沒有必要像客戶端一樣,60FPS,客戶端維持60FPS是為了維持動畫的流暢,而服務器上完全沒有必要維持這么高的幀率,幀率越低,意味著計算量越少,同時為了游戲手感,一般服務器的以幀率15FPS--->20FPS來觸發(fā)。如果有一些迭代進度比較高的可以采用FixedUpdate機制,拿20FPS為例, 那么幀的時間間隔就是50ms, 如果有一些高精度的迭代,要求60FPS,也就是16ms就要迭代一次,這個怎么辦呢?那么采用fixedUpdate, 將50ms 分成幾次迭代,每次迭代的時間間隔為16ms這個就是FixedUpdate機制。如物理引擎,為了防止穿透,如果你迭代的次數(shù)少,時間間隔長,那么迭代計算后,可能容易穿透,那FixedUpdate來迭代物理引擎,增加迭代次數(shù),這樣能讓物理計算更精準?;趲l,我們編寫游戲邏輯就像客戶端一樣了,但是只是不用管UI,和動畫這些表現(xiàn)而已。聽上去很蠻煩,其實寫起來也簡單?;趲实哪J皆O計完成后,再實現(xiàn)一些基于幀率的常用的模塊,比如游戲中的定時器等。
?2: 服務器上跑游戲地圖
? ?服務器上幀頻的機制確立好以后,接下來就是要部署一個地圖在服務器上,服務器的地圖如何做呢?其實很簡單,如果是2D地圖,我們把地圖看作是一個xoy平面,把地圖分成一些小塊,并在平面上標記出來哪些區(qū)域塊是障礙物,哪些可以行走。這個數(shù)據(jù)可以在客戶端的地圖編輯器編輯好,并把這個數(shù)據(jù)導出來給服務器用。如果是3D游戲,俯瞰游戲3D地圖,將地圖看作一個平面,和2D一樣標記區(qū)域,哪些是障礙物,哪些是路徑,如果你的3D游戲地圖中,沒有上坡和下坡,那么就和普通的2D游戲沒有區(qū)別,如果有上坡下坡,就讓客戶端把地圖的高度圖導出來,你給定一個(x, z), 可以得到一個y的高度值。 地圖數(shù)據(jù)確立好后,接下來就要編寫服務器上的尋路算法與導航,能控制服務器上的玩家對象在地圖上移動,當然這些都是數(shù)據(jù),沒有圖像。
服務器上跑地圖,要結合客戶端做一個地圖編輯器,地圖編輯器導出地圖數(shù)據(jù)給服務器。

附視頻教程 點擊可直接學習
MMORPG狀態(tài)同步視頻教程
https://bycwedu.vipwan.cn/promotion_channels/1228978875
為視頻教程制作者Blake老師打CALL 下次再寫幀同步。