Nic*_*nks 9 java synchronization udp client-server
我正在制作一个客户端服务器MMO风格的游戏.到目前为止,我已经设置了框架,以便服务器和客户端相互交互以提供状态更新.服务器维护游戏状态并定期计算下一个状态,然后每隔一段时间(每n毫秒)将其发送给所有客户端.用户可以在客户端查看和响应该新状态.然后将这些操作发送回服务器进行处理并发送出去进行下一次更新.
显而易见的问题是这些更新需要时间在服务器和客户端之间传输.如果客户端的行为由该更新已经得到回服务器的时间来攻击敌人,这是非常有可能的服务器已经进行了比赛状态足够远,敌人是在同一地点不再,并超出范围.
为了解决这个问题,我一直试图找到一个好的解决方案.我看了下面的内容,它帮助了一些,但并非完全:Mutli Player Game同步.我已经得出结论,我不仅可以传输游戏的当前状态,而且可以传输其他信息,例如方向(或AI运动的目标位置)和速度.从此,我的是需要"猜"的东西,在客户端部分,实际状态是通过什么进行游戏状态n毫秒到未来(如服务器看到它).
问题是确定进展状态的时间量,因为它将取决于服务器和客户端之间的滞后时间,这可能会有很大差异.此外,我应该将游戏状态推进到客户端查看时的状态(即只考虑更新到达客户端所花费的时间),还是应该将其推进到足够远以便在发送响应时回到服务器,到那时它将是正确的状态(来往于旅程的帐户).
有什么建议?
重申:
1)计算发送和接收之间的时间量的最佳方法是什么?
2)我是否应该将客户端状态推进到足以计入整个往返时间,或者只是将数据从服务器提供给客户端所需的时间?
编辑:到目前为止我想出了什么
由于我已经有许多数据包在客户端和服务器之间来回传递,我不想在必要时添加到该流量.目前,客户端向服务器发送状态更新数据包(UDP)〜150毫秒(仅在某些内容发生变化时),然后由服务器接收和处理这些数据包.目前,服务器不会对这些数据包发送任何响应.
首先,我将让客户尝试估计他们的滞后时间.我将它默认为50至100毫秒.我建议大约每2秒(每个客户端)服务器将立即响应其中一个数据包,在特殊的定时更新数据包中发回数据包索引.如果客户端收到定时数据包,它将使用索引来计算此数据包发送的时间,然后使用数据包之间的时间作为新的延迟时间.
这应该使客户合理地保持最新的延迟,同时避免过多的网络流量.
声音可以接受,还是有更好的方法?这仍然没有回答问题二.
2)我应该将客户端状态进行得足够远以计入整个往返,还是仅计入从服务器到客户端获取数据所需的时间?
假设服务器在时间 T0 发送状态,客户端在时间 T1 看到状态,玩家在时间 T2 做出反应,服务器在时间 T3 获得答案并立即处理。这里,往返延迟是T1-T0+T3-T2。在理想世界中,T0=T1,T2=T3,观察时间和处理玩家动作之间的唯一延迟是玩家的反应时间,即T2-T1。在现实世界中它是T3-T0。因此,为了模拟理想世界,您需要减去整个往返延迟:
T2-T1 = T3-T0 + (T1-T0 + T3-T2)
Run Code Online (Sandbox Code Playgroud)
这意味着较慢网络上的玩家比快速网络上的玩家看到更高级的状态。然而,这对他们来说并不是优势,因为他们的反应需要更长的时间才能得到处理。当然,如果两个玩家坐在一起并使用不同速度的网络,这可能会变得很有趣。但这是不太可能发生的情况,不是吗?
整个过程存在一个问题:你在推断未来,这可能会导致荒谬的情况。其中一些,例如跳入墙壁,可以很容易地防止,但那些取决于玩家互动的则不能。1
也许您可以颠倒您的想法:尝试评估玩家在时间 T3 - (T1-T0 + T3-T2) 时的行动,而不是预测。如果您确定某个角色会受到这种方式的打击,请相应地减少其生命值。这可能比最初的想法更容易、更现实,也可能更糟糕,或者根本不适用。只是一个想法。
1想象两个玩家互相对抗。根据推断,他们在右侧擦肩而过。事实上,其中一个改变了方向,最后他们在左侧擦身而过。
| 归档时间: |
|
| 查看次数: |
4957 次 |
| 最近记录: |