我正在制作一个客户端服务器的MMO风格游戏。到目前为止,我已经建立了框架,使得服务器和客户端相互交互以提供状态更新。服务器维护游戏状态并定期计算下一个状态,然后每隔一段时间(每n毫秒)向所有客户端发送新状态。用户可以在客户端上查看和响应这个新状态。然后将这些操作发送回服务器进行处理,并发送给下一个更新。
明显的问题是,这些更新在服务器和客户端之间传递需要时间。如果客户端试图攻击敌人,当更新返回到服务器时,很可能服务器已经推进了游戏状态,敌人已经不在原来的位置,超出了范围。
为了解决这个问题,我一直在努力想出一个好的解决方案。我已经查看了以下内容,它对我有所帮助,但并不完全:Mutli Player Game synchronization。我已经得出结论,不仅要传输游戏的当前状态,还可以传输其他信息,如方向(或AI移动的目标位置)和速度。从这里开始,在客户端上“猜测”实际状态所需的部分是通过将游戏状态向前推进n毫秒来实现的(就像服务器看到的那样)。
问题在于确定推进状态的时间,因为它取决于服务器和客户端之间的延迟时间,这可能会有很大的变化。此外,我应该将客户端状态推进到它查看它时的当前状态(即仅考虑更新传输到客户端所需的时间),还是应该将其推进到足够远,以便当其响应发送回服务器时,它将是正确的状态(考虑来回时间)。
有什么建议吗?
再次强调:
1)计算发送和接收之间的时间的最佳方法是什么?
2)我应该将客户端状态推进到整个往返路程中计数,还是仅计算从服务器到客户端获取数据所需的时间?
编辑:我已经想出了以下解决方案
由于我已经有许多数据包在客户端和服务器之间交换,如果必须添加,我不想增加流量。目前,客户端每150毫秒(仅在发生更改时)向服务器发送状态更新数据包(UDP),然后这些数据包被接收并处理。目前,服务器不会对这些数据包进行响应。
首先,我会让客户尝试估计他们的延迟时间。我会将其默认设置为50到100毫秒左右。我建议每2秒(每个客户端)服务器会立即响应其中一个包,并通过特殊的定时更新数据包将包索引发送回来。如果客户端接收到定时数据包,它将使用索引计算此数据包发送的时间,然后使用数据包之间的时间作为新的延迟时间。
这样可以使客户端相对及时地了解其延迟情况,而不会产生过多的网络流量。
听起来可行吗?还是有更好的方法?这仍然没有回答第二个问题。
明显的问题是,这些更新在服务器和客户端之间传递需要时间。如果客户端试图攻击敌人,当更新返回到服务器时,很可能服务器已经推进了游戏状态,敌人已经不在原来的位置,超出了范围。
为了解决这个问题,我一直在努力想出一个好的解决方案。我已经查看了以下内容,它对我有所帮助,但并不完全:Mutli Player Game synchronization。我已经得出结论,不仅要传输游戏的当前状态,还可以传输其他信息,如方向(或AI移动的目标位置)和速度。从这里开始,在客户端上“猜测”实际状态所需的部分是通过将游戏状态向前推进n毫秒来实现的(就像服务器看到的那样)。
问题在于确定推进状态的时间,因为它取决于服务器和客户端之间的延迟时间,这可能会有很大的变化。此外,我应该将客户端状态推进到它查看它时的当前状态(即仅考虑更新传输到客户端所需的时间),还是应该将其推进到足够远,以便当其响应发送回服务器时,它将是正确的状态(考虑来回时间)。
有什么建议吗?
再次强调:
1)计算发送和接收之间的时间的最佳方法是什么?
2)我应该将客户端状态推进到整个往返路程中计数,还是仅计算从服务器到客户端获取数据所需的时间?
编辑:我已经想出了以下解决方案
由于我已经有许多数据包在客户端和服务器之间交换,如果必须添加,我不想增加流量。目前,客户端每150毫秒(仅在发生更改时)向服务器发送状态更新数据包(UDP),然后这些数据包被接收并处理。目前,服务器不会对这些数据包进行响应。
首先,我会让客户尝试估计他们的延迟时间。我会将其默认设置为50到100毫秒左右。我建议每2秒(每个客户端)服务器会立即响应其中一个包,并通过特殊的定时更新数据包将包索引发送回来。如果客户端接收到定时数据包,它将使用索引计算此数据包发送的时间,然后使用数据包之间的时间作为新的延迟时间。
这样可以使客户端相对及时地了解其延迟情况,而不会产生过多的网络流量。
听起来可行吗?还是有更好的方法?这仍然没有回答第二个问题。