多人/在线游戏编程中最常见的新手错误?

时间:2009-03-06 00:19:43

标签: network-programming

你看过什么样的新手错误以及治疗方法是什么?

一次又一次发生的是客户端没有以任何方式对服务器进行检查。

例如:

  • 用户可以反编译Flash游戏源或收听网络流量并查看高分数据的去向,并在那里发送虚假高分甚至不玩游戏。
  • 用户使用培训师并获取甚至可能不会出现在当前级别的项目。这发送到服务器,如“客户端X得到项目Y”,服务器只接受。

简单的治疗方法当然只是将游戏客户端作为服务器的API来处理。然后用户可以尽可能多地使用训练器和其他内存操作,但服务器只是说你不能这样做。将服务器视为一个数据库,您可以在其中使用游戏规则查询事物。

例如

  • 客户:开始游戏
  • 客户端:连接到服务器
  • 客户:查询服务器的可用资金金额
  • 用户:启用将资金设置为无限的培训师
  • 客户端:server.buyItem('非常昂贵')
  • 服务器:检查游戏状态(用户现在可以买东西)。检查玩家[0] .money - >没有奖金。
  • 客户:server.buyItem('可以得到这个')
  • 服务器:检查游戏状态(用户现在可以买东西)。检查玩家[0] .money,好的。 player [0] .items.add('可以得到这个')这将降低玩家[0] .money的成本。然后通知客户端发送(播放器[0],'项目','可以得到这个');发送(播放器[0],'钱',播放器[0] .money)。

另一种方法是记录客户端的移动并将其发送到服务器播放它的高分服务器。当然,这可能导致该记录非常大。

3 个答案:

答案 0 :(得分:6)

毫无疑问,盲目信任客户。在我正在开发的游戏中,我们现在将所有“业务逻辑”保留在服务器端,并让客户机只向我们发送他们正在制作的命令;例如“玩家B想要向右移动” - 但是服务器会计算他们移动到右边的距离。这有一个性能开销(当然还有可以更好地处理滞后的问题),因此可能的中间地点可能是在客户端进行繁重的计算,并且仍然在服务器上进行检查;例如,检查客户端的播放器是否在更新之间的时间内移动超过了所谓的可能性;即如果最大播放器速度为200单位/秒,如果您在0.5秒后获得更新,表示他们移动了150个单位,则启动它们。

当然,这并不一定会阻止某人编写机器人来发送这些按键,因此还有其他方法可以防止这种情况发生。尽管如此,根本没有任何验证是一个新手的错误(当然,当我选择快捷方式时,我确实感到内疚)

答案 1 :(得分:6)

Valve采取的方法(至少在某一点上)是让客户和服务器独立模拟游戏。然后,服务器执行权威模拟,并向所有客户端发送状态更新,以纠正错误/黑客攻击。

E.g。如果按左箭头,你的角色会立即向左移动;没有等待服务器说'OK'。但如果事实证明你已经通过墙壁自我攻击,那么下一次服务器更新将使您出现在墙旁边,因为服务器认为它是稳固的。

同样,如果客户端看到一个字符向前移动,它将假定它将继续向前移动,直到服务器返回权威响应。

当服务器做出主要决策(并在模拟过程中执行健全性检查)时,这种方法会破坏黑客攻击,并且在客户端做出预测之前处理延迟,直到他们从服务器获取消息为止。

与“信任客户”相关的另一个重大错误是认为您的网络协议不能伪造。人们倾向于假设如果他们将二进制块发送到服务器,那么这些二进制块将永远不会被逆向工程,并且没有人会试图弄乱数据以查看发生了什么。这导致了各种各样的问题。

答案 2 :(得分:1)

你们几乎已经涵盖了服务器信任客户端可能出现的所有问题。我无法想到其他真正的问题。

所以不要告诉你什么可能出错,而是看看能做些什么。

Valve已经在他们的netcode中投入了大量的精力。读起来