在客戶端——服務(wù)端架構(gòu)中莹痢,無論是用什么樣的同步方法并炮,都始終遵循如下的一個過程:某個客戶端向服務(wù)端發(fā)送一條消息,服務(wù)器收到后稍作處理引几,把它廣播給所需的客戶端。所傳遞的消息可以是角色的位置、血量這樣的狀態(tài)值伟桅,也可以是“向前走”這樣的指令值敞掘。前者稱之為狀態(tài)同步,后者稱之為指令同步楣铁。
狀態(tài)同步傳輸?shù)臄?shù)據(jù)量大玖雁、傳輸頻率低、主要邏輯在服務(wù)器(服務(wù)器運算壓力大)盖腕、網(wǎng)絡(luò)要求一般赫冬。幀同步傳輸數(shù)據(jù)量小,傳輸頻率高溃列,主要邏輯在客戶端(服務(wù)器壓力芯⒀帷)、網(wǎng)絡(luò)要求高听隐。
直接狀態(tài)同步的瞬移問題
假如客戶端每0.5秒發(fā)送一個位置信息补鼻,其他客戶端若直接對應(yīng)角色的位置信息,就會產(chǎn)生瞬移的效果雅任。為了解決這個問題风范,引出了跟隨算法和預(yù)測算法。
- 跟隨算法沪么∨鹦觯客戶端不直接將角色拉到目的地,而是讓角色以一定的速度移動成玫。這樣做的問題是客戶端之間有一定的誤差加酵。
- 預(yù)測算法。為了減少誤差哭当,可以讓角色提前走到某個預(yù)測的位置上去猪腕。
指令同步的誤差積累問題
指令同步的基本思想是,相同的時間+相同的輸入=相同的輸出钦勘。因此陋葡,如果要有隨機元素,需要使用相同的隨機種子彻采,該隨機種子一般是從服務(wù)器獲取腐缤。
由于網(wǎng)絡(luò)壞境和客戶端計算能力的不同,在收到指令之后肛响,雖然執(zhí)行的是相同的邏輯岭粤,但執(zhí)行的速度可能不一致,導(dǎo)致客戶端看到的內(nèi)容有所不同特笋。并且剃浇,這種誤差是可以積累的。
同步幀
為了保證所有客戶端的表現(xiàn)一致,在發(fā)送指令的時候附帶時間信息虎囚,客戶端根據(jù)指令的時間信息去修正更新的計算方式角塑,使所有的客戶端表現(xiàn)一致。這里淘讥,定義了“幀”的概念圃伶,來表示時間。同步幀蒲列,我的理解是窒朋,在某個時間內(nèi),必須執(zhí)行完所有所有的指令蝗岖。
區(qū)分各個客戶端
在一個多人的游戲內(nèi)炼邀,一個指令可能會觸發(fā)多次,這時候服務(wù)器需要判斷一下剪侮,只轉(zhuǎn)發(fā)其中一個,不然會出現(xiàn)多次觸發(fā)的問題洛退。