具有数百名玩家的服务器端物理模拟


9

我目前正在开发一款面向物理的单人游戏,希望在服务器端模拟物理。这是因为游戏将具有排行榜,持续的玩家进度等,并且我想防止任何类型的作弊-基本上是纯客户端-服务器架构,客户端是“哑巴”,仅显示服务器希望您显示的内容。

但是,问题在于该游戏很可能同时由数百人(可能是数千人)玩。这使我感到担忧,因为如果我必须同时执行并维护数百个状态,它很可能会破坏服务器的处理能力。

我将所有物理模拟都移到客户端不会有任何问题,但是我真的需要一种方法来验证客户端模拟的结果是否有效。但是,我不知道如何。

我曾考虑过不时地运行模拟服务器端,以验证客户端是否仍然处于公平状态,但我确实希望服务器尽可能减轻压力。

物理将变得像Glenn FiedlerGDC 2011演示一样复杂,甚至更简单。但是,更多总是碰撞的刚体会在一个场景中,并且它们一次都会可见。

对于这个特殊的情况,我很难回答,因为网络上的大多数资源(再次是Glenn Fiedlers站点都是很棒的站点)谈论小型网络物理(例如,具有30个播放器的FPS,例如Halo)。

对此主题的任何建议,网站,论文等将不胜感激。

我想回答以下问题:

  • 客户-服务器模型的可行性如何?我的服务器处理能力是否合法并接地?
  • 是否可以可靠地验证客户端在服务器上运行的物理模拟?如果是这样,怎么办?

我将这个问题悬而未决,希望更多的人发表自己的想法。感谢那些已经做到的人!
Lennard Fonteijn 2012年

只要不同的客户端是独立的,则水平扩展就不会有问题。使用类似EC2的工具,根据需要使容量联机。
ipeet 2012年

1
如果有人在单人游戏中作弊,问题出在哪里?让他们,更好地放弃排行榜的想法,专注于制作有趣的单人游戏
Maik Semder 2012年

2
“是否有可能可靠地验证客户端在服务器上运行的物理模拟?” 是的,有可能对其进行验证,但请阅读以下注释:您计划将RL钱分发给最高分的计划,这与飞镖游戏类似,即在最初的投掷物理接管之后。这里的问题较少是要验证物理学,这很容易。问题是您将有骗子让计算机程序进行投掷,从而为他们提供满分。
丹尼尔·卡尔森

在共享世界中完全可以进行服务器验证的物理,DCUO就是一个很好的例子。请注意,“服务器”的意思实际上是“一堆服务器箱”,而您似乎在写“服务器”是指某个地方的单个箱。您目前无法在相同的物理空间中模拟成千上万的独立角色,因此缺乏讨论。您可以做的是将成千上万的玩家分散到相互影响的独立仿真岛中。
Patrick Hughes

Answers:


5

您可以在客户端验证其他用户的提交,如果提交看起来无效,则可以让客户端向服务器报告。

然后,您可以采取行动(禁止作弊者,或禁止伪造虚假报告的人)。要检查自己提交的内容是否真的无效,可以使用特殊的客户端或其他任何方法。


3
那实际上真是太聪明了!无需考虑,显然至少有2或3个客户端必须运行模拟,以防运行其他模拟的客户端作弊-在这种情况下,如果所有客户端都报告奇怪的内容,则服务器始终可以进行最终模拟。
Lennard Fonteijn 2012年

1

您的游戏是单人游戏,与其他玩家的唯一“互动”是排行榜。您可以在每个服务器上生成一个实例来检查服务器上的模拟,您并不需要所有技巧来确保30个客户端之间的物理特性相同,因此我认为您不需要的资源就比以前多了。物理已经在工作了:)。

检查每个结果都会有点过大,只要有人将分数发送到Leaderbord,您就可以将模拟压缩发送到服务器,然后仅检查自己服务器上最高的5%分数,甚至可能查看最高1%甚至更聪明的人只会检查新的高分,并假设每个人都没有高于#1可能具有非作弊的模拟。

我不知道您的模拟是喜欢,设置还是不进行交互(易于检查),或者玩家是否可以在模拟运行时与该模拟进行交互,但是请务必以不同的浮动方式进行模拟点表示不会弄乱东西,并使有效运行看起来无效。


我不想深入探讨游戏本身的细节,但是可以将我的游戏与飞镖游戏进行比较:一旦瞄准并掷出掷球,物理就接管了一切,您无法对其进行任何更改不再。这些知识会改变您的答案吗?
Lennard Fonteijn 2012年

不,这不会改变任何事情:)。只需将重播存储在服务器上,然后仅检查可疑的重播(例如,新的高分)
Roy T.

1

不要这样做,我可以向您保证,仅在服务器上模拟物理是一个非常糟糕的主意。主要问题不是服务器负载,而是响应能力。客户的响应能力将非常差。播放器将按下一个按钮,然后您必须往返于服务器,然后才能获得模拟结果。过去,我已经做了很多修改(大多数情况下只是按一下按钮),结果并不理想,应该只在非常慢的游戏中进行,因为它很可能会摆脱它(甚至在那些情况下,缺乏响应能力是一个巨大的问题)。

我打算在下一次出现这种情况时尝试的一种更好的方案是,从玩家中选出一个很小的玩家子集,然后为他们模拟服务器端一小段时间,然后将结果与他们进行比较,没有他们的知识。如果它们相差很大(您必须期望一定程度的差异),则可以将它们归类为潜在的作弊者,并继续模拟它们一段时间以确认。您将得到的一条曲线是,受网络条件等因素影响,合法玩家与服务器的差异是多少,并且您会很快发现作弊者不在此曲线范围内。该系统具有以下优点:

  • 自动化的
  • 您不会牺牲响应能力
  • 当您只模拟播放器库的一小部分时,负载将是可管理的,甚至是可扩展的(如果负载很高,您可能会选择较少的播放器来进行模拟)
  • 适用于我能想到的每个游戏,因此可重复使用

因此,就像罗伊(Roy)一样,您基本上会说:将其保留在客户端,当客户提交分数时存储“重播”,并且仅偶尔验证一次这些重播(不是全部,只是一小部分)。如果根据客户提交的分数完成了分数-玩家进度部分,也可以用真钱购买分数(!!!)-您仍然推荐这种方法吗?如果作弊给了过多的信用额,而我只偶尔验证一次,那我基本上会亏本。当某人的分数超过某个阈值时,您可以标记该人,但是会有更好的方法吗?
Lennard Fonteijn 2012年

如果物理引擎是确定性的(应该是),并且服务器使用与客户端相同的启动状态和输入进行模拟(这应该是可行的),那么结果应该在合理的浮点误差范围内(无关紧要)。即使存在随机效应,并且传递RNG状态也不可行,您也可以传递随机数并使用它们进行检查(甚至检查它们的分布,以防随机掷骰子对游戏玩法造成重大影响) 。
ipeet 2012年

涉及积分,您最好检查每一个重播,因为作弊不再是排在高分榜上,而是为了赚钱。如果涉及金钱,您想获得更大的安全性,那我无能为力。
罗伊·T。

@RoyT。即使我不根据信用额度付款(我猜是有人误读了吗),我也可能仍然会这样做。我打算采用零容忍策略,因此我只对重放文件进行批处理以进行验证。如果确实可疑,请采取措施。
Lennard Fonteijn 2012年

1

正如Daniel所说,这里最大的问题将是为玩家执行动作的程序。如果玩家使用通常可以解决神经外科手术问题的精度的机械臂,则无需进行游戏中的物理倾斜。


我可能还不清楚。完成游戏后,我的游戏将为您提供虚拟积分。您可以使用这些信用来解锁要播放的新内容。您还可以使用真钱购买积分来更快地解锁内容(请注意,它不是Pay2Win,我讨厌那样)。我无意根据信用额度支付真实货币。就是说,飞镖只是一个比喻,用来描述玩家对硬体状态的影响程度,我不怕“ aimbots”,因为这会给你0优势。
Lennard Fonteijn 2012年
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.