Kas*_*dum 32 c# networking synchronization
我实现了服务器/客户端架构,所有状态更改都发送到函数,验证并广播到所有连接的客户端.这种方法效果很好,但系统目前还没有在游戏的客户端实例之间保持同步.
如果服务器和特定客户端之间恰好有5秒的延迟,那么他将在其余客户端5秒后收到状态更改,从而使他的游戏状态不同步.我一直在寻找各种方法来实现客户端之间的同步系统,但到目前为止还没有找到多少.
我是网络编程的新手,并不是那么天真地认为我可以自己发明一个工作系统而不需要花费大量时间.然而,我所拥有的想法是保留某种时间系统,因此每个状态更改都将与游戏中的特定时间戳相关联.这样,当客户端收到状态更改时,它将准确知道更改发生在游戏的哪个时段,并且反过来能够关联延迟.这种方法的问题在于,在那些n秒延迟游戏将继续在客户端,因此客户端将不得不及时回滚以更新状态更改,这肯定会变得混乱.
所以我正在寻找论文讨论解决它的主题或算法.也许我对多人游戏系统如何工作的整体设计存在缺陷,在某种意义上说,除非从服务器收到概念,否则客户端的游戏实例不应该更新?现在客户只是在游戏循环中更新自己,假设任何状态都没有改变.
Mar*_*ris 16
对此的基本方法是称为Dead Reckoning,可以在这里找到一篇关于它的非常好的文章.基本上,它是一种预测算法,用于在服务器更新之间的时间内猜测实体位置.
有更多先进的方法论建立在这个概念的基础上,但它是一个很好的起点.
还可以在这里找到如何在源引擎(Valve的第一个半生命游戏的引擎)中处理它的描述,原理基本相同 - 直到服务器告诉你否则使用预测算法来移动实体沿着预期的路径 - 但是这篇文章处理了它对尝试更深入地拍摄内容的影响.
永远不会有办法保证实时跨多个视点的完美同步 - 物理定律使其变得不可能.如果太阳现在爆炸了,你怎么能保证半人马座阿尔法里的观察者能够像我们在地球上一样看到超新星?信息需要时间旅行.
因此,您可以选择准确地模拟所有内容,延迟可能因观看者而异(您目前的情况不同),或者在没有延迟的情况下对其进行不准确的建模,并在观众之间进行广泛的同步(这是预测/航位推算/外推的来源)在).像实时战略这样的较慢的游戏倾向于走第一条路线,更快的游戏走向第二条路线.
特别是,你永远不应该假设旅行所需的时间是不变的.这意味着仅仅发送启动和停止消息来移动实体在任何一种模型下都是不够的.您需要定期发送实际状态更新(通常每秒几次以获得更快的游戏),以便收件人可以更正其预测和插值中的错误.
归档时间: |
|
查看次数: |
15094 次 |
最近记录: |