我正在制作客户端服务器MMO风格的游戏。到目前为止,我已经设置了框架,以便服务器和客户端相互交互以提供状态更新。服务器维护游戏状态并定期计算下一个状态,然后每隔一段时间(每n毫秒)发送一次新状态给所有客户端。用户可以在客户端查看并响应这个新状态。这些操作然后被发送回服务器进行处理并发送出去进行下一次更新。同步客户端 - 服务器游戏状态
显而易见的问题是,这些更新需要花时间在服务器和客户端之间传输。如果客户有攻击敌人的行为,那么在更新返回到服务器时,服务器很可能已经进入了足够远的游戏状态,以至于敌人不再处于同一地点,并且超出范围。
为了解决这个问题,我一直试图想出一个好的解决方案。我看了下面的内容,并且帮助了一些,但不是完全的:Mutli Player Game synchronization。我已经得出结论,我可以传输其他信息,例如方向(或AI运动的目标位置)和速度等信息,而不仅仅传输当前的游戏状态。从这个角度来看,我需要在客户端“猜测”一些什么,通过将游戏状态推进到未来几毫秒来确定实际状态(如服务器所看到的)。
问题是确定进展状态的时间量,因为它取决于服务器和客户端之间的延迟时间,这可能会有很大的差异。此外,我是否应该将游戏状态改为当客户端查看它时的状态(即只考虑更新到达客户端的时间),还是应该进一步处理,以便在发送响应时回到服务器,到那时它将是正确的状态(考虑到旅途和往返旅程)。
有什么建议吗?
重申:
1)什么是计算的时间发送和接收之间的时间量的最佳方法?
2)我是否应该将客户端状态进行得足够远以便计算整个往返时间,或者只是将数据从服务器传输到客户端所需的时间?
编辑:我想出迄今
因为我已经有很多包来回的客户端和服务器之间,我不希望添加到交通,如果我不得不这样做。目前,客户端发送状态更新数据包(UDP)到服务器约150毫秒(只有在发生变化时),然后由服务器接收和处理。目前,服务器不会对这些数据包发送任何响应。
首先,我会让客户试图估计他们的滞后时间。我会默认它为50到100毫秒。我建议大约每2秒(每个客户端)服务器将立即响应这些数据包之一,并以特殊的定时更新数据包的形式发回数据包索引。如果客户端接收到定时数据包,它将使用该索引来计算该数据包发送多久之前,然后使用数据包之间的时间作为新的滞后时间。
这应该保持客户合理的最新滞后,没有太多的多余的网络流量。
声音可以接受,还是有更好的方法?这仍然不回答问题二。
“但这是非常不可能的情景,不是吗?”如果一台设备使用蜂窝连接而另一台使用wifi?只是一个想法。无论哪种方式,您都在说我会向用户展示游戏将在他们的响应回到服务器时的状态,对吗? – 2011-04-20 06:14:46
*“蜂窝连接和WiFi”* - 通常,两者都会尝试使用更快的连接。他们可以试图以这种方式作弊,但它看起来有点过于复杂。这会是一种欺骗,但是在MMO中有更简单的作弊方式。 – maaartinus 2011-04-20 11:25:58
是的,我正在说这个。现在我补充一点,你可以减少所有球员的时差。较少的外推可能意味着更少的问题;只是一个想法。 – maaartinus 2011-04-20 11:30:05