如何防止在一个以物理为重的多人游戏中作弊

4
我正在规划一款基于物理的Java竞技多人游戏,将涉及大量的碰撞检测和流体模拟。出于服务器负载原因,我希望客户端进行这些操作。每个玩家控制一个车辆,可以相对独立地进行模拟。 Multiplayer billiards game physics simulation中的被接受答案(在服务器端进行模拟!)在我的情况下完全不切实际。仅模拟几辆车就会占用中档PC的大部分资源。
我考虑让客户端模拟自己的车辆,并由服务器向其他客户端广播其结果并调解碰撞。使用服务器的空闲CPU进行偶尔的物理审核可以在一定程度上防止作弊。由于客户端已经发送所需的状态,因此客户端不会知道何时进行审核。
如果有人作弊,我不会失去任何东西,因为这个项目只是为了好玩。

1
这已经是一个解决的问题,在网上有相关的白皮书。基本上:你只能信任服务器,但客户端应该向玩家提供“准确的体验”。 - user166390
此外,“模拟几辆车就会占用中档PC的大部分资源”听起来像是物理引擎采用了次优的方法/实现。 - user166390
@pst 我必须给客户一些信任。组合物理负载对于一个服务器来说太多了。客户可以违反它的信任,但只有在下一次审计(被踢出)之前。至于“次优”的实现:让我们只说车辆由数十万个块组成,以用户定义的配置为基础。 - user1354999
如果你的车辆由数十万个方块组成,而物理无法简化或以其他分辨率处理,则我会屈服,因为系统的强大令人惊叹。 - user166390
你可能应该对服务器进行合理性检查,并信任玩家进行详细计算。这将防止严重的作弊行为,但并不能完全阻止它。 - Philip Whitehouse
1个回答

1
在您提到的情况下,可以采取的一种减轻服务器负载的方法是让每个客户端模拟自己的车辆以及一个或多个随机车辆,并在一定时间间隔内随机更换。
这可以降低审核所需的服务器资源数量,使您的审核更加频繁。如果不同玩家报告的数字存在差异,您的服务器可以检查谁在作弊(被审计者还是审计员)。如果每个玩家的变量由两个或更多其他玩家计算,这些玩家是随机选择的并且在足够频繁的时间间隔内更改,那么您就可以减少玩家合作作弊的可能性。
如果您正在Java(JVM)环境下编写服务器,则可以使用Akka库来帮助您分发计算。

我希望尽可能地将信息隐藏在客户端之外,但这仍然是一个有效的想法。Akka库听起来很有趣,但在这种情况下可能过于复杂了。感谢您的建议! - user1354999

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