我正在考虑实施一个 HTML5 mmog ,其中涉及快速运行的对象。玩家通过射击不断改变该物体的方向。我想过 WebSockets 等( socket.io )和 canvas 。
我认为方向改变的计算必须在客户端和服务器端进行,然后同步 - 与服务器是主服务器以避免作弊。
我担心的是,无论服务器的速度有多快,延迟都会导致延迟,从而导致同步失败。
有解决这个难题的好方法吗?如何实现这一数据量的实时同步,其中所有信息对于不错过方向变化至关重要。所有玩家都需要毫不拖延地获得移动物体的新方向,以免破坏游戏玩法。
我认为现有的mmogs已经解决了这个问题。
有什么想法吗?
答案 0 :(得分:7)
在这种情况下,您可以做的最好的事情是尝试预测客户端的移动(航位推算),然后在必要时使用来自服务器的数据来校正位置/速度。
例如,假设您的快速运行对象在屏幕上以5的速度从左向右移动,并且玩家向它射击并且它改变方向,因此它现在以5的速度在屏幕上向上移动( 90度转弯。
客户端应用程序的更新速度可能远远超过从服务器获取数据的速度(例如,每秒客户端60次更新,每秒从服务器接收10次数据包)。让我们说实时,在服务器更新到来之前,对象改变方向,剩下5帧。在客户端,对象将继续沿其当前轨迹移动,直到它从服务器接收到更改方向的更新(即,当它没有从服务器接收数据时它不会停止),此时,客户将纠正对象的位置和速度。
如何进行校正将决定动画的外观。你可以立即将它快速移动到正确的位置,从而引起一点跳跃,但是立即给出正确的位置,或者你可以改变它的速度,使它以平滑的方式移动到那个位置,不会引起跳跃,但是在校正的平均时间内,位置略微不准确。
你总会遇到一些情况,这些修正最终会变得非常大(例如某人连接非常糟糕,丢包,天高等等)。当你得到疯狂的异常时,人们通常将其称为在线游戏中的滞后,例如当一个物体跳过很远的距离或者移动得非常快以“赶上”到应该的位置时。没有办法一直100%同步。你所能做的只是对事情的确定做出很好的猜测。
以下是一些更详细的文章,祝你好运!
http://gmc.yoyogames.com/index.php?showtopic=415538 http://www.gamasutra.com/view/feature/3230/dead_reckoning_latency_hiding_for_.php
答案 1 :(得分:2)
服务器是同步所有活动的正确位置。您不希望每个玩家将其输入数据发送给其他“n”玩家,因为它会创建太多的通信路径。
服务器将获取玩家数据并确定移动物体的新轨迹,然后向每个玩家发送更新。这可以在虚拟游戏时间的固定单位中完成,我称之为“滴答”。
从服务器的角度来看,这会给你一个如下循环:
您将需要处理诸如在一定时间内未接收来自玩家的输入的情况(例如,可能忽略该帧的玩家)。
在客户端,当您等待服务器的下一个游戏刻度更新时,您可以继续沿着其先前的轨迹移动对象,随着时间的推移渲染帧。
当从服务器收到当前游戏勾选的更新时,必须应用新的游戏状态。
如果对象的新实际位置非常接近你推断的位置,你可以设置新位置并在下一帧渲染它。
如果新位置距离外推位置“远”,则需要决定是将物体瞬间扭曲到目的地还是进行某种加速或线性运动以在短时间内将其移动到目的地。