WebSockets performance



我正在考虑实现一个HTML5 mmog,其中有一个快速运行的对象。玩家通过射击不断改变目标的方向。我想到了WebSockets等(socket.io)和canvas

我认为方向变化的计算必须在客户端和服务器端完成,然后同步-服务器是主服务器以避免作弊。

我担心的是,无论服务器有多快,延迟都会导致延迟,从而破坏同步。

有解决这个难题的好方法吗?如何实现这一数据量的实时同步,其中所有的信息是至关重要的,不要错过一个方向的变化。所有玩家都需要立即获得移动物体的新方向,以免破坏游戏玩法。

我认为这个问题已经在现有的mmog中解决了。

任何想法?

在这种情况下,您可以做的最好的事情是尝试并预测移动客户端(航位推算),然后在必要时使用来自服务器的数据纠正位置/速度。

例如,假设你的快速奔跑的物体在屏幕上以5的速度从左向右移动,玩家向它射击,它改变了方向,所以它现在在屏幕上以5的速度向上移动(90度转弯)。

客户端应用程序的更新频率可能远高于从服务器获取数据的频率(例如,客户端每秒更新60次,服务器每秒接收10个数据包)。让我们假设,在实时情况下,对象在服务器更新到来前的5帧内改变了方向。在客户端,对象将继续沿着其当前轨迹移动,直到它从服务器接收到它改变方向的更新(即,当它没有从服务器接收到数据时,它不会停止),此时,客户端将纠正对象的位置和速度。

如何进行校正将决定动画看起来有多跳跃。你可以直接把它拉到正确的位置,这样就会引起一点跳跃,但会立即给出正确的位置,或者你可以改变它的速度,这样它就能平稳地过渡到那个位置,不会引起跳跃,但在校正的同时位置会有点不准确。

你总是会遇到一些情况,这些修正最终会非常大(例如,某人有一个非常糟糕的连接,数据包丢失,极高的延迟等)。这时你就会出现人们通常所说的网络游戏中的延迟现象,比如一个物体跳过很远的距离,或者移动得非常快,以"赶上"它应该在的地方。不可能一直保持100%的同步。你所能做的就是准确地猜测东西应该放在哪里。

这里有一些更详细的文章,祝你好运!

http://gmc.yoyogames.com/index.php?showtopic=415538http://www.gamasutra.com/view/feature/3230/dead_reckoning_latency_hiding_for_.php

服务器是同步所有事件的正确位置。你不希望每个玩家都将自己的输入数据发送给其他"n"个玩家,因为这会创建太多的通信路径。

服务器将获取玩家数据并确定移动物体的新轨迹,然后将更新发送给每个玩家。这可以在虚拟游戏时间的固定单位中完成,我将其称为"ticks"。

从服务器的角度来看,这会给你一个像下面这样的循环:

  1. 接收玩家输入
  2. 更新游戏状态
  3. 将游戏状态更改分发给玩家

你将需要处理在一定时间内没有收到玩家输入的情况(例如,可能在那一帧忽略那个玩家)。

在客户端,当你在等待服务器的下一个游戏tick更新时,你可以沿着之前的轨迹继续移动对象,随着时间的推移渲染帧。

当从服务器接收到当前游戏的更新时,必须应用新的游戏状态。

如果对象的新实际位置非常接近你所推断的位置,你可以设置新位置并在下一帧中渲染它。

如果新位置离外推位置"很远",那么你需要决定是将对象立即弯曲到目的地,还是进行某种加速或线性运动以在短时间内将其移动到目的地。

相关内容

  • 没有找到相关文章

最新更新