多人FPS服务器端性能


12

这与MMO的性能有关,除了有关带宽的问题。这与cpu负载有关。

我使用node.js和webGL编写了一个简单的FPS。这非常简单,就像MIDI Maze的BuddyMaze克隆一样。发生的事情很少,每个人都可以二维移动(没有高度),发射简单的弹丸,然后撞到墙壁上。

现在,如果我与服务器建立多个连接,每个玩家在旋转时迅速射击,那么在服务器最大化核心并放慢速度之前,我可以在游戏中获得约15-20名玩家。这是在服务器上以30 fps的速度运行时。在10 fps下,我获得约25-30个连接。这是非常糟糕的,因为游戏很快将有更多工作要做,而我需要让更多的玩家适应这一点,这是可行的努力。

我的兄弟刚刚指出了有关其同事的TF2服务器的一些统计信息。他的服务器的规格低于我们的服务器,但它运行的是TF2,显然是一个复杂得多的游戏,每秒高达500滴答声,每个核心36个用户。另外,我们目前消耗的带宽比它们消耗的要多得多,但是我们还没有试图降低太多带宽。

这怎么可能?有什么样的技巧可以将服务器性能提高到这种程度?我知道的一些东西包括:

  • 降低服务器上的帧速率,并在客户端上插入位置。我得到了一些好处,但是显然TF2服务器甚至都没有为此烦恼。
  • 在客户端上执行诸如冲突检测之类的昂贵工作,并在服务器上很少进行验证。我还没有搬过来,今晚我会。即使这样,我也不希望获得如此巨大的收益。
  • 将运动场划分为区域(四叉树)以最小化计算。还没有机会。
  • 我考虑过不幸的是,node.js的速度比TF2正在使用的速度慢得多,并且可能不适合这种高强度任务。
  • 这一切都在服务器配置魔术中吗?

那么,行业中的其他窍门是什么,即仅执行服务器上的最低要求,又具有完美的游戏体验?“推迟到客户端以节省CPU时间”与“不信任客户端”之间存在很大的冲突,因此也许有助于了解在各种情况下的界​​限如何?

更新资料

剖析确实是我所发现的唯一绝对可靠的咒语。我很快在代码周围包装了一些计时功能(感谢FP!),发现了我从未想到的东西:将数据广播到客户端的行为几乎占了整个执行时间。具体来说,约占90%。进一步的测试表明,这段时间取决于客户端数量和数据大小,而后者则更多。在20位用户的负载下,我只发送“ {}”而不是全部数据,从而将广播时间从24ms缩短为2ms,降低了90%。但是只有5个用户,广播大约需要0.5毫秒。因此,我显然需要在此处进行一些优化。

最明显的改进是视线检查。这样既可以减少关心数据的人数,也可以减少发送给感兴趣的各方的数据量。我可以尝试一下这个领域中的其他技巧,以便将广播操作的成本降至最低吗?


5
配置文件实际上就是我所建议的。我的猜测是,它的调整不如您想象的那样,这就是为什么TF2在更少的硬件上以更高的滴答率运行。我还认为TF2可能正在执行您建议执行的所有操作,因此导致其性能更高的原因。
Nate

1
我很想听听您的最新结果,您是否能够从node.js获得更好的性能?
iddqd 2011年

Answers:


5

您的服务器不应该在每个滴答声中将所有玩家的状态发送给所有玩家。相反,它应该向每个客户端发送特制的消息,说每500毫秒说“您的视口中的这些x播放器应在500毫秒内位于这些坐标处。在大多数情况下,这可以正常工作,但是如果服务器意识到它给出了错误的信息,它只会发送一条额外的消息。

这将大大减少网络流量。

要考虑的另一件事是服务器上没有游戏滴答声,而是让客户端仅在发生动作(方向改变,射击时)发送消息,然后在接收到动作时在服务器上提前进行计算。


是的,我现在要添加视线检查功能。实际上,收益微乎其微,从25位玩家的45毫秒降低到35毫秒。但是使用单独的发送命令而不是广播可能会有一些额外的开销。而且我只在输入时发送消息。但是您是对的,也许只有在收到输入后,才有可能完全不必打勾。
Tesserex 2011年

1

我考虑过不幸的是,node.js的速度比TF2正在使用的速度慢得多,并且可能不适合这种高强度任务。

可能就是这个。TF2的服务器是使用C / C ++编写的,因此它将比node.js更快(如果我没记错的话,它将使用Java解释的Javascript)

基于Google WebGL的Quake使用Java作为服务器,可在以下位置找到源代码:http : //code.google.com/p/quake2-gwt-port/。可能值得一看,看看它是如何完成的。我还想知道当您谈到在服务器上使用帧速率时的意思。没有理由在服务器上渲染任何东西,它应该只在这里用于处理客户端发送的命令。

最后,“不信任客户”规则比将昂贵的计算卸载到客户上以提高性能更为重要。特别是与碰撞检测一样重要的事情。当您的游戏是基于Javascript的,因此很容易被黑客入侵(与之类似的是TF2)。

我知道这并不是一个完整的答案,但是希望它可以为您指出一些可能有助于提高性能的方向。


7
我应该说刻度率而不是帧率。当然,服务器上没有任何内容。我的意思是它在游戏循环中处理命令的间隔。还有一些答案表明,只要每隔几秒钟进行一次随机验证,就可以为客户端提供诸如冲突检测之类的功能。有人说它相当快地清除了作弊者。
Tesserex 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.