from: http://blog.codingnow.com/2006/04/sync.html
网络游戏的对时以及同步问题
大多数实时网络游戏,将 server 的时间和 client 的时间校对一致是可以带来许多其他系统设计上的便利的。这里说的对时,并非去调整 client 的 os 中的时钟,而是把 game client 内部的逻辑时间调整跟 server 一致即可。
一个粗略的对时方案可以是这样的,client 发一个数据包给 server,里面记录下发送时刻。server 收到后,立刻给这个数据包添加一个server 当前时刻信息,并发还给 client 。因为大部分情况下,game server 不会立刻处理这个包,所以,可以在处理时再加一个时刻。两者相减,client 可以算得包在 server 内部耽搁时间。
client 收到 server 发还的对时包时,因为他可以取出当初发送时自己附加的时刻信息,并知道当前时刻,也就可以算出这个数据包来回的行程时间。这里,我们假定数据包来回时间相同,那么把 server 通知的时间,加上行程时间的一半,则可以将 client 时间和 server 时间校对一致。
这个过程用 udp 协议做比用 tcp 协议来的好。因为 tcp 协议可能因为丢包重发引起教大误差,而 udp 则是自己控制,这个误差要小的多。只是,现在网络游戏用 tcp 协议实现要比 udp 有优势的多,我们也不必为对时另起一套协议走 udp 。
一般的解决方法用多次校对就可以了。因为,如果双方时钟快慢一致的情况下,对时包在网络上行程时间越短,就一定表明误差越小。这个误差是不会超过包来回时间的一半的。我们一旦在对时过程中得到一个很小的行程时间,并在我们游戏逻辑的时间误差允许范围内,就不需要再校对了。
或者校对多次,发现网络比较稳定(虽然网速很慢),也可以认为校对准确。这种情况下,潜在的时间误差可能比较大。好在,一般,我们在时间敏感的包上都会携带时间戳。当双方时间校对误差很小的时候,client 发过来的时间戳是不应该早于 server 真实时刻的。(当时间校对准确后,server 收到的包上的时间戳加上数据包单行时间,应该等于 server 当前时刻)
一旦 server 发现 client 的包“提前”收到了,只有一种解释:当初校对时间时糟糕的网络状态带来了很多的时间误差,而现在的网络状态要明显优于那个时候。这时,server 应该勒令 client 重新对时。同理,client 发现 server 的数据包“提前”到达,也可以主动向 server 重新对时。
一个良好的对时协议的设定,在协议上避免 client 时间作——弊(比如加速器,或者减速器)是可行的。这里不讨论也不分析更高级的利用游戏逻辑去时间作--弊的方式,我们给数据包打上时间戳的主要目的也非防止时间作--弊。
校对时间的一般用途是用来实现更流畅的战斗系统和位置同步。因为不依赖网络传输的统一时间参照标准可以使游戏看起来更为实时。
首先谈谈位置同步。
好的位置同步一定要考虑网络延迟的影响,所以,简单把 entity 的坐标广播到 clients 不是一个好的方案。我们应该同步的是一个运动矢量以及时间信息。既,无论是 client 还是 server ,发出和收到的信息都应该是每个 entity 在某个时刻的位置和运动方向。这样,接收方可以根据收到的时刻,估算出 entity 的真实位置。对于 server 一方的处理,只要要求 client 按一个频率(一般来说战斗时 10Hz 即可,而非战斗状态或 player 不改变运动状态时可以更低) 给它发送位置信息。server 可以在网络状态不好的情况下依据最近收到的包估算出现在 player 位置。而 client 发出的每次 player 位置信息,都应该被 server 信任,用来去修正上次的估算值。而 server 要做的只是抽查,或交给另一个模块去校验数据包的合法性(防止作--弊)。
在 server 端,每个 entity 的位置按 10Hz 的频率做离散运动即可。
client 因为涉及显示问题,玩家希望看到的是 entity 的连续运动,所以处理起来麻烦一点。server 发过来的位置同步信息也可能因为网络延迟晚收到。client 同样根据最近收到的包做估算,但是再收到的包和之前已经收到的信息估算结果不同的时候,应该做的是运动方向和速度的修正,尽可能的让下次的估算更准确。
关于战斗指令同步,我希望是给所有战斗指令都加上冷却时间和引导时间,这正是 wow 的设计。这样,信任 client 的时间戳,就可以得到 client 准确的指令下达时间。引导时间(或者是公共冷却时间)可以充当网络延迟时间的缓冲。当然我们现在的设计会更复杂一些,这里不再列出。对于距离敏感的技能,例如远程攻击和范围魔法,我们的设计是有一个模糊的 miss 判定公式,解决距离边界的判定问题。
这里, server 对攻击目标的位置做估算的时候,可以不按上次发出包的运动方向去做位置估计,而选择用最有利于被攻击者的运动方向来做。这样,可以减少网络状况差的玩家的劣势。
对于 PVE 的战斗,甚至可以做更多的取舍,达到游戏流畅的效果。比如一个网络状态差的玩家去打 npc,他攻击 npc 的时刻,npc 是处于攻击范围之内的。但是由于网络延迟,数据包被 server 收到的时候,npc 已经离开。这个时候 server 可以以 client 的逻辑来将 npc 拉会原来的坐标。
虽然,这样做,可能会引起其他玩家(旁观者) client 上表现的不同。但是,网络游戏很多情况下是不需要严格同步的。在不影响主要游戏逻辑的情况下,player 的手感更为重要。
相关推荐
帧同步是一种在网络游戏中广泛应用的技术,它的主要目的是解决多人在线游戏中的实时交互问题,确保所有玩家看到的游戏状态是一致的。本资料集包含了关于帧同步的深入解析,对于想要理解网络游戏运行机制,特别是对...
网络游戏网络方面的算法
下面将详细探讨远程网络同步在网络游戏中的重要性、原理以及相关的实现方法。 网络游戏的发展离不开高效的网络同步机制。由于玩家分布在世界各地,通过互联网连接进行游戏,因此,必须解决延迟、数据丢失和网络不...
《网络游戏-基于游戏回档的数据同步方法和装置以及游戏系统》是针对网络游戏中的一个重要问题——数据同步进行深入探讨的资料。在多人在线游戏中,数据同步是维持游戏稳定性和玩家体验的关键技术之一。当多个玩家...
在网络游戏领域,网络时间同步是确保游戏公平性和用户体验的关键技术之一。简单网络对时协议(Simple Network Time Protocol, SNTP)被广泛应用于实现这一目标。本文将深入探讨SNTP在网络游戏中时间同步的应用及其...
在网络游戏开发中,分布式网络同步是一项至关重要的技术。它确保了玩家在不同设备上进行游戏时,能够实时、准确地看到彼此的操作,从而提供无缝的游戏体验。本资料包"网络游戏-分布式网络同步.zip"主要包含了一份名...
综上所述,网络游戏中的网络同步装置是一个复杂且至关重要的系统,它涉及到多个技术层面,包括同步方法选择、挑战处理以及优化策略等。理解和掌握这些知识点对于开发高质量的网络游戏至关重要。
在基于C/S网络游戏架构下,介绍了网络游戏中的网络分布式对象的概念,分析了基于图形帧移动的错误方法,提出了一种基于时间移动的算法,并使用插值的...在实时性要求较高的网络游戏中该算法完全能解决移动同步问题。
网络游戏中的网络同步技术是实现多玩家在线互动游戏的关键所在,它确保了所有参与者在同一时间看到相同的游戏状态,从而提供了一种共享的虚拟环境。网络同步技术涉及到多个领域,包括网络通信、数据压缩、延迟补偿...
对于网络游戏开发者、运维人员和对网络技术感兴趣的玩家来说,这份资料会是一份宝贵的参考资料,帮助他们理解和解决与网络游戏同步相关的技术问题。通过深入学习,我们可以更好地理解网络交换机如何为网络游戏提供...
综上所述,"网络同步的方法与装置"是一个深度探讨网络游戏网络同步技术的主题,包括同步原理、常用方法、优化策略以及实现设备等多个方面,对于从事网络游戏开发或对此感兴趣的读者来说,这份资料将提供宝贵的参考。
网络游戏中的网络同步是一个复杂而关键的技术领域,它涉及到玩家在虚拟世界中的实时互动,确保所有玩家看到的游戏状态是一致的。网络同步对于网络游戏的成功至关重要,因为它直接影响到游戏体验的流畅性和公平性。...
总的来说,保持时钟同步是网络游戏技术中的一个核心问题,它涉及到玩家的体验、游戏的公平性和系统的稳定性。通过对同步分配式网络系统中时钟同步方法的研究和实施,开发者可以创建出更加流畅、无延迟的游戏环境,...
当遇到“游戏不同步”问题时,这通常意味着游戏数据在不同的服务器或客户端之间存在差异,导致玩家无法正常进行游戏。本文将深入探讨如何使用“网维大师”来解决游戏不同步问题,特别是关于“同步节点”的处理方法。...
在本文件"网络游戏-同步方法、通信切换方法、无线网络以及节点.zip"中,主要探讨了这些关键知识点。下面将详细阐述这些领域的核心概念和技术。 1. **同步方法**:网络游戏中的同步是为了确保所有玩家在同一时间看到...
游戏同步问题是网络游戏中非常重要的一方面,它保证了每个玩家在屏幕上看到的东西大体是一样的。解决同步问题的最简单的方法就是把每个玩家的动作都向其他玩家广播一遍,不过这其中存在两个问题:向哪些玩家广播,...
在网络游戏的开发与运营中,无线特定网络环境下的重同步方法是至关重要的技术之一。它主要涉及网络延迟、数据包丢失、同步误差等问题,确保玩家在网络波动时仍能获得流畅的游戏体验。以下是对这一主题的详细阐述: ...