第一种:客户端插帧,第二种服务器插帧。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