日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手机格斗网游该如何避免延迟?

發布時間:2024/8/26 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手机格斗网游该如何避免延迟? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

早期 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的效果圖,兩邊完美同步,上圖是我開發的街機對戰效果,在公網環境下,只要不是小型寬帶用戶,一般電信或者聯通用戶都能有一個比較好的體驗。

幀間無等待改進

針對傳統幀鎖定算法網速慢會卡到網速快的問題,實踐中線上動作游戲通常用“定時不等待”的方式再每次Interval時鐘發生時固定將操作廣播給所有用戶,不依賴具體每個玩家是否有操作更新:

單個用戶當前鍵盤上下左右攻擊跳躍是否按下用一個32位整數描述,服務端描述一局游戲中最多8玩家的鍵盤操作為:int player_keyboards[8];

服務端每秒鐘50次向所有客戶端發送更新消息(包含所有客戶端的操作和遞增的幀號): update=(FrameID,player_keyboards)

客戶端就像播放游戲錄像一樣不停的播放這些包含每幀所有玩家操作的update消息。

客戶端如果沒有update數據了,就必須等待,直到有數據到來。

客戶端如果一下子收到很多連續的update,則快進播放。

客戶端只有按鍵按下或者放開,就會發送消息給服務端(而不是到每幀開始才采集鍵盤),消息只包含一個整數。服務端收到以后,改寫player_keyboards

雖然網速慢的玩家網絡一卡,可能就被網速快的玩家給秒了(其他游戲也差不多)。但是網速慢的玩家不會卡到快的玩家,只會感覺自己操作延遲而已。另一個側面來說,土豪的網宿一般比較快,我們要照顧。

隨機數需要服務端提前將種子發給各個客戶端,各個客戶端算邏輯時用該種子生成隨機數,另外該例子以鍵盤操作為例,實際可以以更高級的操作為例,比如“正走向A點”,“正在攻擊”等。幀鎖定系列方法目前也成功的被應用到了若干線上實時動作游戲中。

關于幀鎖定系列的方法有很多類似實現(包括后面提到的幀間無等待改進,包括 Lock Step等),但是他們的核心都是一個:保證所有客戶端每幀的輸入都一樣。這樣的方式被格斗游戲,RTS和足球(FIFA類)、籃球(NBA)等體育和動作游戲大量使用,比如我們熟悉的各大戰網平臺游戲(Xbox Live等),還有很多基于模擬器的街機對戰平臺。以及不少大型多人橫版動作游戲。以開發便利,同步邏輯直觀而受到大家歡迎。

而近兩年動作游戲領域也涌現出一些新的改良方法,比如 Time Warp,以客戶端先行+邏輯不一致時回滾的方式,帶來了更好的同步效果,俗稱時間回退法。不果國內暫時沒看到有游戲這么嘗試,更多的是國外近兩年的雙人動作游戲比較多,要求游戲每幀狀態都可以保存,邏輯上開發會復雜一些。國內大部分是超過兩人出去副本的,在3-4人出去 PK的情況下,引入狀態回退,會讓整個效果大打折扣。不果2人的效果確實有所改進,有興趣的同學可以搜索 Time Warp相關的論文。

2009年,云游戲(游戲遠程渲染)技術得到廣泛應用,客戶端上傳操作,服務端遠程渲染,并以低延遲視頻編碼流的方式傳回給客戶端,用的就是這樣類似的技術。客戶端不需要高額的硬件,也不存在盜版問題,其中 Gaikai和 OnLive兩家公司做的比較好。

2012年,Sony推出 Playstation Now技術,可以在 PSV和 PS3/PS4上玩云游戲,玩家不需要購買游戲就可以免費體驗一定時間。使得 PSV/PS3等低端硬件也可以流暢的跑 PS4游戲。

但是目前國外網絡環境下跑的還比較流暢,國內的網絡環境要低延遲傳送 HD畫質的視頻流還比較困難,視頻都是比較費帶寬的。但是幀鎖定等保證每幀輸入一致的算法,在當今的網絡質量下傳遞一下玩家操作,還是沒有任何問題的。

總結

以上是生活随笔為你收集整理的手机格斗网游该如何避免延迟?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。