WebSocket的性能表现

10

我正考虑实现一个包含快速奔跑物体的HTML5 MMORPG,玩家通过射击不断改变该物体的方向。我思考过使用WebSockets(例如socket.io)和canvas等技术。

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

我的担忧是,无论服务器有多快,延迟都会导致延迟同步,进而破坏游戏数据的完整性。

有没有解决这一难题的好方法?如何实现这些关键信息的实时同步,确保所有玩家都能及时获得移动物体的新方向,以保持游戏的流畅性。

我想已有的MMORPG已经解决了这个问题。

您有什么想法吗?


1
你可以为每个动作附加一个时间戳,然后让服务器在适当的时间点之前插入该动作。(这并不能完全解决你的问题,因为玩家可以通过更改时间戳来作弊,并且玩家直到以后仍然看不到更改。但是,它将减少由于网络滞后而导致的问题,并且无论你做什么都无法立即传输数据。) - someone
1
客户端时间戳永远不准确。我写这篇文章时,我的时钟已经慢了2分钟。 - Marc
主要问题是是否有一种方法可以实时同步从小消息(玩家的射击/方向变化)聚合的大量数据与大量连接。 - Marc
4
采用纯客户端-服务器模式。因此,你只需要询问用户关于鼠标位置、点击、按键等方面的信息,并在服务器上计算和同步所有内容。 - c69
你有这方面的经验吗?能否准确地管理这么多实时数据的同步? - Marc
我认为这个问题的答案在其他问题领域有着非常积极的影响。 :) - finneycanhelp
2个回答

7
在这种情况下,你可以尝试在客户端预测运动(即死 reckoning),然后根据需要使用服务器数据来纠正位置/速度,这是最好的方法。
例如,假设你的快速移动对象以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
这个技术有一个非常好的介绍视频,来自Adobe MAX 2010 - http://tv.adobe.com/watch/max-2010-develop/building-p2p-multiplayer-games/。 - c69

3
服务器是同步所有事件的正确位置。您不希望每个玩家将其输入数据发送到其他“n”个玩家,因为这会创建过多的通信路径。
服务器将采取玩家数据并确定移动对象的新轨迹,然后向每个玩家发送更新。这可以在虚拟游戏时间的固定单位(我称之为“ticks”)中完成。
从服务器的角度来看,这给您提供了以下循环:
1. 接收玩家输入 2. 更新游戏状态 3. 分发游戏状态更改给玩家
您需要处理一些情况,比如在一定时间内没有收到玩家的输入(例如,在该帧中忽略该玩家)。
在客户端上,当您等待来自服务器的下一个游戏tick更新时,可以沿着先前的轨迹移动对象,随着时间的推移渲染帧。
当接收到当前游戏tick的服务器更新时,必须应用新的游戏状态。
如果物体的新实际位置非常接近您推断的位置,则可以仅设置新位置并在下一帧呈现它。
如果新位置与推断的位置“远离”,则需要决定是否立即将对象瞬移到目标位置,还是采用某种加速或线性运动在短时间内将其移动到那里。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接