帧同步

帧同步的两种实现方式:

第一种:客户端插帧,第二种服务器插帧。

算法概念

该算法普遍要求网速RTT要在100ms以内,一般人数不超过8人,在这样的情况下,可以像单机游戏一样编写网络游戏。所有客户端任意时刻逻辑都是统一的,缺点是一个人卡机,所有人等待。

1.客户端定时(比如每五帧)上传控制信息。
2.服务器收到所有控制信息后广播给所有客户。
3.客户端用服务器发来的更新消息中的控制信息进行游戏。
4.如果客户端进行到下一个关键帧(5帧后)时没有收到服务器的更新消息则等待。
5.如果客户端进行到下一个关键帧时已经接收到了服务器的更新消息,则将上面的数据用于游戏,并采集当前鼠标键盘输入发送给服务器,同时继续进行下去。
6.服务端采集到所有数据后再次发送下一个关键帧更新消息。

这个等待关键帧更新数据的过程称为“帧锁定”
应用案例:大部分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)

 

 

 

 
 http://blog.csdn.net/erlib/article/details/46772749                 格斗游戏如何实现同步?
http://finance.sina.com.cn/stock/hkstock/hkstocknews/2017-05-13/doc-ifyfekhi7555611.shtml           《王者荣耀》回炉历程
http://www.10tiao.com/html/752/201707/2651042833/1.html                  Unite 2017 | 从《闹闹天宫》看MOBA游戏里的网络同步技术

 

 

刚才提到该帧同步与buffer,这个buffer可以是1也可以到n,我们要解决我们的延迟问题,我们就让buffer足够小。事实上《王者荣耀》最后做到的buffer是零,它不需要buffer,服务器给了我n,马上知道是n,我收到n,我知道下一次肯定是n+1,所以我收到n之后马上就把n这一帧的输入执行了。

那么为什么不卡顿了,画面不抖动了?

最后一个关键点,是本地插值平滑加逻辑与表现分离。客户端只负责一些模型、动画、它的位置,它会根据绑定的逻辑对象状态、速度、方向来进行一个插值,这样可以做到我们的逻辑帧率和渲染帧率不一样,但是做了插值平滑和逻辑表现分离,画面不抖了,延迟感也是很好的。

 

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

 

posted @ 2017-09-15 17:37  轻典  阅读(1008)  评论(0编辑  收藏  举报