第一種:客戶端插幀,第二種服務器插幀。php
算法概念html
該算法廣泛要求網速RTT要在100ms之內,通常人數不超過8人,在這樣的狀況下,能夠像單機遊戲同樣編寫網絡遊戲。全部客戶端任意時刻邏輯都是統一的,缺點是一我的卡機,全部人等待。git
1.客戶端定時(好比每五幀)上傳控制信息。
2.服務器收到全部控制信息後廣播給全部客戶。
3.客戶端用服務器發來的更新消息中的控制信息進行遊戲。
4.若是客戶端進行到下一個關鍵幀(5幀後)時沒有收到服務器的更新消息則等待。
5.若是客戶端進行到下一個關鍵幀時已經接收到了服務器的更新消息,則將上面的數據用於遊戲,並採集當前鼠標鍵盤輸入發送給服務器,同時繼續進行下去。
6.服務端採集到全部數據後再次發送下一個關鍵幀更新消息。github
這個等待關鍵幀更新數據的過程稱爲「幀鎖定」
應用案例:大部分RTS遊戲,街霸II(xbox360),Callus模擬器。算法
算法流程服務器
客戶端邏輯:
1. 判斷當前幀F是否關鍵幀K1:若是不是跳轉(7)。
2. 若是是關鍵幀,則察看有沒有K1的UPDATE數據,若是沒有的話重複2等待。
3. 採集當前K1的輸入做爲CTRL數據與K1編號一塊兒發送給服務器
4. 從UPDATE K1中獲得下一個關鍵幀的號碼K2以及到下一個關鍵幀之間的輸入數據I。
5. 從這個關鍵幀到下 一個關鍵幀K2之間的虛擬輸入都用I。
6. 令K1 = K2。
7. 執行該幀邏輯
8. 跳轉(1)網絡
服務端邏輯:
1. 收集全部客戶端本關鍵幀K1的CTRL數據(Ctrl-K)等待知道收集完成全部的CTRL-K。
2. 根據全部CTRL-K,計算下一個關鍵幀K2的Update,計算再下一個關鍵幀的編號K3。
3. 將Update發送給全部客戶端
4. 令K1=K2
5. 跳轉(1)ide
剛纔提到該幀同步與buffer,這個buffer能夠是1也能夠到n,咱們要解決咱們的延遲問題,咱們就讓buffer足夠小。事實上《王者榮耀》最後作到的buffer是零,它不須要buffer,服務器給了我n,立刻知道是n,我收到n,我知道下一次確定是n+1,因此我收到n以後立刻就把n這一幀的輸入執行了。動畫
那麼爲何不卡頓了,畫面不抖動了?.net
最後一個關鍵點,是本地插值平滑加邏輯與表現分離。客戶端只負責一些模型、動畫、它的位置,它會根據綁定的邏輯對象狀態、速度、方向來進行一個插值,這樣能夠作到咱們的邏輯幀率和渲染幀率不同,可是作了插值平滑和邏輯表現分離,畫面不抖了,延遲感也是很好的。
http://www.cocoachina.com/game/20150827/13234.html
http://blog.csdn.net/langresser_king/article/details/51330543
https://github.com/SnpM/LockstepFramework
http://www.360doc.com/content/17/0424/15/6432946_648246185.shtml
http://gad.qq.com/article/detail/27330
http://jjyy.guru/unity3d-lock-step-part-1
http://jjyy.guru/fast-paced-multiplayer-part1
http://jjyy.guru/about-lockstep
http://blog.csdn.net/langresser_king/article/details/46756393
http://forum.china.unity3d.com/forum.php?mod=viewthread&tid=25828
http://www.jianshu.com/p/8bf0d4c1d780
http://www.zhust.com/index.php/tag/%E5%B8%A7%E5%90%8C%E6%AD%A5/
http://www.taidous.com/thread-36402-1-1.html
https://answer.uwa4d.com/question/59488b5a252497237a7c3f9e/%E5%B8%A7%E5%90%8C%E6%AD%A5%E6%A1%86%E6%9E%B6%E4%B8%8B-%E6%B8%B8%E6%88%8F%E9%80%BB%E8%BE%91%E7%9A%84%E6%B5%AE%E7%82%B9%E6%95%B0%E7%B2%BE%E5%BA%A6%E5%9C%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E5%B9%B3%E5%8F%B0%E6%88%96%E4%B8%8D%E5%90%8C%E7%9A%84%E6%9C%BA%E5%99%A8%E4%B8%8D%E4%B8%80%E8%87%B4≈
https://www.zhihu.com/question/36258781
http://www.sohu.com/a/153269736_163917
http://blog.csdn.net/erlib/article/details/46772749 格鬥遊戲如何實現同步?
英文系列文章:
http://www.gabrielgambetta.com/fpm1.html
http://www.gabrielgambetta.com/client-side-prediction-server-reconciliation.html
http://www.gabrielgambetta.com/entity-interpolation.html
http://www.gabrielgambetta.com/lag-compensation.html
http://www.gabrielgambetta.com/lag-compensation.html