手機格鬥網遊該如何避免延遲?

2021-09-02 12:21:13 字數 1595 閱讀 4411

gameres游資網授權發布 文 / 韋易笑

早期 rts,xbox360 live遊戲常用同步策略是什麼?格鬥遊戲多人聯機如何保證流暢性和一致性?如何才能像單機遊戲一樣編寫網遊?

演算法概念

該演算法普遍要求網速rtt要在100ms以內,一般人數不超過8人,在這樣的情況下,可以像單機遊戲一樣編寫網路遊戲。所有客戶端任意時刻邏輯都是統一的,缺點是乙個人卡機,所有人等待。

1.客戶端定時(比如每五幀)上傳控制資訊。

2.伺服器收到所有控制資訊後廣播給所有客戶。

3.客戶端用伺服器發來的更新訊息中的控制資訊進行遊戲。

4.如果客戶端進行到下乙個關鍵幀(5幀後)時沒有收到伺服器的更新訊息則等待。

5.如果客戶端進行到下乙個關鍵幀時已經接收到了伺服器的更新訊息,則將上面的資料用於遊戲,並採集當前滑鼠鍵盤輸入傳送給伺服器,同時繼續進行下去。

6.服務端採集到所有資料後再次傳送下乙個關鍵幀更新訊息。

這個等待關鍵幀更新資料的過程稱為「幀鎖定」

應用案例:大部分rts遊戲,街霸ii(xbox360),callus模擬器。

演算法流程

客戶端邏輯:

判斷當前幀f是否關鍵幀k1:如果不是跳轉(7)。

如果是關鍵幀,則察看有沒有k1的update資料,如果沒有的話重複2等待。

採集當前k1的輸入作為ctrl資料與k1編號一起傳送給伺服器

從update k1中得到下乙個關鍵幀的號碼k2以及到下乙個關鍵幀之間的輸入資料i。

從這個關鍵幀到下 乙個關鍵幀k2之間的虛擬輸入都用i。

令k1 = k2。

執行該幀邏輯:

跳轉(1)

服務端邏輯:

收集所有客戶端本關鍵幀k1的ctrl資料(ctrl-k)等待知道收集完成所有的ctrl-k。

根據所有ctrl-k,計算下乙個關鍵幀k2的update,計算再下乙個關鍵幀的編號k3。

將update傳送給所有客戶端

令k1=k2

跳轉(1)

伺服器根據所有客戶端的最大rtt,平滑計算下乙個關鍵幀的編號,讓延遲根據網路情況自動調整。

演算法演示

我根據該演算法將街機模擬器修改出了乙個可用於多人對戰的版本,早期有乙個叫做kaillera的東西,可以幫助模擬器實現多人聯機,但是並沒有作幀鎖 定,只是簡單將鍵盤訊息進行收集廣播而已,後來capcom在psp和360上都出過街霸的聯網版本,但是聯網效果不理想。這個演算法其實區域網有細就經常 使用了,只是近年來公網速度提高,很容易找到rtt<50ms的伺服器,因此根據上述演算法,在平均rtt=100ms(操作靈敏度1/10秒),情 況下,保證自動計算關鍵幀適應各種網路條件後,就能夠像編寫單機遊戲一樣開發網遊,而不需狀態上作複雜的位置/狀態同步。

從上圖的演示中可以看到,兩個模擬器程序都在執行1941這個遊戲,兩邊客戶端使用了該演算法,將邏輯統一在乙個整體中。

最後這張圖是執行kof99的效果圖,兩邊完美同步,上圖是我開發的街機對戰效果,在公網環境下,只要不是小型寬頻使用者,一般電信或者聯通使用者都能有乙個比較好的體驗。

幀間無等待改進

Redis資料庫 如何避免網路延遲問題?

我們知道redis協議是構建在tcp協議之上的。所以當我們在指令碼中呼叫redis時,通常是以傳送 應答 再傳送 再應答的模式進行的,而每一次傳送與應答,都需要資料從客戶端到服務端飛一次。而且,這一切都是預設的。當你需要使用redis處理多個命令時,這樣時間都消耗到網路延遲上可能就不划算了,下面是幾...

職場分享 職場新人該如何避免走彎路

一 明確方向,做好職業定位 方向不明,無以為動。職業方向不明確導致不少人成了職場上的弱勢群體。如何抉擇職業,這個問題一直困擾著他們。那麼如何找到適合自己的職業發展方向是他們所面臨的根本問題。二 解自我喜好 三 利用優勢 每個人都有自己最擅長的地方。在職業發展上,要做的就是最大化的 揚長 這樣才能安身...

手機遊戲該如何設計盈利模式?

1.手機遊戲如何賺錢?相信這個是所有商家最頭疼的事情。目前為止還沒有乙個主導的盈利模式。2.手機遊戲什麼型別最流行?3.手機遊戲做單機的還是做網路的?相信這個也是所有商家比較頭疼的事情。4.手機遊戲有什麼優勢?為什麼使用者會選擇手機而不選擇pc呢?這些都是非常嚴峻的問題。手機遊戲的優勢有那些呢?a....