我实现了服务器/客户端架构,其中所有状态更改都发送到函数,经过验证并广播到所有连接的客户端。这工作得相当好,但系统目前无法维持游戏客户端实例之间的同步。
如果服务器和特定客户端之间恰好有 5 秒的延迟,那么他将在其他客户端之后 5 秒收到状态更改,从而使他的游戏状态不同步。我一直在寻找各种方法来实现客户端之间的同步系统,但到目前为止还没有找到太多。
我是网络编程的新手,并不天真地认为我可以自己发明一个工作系统,而无需投入大量时间。然而,我一直以来的想法是保留某种时间系统,因此每个状态更改都将与游戏中的特定时间戳相关联。这样,当客户端收到状态更改时,它就会准确地知道更改发生在游戏的哪个时期,并且反过来能够关联延迟。这种方法的问题在于,在那些n延迟几秒后,游戏将在客户端继续进行,因此客户端必须及时回滚以更新状态更改,这肯定会变得混乱。
所以我正在寻找讨论解决该问题的主题或算法的论文。也许我对多人游戏系统如何工作的整个设计是有缺陷的,从某种意义上说,除非从服务器收到概念,否则客户端的游戏实例不应更新?现在,客户端只是在游戏循环中更新自己,假设任何状态都没有改变。
基本的方法就是所谓的航位推算 https://www.gamasutra.com/view/feature/131638/dead_reckoning_latency_hiding_for_.php可以在这里找到一篇关于它的非常好的文章。基本上,它是一种预测算法,用于猜测服务器更新之间的时间实体位置。
有更先进的方法建立在这个概念的基础上,但它是一个很好的起点。
还可以找到有关如何在源引擎(第一款《半条命》游戏的 Valve 引擎)中处理此问题的描述here http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking,原理基本上是相同的 - 直到服务器告诉您使用预测算法沿着预期路径移动实体 - 但本文处理这对尝试更深入地拍摄某些内容所产生的影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)