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....