这与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毫秒。因此,我显然需要在此处进行一些优化。
最明显的改进是视线检查。这样既可以减少关心数据的人数,也可以减少发送给感兴趣的各方的数据量。我可以尝试一下这个领域中的其他技巧,以便将广播操作的成本降至最低吗?