我正在制作一个客户端服务器MMO风格的游戏.到目前为止,我已经设置了框架,以便服务器和客户端相互交互以提供状态更新.服务器维护游戏状态并定期计算下一个状态,然后每隔一段时间(每n毫秒)将其发送给所有客户端.用户可以在客户端查看和响应该新状态.然后将这些操作发送回服务器进行处理并发送出去进行下一次更新.
显而易见的问题是这些更新需要时间在服务器和客户端之间传输.如果客户端的行为由该更新已经得到回服务器的时间来攻击敌人,这是非常有可能的服务器已经进行了比赛状态足够远,敌人是在同一地点不再,并超出范围.
为了解决这个问题,我一直试图找到一个好的解决方案.我看了下面的内容,它帮助了一些,但并非完全:Mutli Player Game同步.我已经得出结论,我不仅可以传输游戏的当前状态,而且可以传输其他信息,例如方向(或AI运动的目标位置)和速度.从此,我的是需要"猜"的东西,在客户端部分,实际状态是通过什么进行游戏状态n毫秒到未来(如服务器看到它).
问题是确定进展状态的时间量,因为它将取决于服务器和客户端之间的滞后时间,这可能会有很大差异.此外,我应该将游戏状态推进到客户端查看时的状态(即只考虑更新到达客户端所花费的时间),还是应该将其推进到足够远以便在发送响应时回到服务器,到那时它将是正确的状态(来往于旅程的帐户).
有什么建议?
重申:
1)计算发送和接收之间的时间量的最佳方法是什么?
2)我是否应该将客户端状态推进到足以计入整个往返时间,或者只是将数据从服务器提供给客户端所需的时间?
编辑:到目前为止我想出了什么
由于我已经有许多数据包在客户端和服务器之间来回传递,我不想在必要时添加到该流量.目前,客户端向服务器发送状态更新数据包(UDP)〜150毫秒(仅在某些内容发生变化时),然后由服务器接收和处理这些数据包.目前,服务器不会对这些数据包发送任何响应.
首先,我将让客户尝试估计他们的滞后时间.我将它默认为50至100毫秒.我建议大约每2秒(每个客户端)服务器将立即响应其中一个数据包,在特殊的定时更新数据包中发回数据包索引.如果客户端收到定时数据包,它将使用索引来计算此数据包发送的时间,然后使用数据包之间的时间作为新的延迟时间.
这应该使客户合理地保持最新的延迟,同时避免过多的网络流量.
声音可以接受,还是有更好的方法?这仍然没有回答问题二.
最近我一直在研究多人网络应用程序.我使用Bonjour服务和NSStream对象成功实现了客户端服务器模型.双向沟通已成功完成.
我面临的问题是:运行应用程序的两个设备通过本地wifi连接.从客户端向服务器发送消息时存在延迟问题,反之亦然.
简要描述:
有任何想法吗?