Answers:
出于安全原因,如今大多数MMO在服务器端都有重要的工作。您不能为客户端减轻很多负担,这就是为什么首先要取消AI例程的原因。我认为大多数开发人员通常都将客户端视为可入侵的,而不是例外。
Scalify的Badumna(http://www.scalify.com/badumna.php)试图在客户端上卸载部分代码,因为它们将在客户端进行计算并相互发送;某些数据也将像专用服务器一样,发送到授权对等方进行验证,然后再传递给客户端。问题是,如果您要防止作弊,则必须通过权威对等方发送多人游戏中的所有数据。我提出了Badumna,因为它看起来似乎最接近您想要的东西,但是即使那样也无法捕捉作弊者-它可能会捕捉一些骗子,但是任何关键的事情(即,几乎所有事情)都必须在服务器上完成-侧。
我可能会在Badumna上进行扩展,因为它仍然可以使您发现有用(但是我敦促您重新考虑减轻客户端上的重要负载,因为客户端会作弊)。
Badumna提供了用于数据操作的混合体系结构。它为开发人员提供了完全的控制权,以决定什么是关键(必须验证)和什么不是关键(因此可以由分散式网络发送)。
如果MMO要求每位信息都必须经过验证,则Badumna将充当客户端-服务器解决方案。但是,我相信有不同类别的MMO应用程序具有不同的要求。例如,一个MMO通常会在战斗区域中让玩家作弊,因此必须核实每一个信息。但是,在某些区域中,玩家只能走路/跑步/跳舞/聊天。这样的区域不需要完全验证,并且可以利用Badumna的分散式网络,并从其可提供的可伸缩性中受益。
其次,Basumna提供了开发人员可以访问的其他安全功能,例如身份保护(这样用户就不能假装成为别人),投诉代理(允许客户端配置为向可信任的来源报告恶意/欺诈玩家)和黑名单。 (禁止恶意玩家进入游戏)。
我并没有真正探索Badumna,所以可能有一些我不知道的问题和功能,但是至少我对此有个粗略的浏览。
tl; dr:客户端实际上应该只是连接互联网的键盘和鼠标。
简短的答案是对于标准MMO,AI计算始终由服务器执行。
有些游戏会要求客户尝试预测AI,这样NPC的反应似乎会更快,但这只是一种幻想。真正的NPC始终由服务器控制。
MMO是面向公共(Internet)的服务器。您希望能够完全控制的所有内容均不应为公众所用,否则您就有冒险让攻击者控制NPC的风险。除非您对命令进行某种形式的加密(这会影响性能),否则您不能相信客户端仅运行自己的代码。
预测客户端上的NPC移动以补偿滞后是一个好主意。从理论上讲,您可以在客户端程序中包含所需的尽可能多的AI行为,并使它们定期同步-但是允许客户端决定NPC的行为将使客户端有可能迷惑游戏世界。如果客户端与服务器上的游戏世界失去同步,那么最终您将获得无法控制的流氓NPC。
实际上,这很可惜,因为在客户端上分发AI可能会影响可伸缩性。
要以其他答案为基础,在验证比原始计算更容易的情况下(或仅偶尔进行抽查足以捕获作弊者的情况下),“卸载并验证”策略确实很有用。
例如,如果您让客户端执行A *寻路并将结果发送到服务器,则服务器只需要做的工作就是检查a)路径是否有效,b)没有更短的路径。检查路径有效性应该很容易,并且比起寻找最佳路径开始,检查最佳性可能要容易得多,因为现在您需要检查的路径长度有一个上限。(特别是,如果客户返回一条直线路径,则只要它是有效的,显然是最佳的。)老实说,我不知道这个特殊的技巧在实践中是否有用,但是我看不到任何基本障碍对它。
但是请注意,如果将NPC AI卸载到客户端,那么被黑客入侵的客户端可能会使用它提前预测NPC行为。对于某些类型的游戏或情况,这可能是一个严重的问题。
在服务器端处理一些复杂的非游戏关键操作时,最好在服务器端使用一些简单的AI例程和关键游戏计算。
例如,服务器知道敌对的NPC在哪里以及玩家角色在哪里。当玩家角色进入NPC的范围内时,可以进行服务器端计算以查看NPC是否应攻击玩家,并且可以执行简单的寻路路由来确定NPC到达玩家所需的时间。
将NPC转换为攻击状态后,客户端即可处理动画和细粒度的路径查找。当NPC距离客户端足够近以进行攻击时,服务器可以执行计算以查看攻击是否击中,造成的损害等...
您需要确保真正影响游戏结果的所有计算均由服务器处理并传递给客户端,而非关键性计算则由客户端处理。
在最简单的情况下,您将使客户端与服务器期望的位置保持同步,服务器将进行验证,然后客户端将再次进行计算。