zoukankan      html  css  js  c++  java
  • 帧同步

    帧同步的两种实现方式:

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

    算法概念

    该算法普遍要求网速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

  • 相关阅读:
    深入理解 JavaScript(五)
    深入理解 JavaScript(四)
    深入理解 JavaScript(三)
    opecv官网接口查询
    一个python-opencv博客
    Python中range和xrange的区别
    【转载】opencv 二值化函数——cv2.threshold
    python-opencv中的cv2.inRange函数
    anaconda conda install wxpython4 安装包 python3环境(GUI)
    python之assert
  • 原文地址:https://www.cnblogs.com/tianyajuanke/p/7527569.html
Copyright © 2011-2022 走看看