开发笔记(19) : 怪物行走控制
这段时间项目进展还算顺利,叮当同学在盯项目进度,我专心解决程序上的各种小问题。
最近我在协助解决 NPC (包括地图上的怪物)的行为控制以及 AI 的问题。
目前,我们的进度还处在玩家可以通过客户端登陆到服务器,可以在场景上漫游,以及做一些简单的战斗和技能动作的阶段。按最初的设计原则,我们的每个玩家是在服务器上有一个独立的 agent 服务的。目前写到现在,和中间想过的一些实现方法有些差异,但大体上还是按这个思路进行的。 关键是在于去除大部分的回调方式的异步调用;编写的控制流程自然完整,不需要太多的去考虑 agent 行为之外的交互性。
如果丝毫不考虑性能问题,我很想把每单个怪物和 NPC 都放在独立服务中。但是估算后,觉得不太现实。在 这一篇 的最后一段已经提过这个问题了。
今天展开来谈谈我的方案。
我想把怪物的移动行为独立出来做,以减少 AI 的压力。也就是说,地图上所有的怪,在设定的时候,都可以设定他们的巡逻路径,或是仅仅站立不动。我希望在没有外力干扰的时候,处理这些行为对系统压力最小。
我不想让怪在没有任何玩家看见的时候就让它静止不动,因为这样可能会增加实现的复杂性,并在怪物行为较为复杂时,无法贯彻策划的意图。
最好的方法还是把之隔离,使其对系统的负荷受控。同时也可以通过分离,减小实现的复杂性。
这个子系统是这样的:
它可以接收请求,在单张地图上创建出怪物来。它只关心怪物的坐标。通过 ShareDB 和别的服务分享怪物的坐标。因为它只关心和修改怪物的坐标字段,所以适用于任何结构不同的怪物。
在创建出怪物对象后,可以接受指令,给怪物附加上一个行为。这个行为目前可以是静止,巡逻,跟随别的对象。
这个子系统以一个较低的频率(比如一秒一次),按行为去重新计算所有对象的位置。更新位置后,通过 组播服务 通知地图上所有的玩家 agent 。
这个子系统如何和主系统协作呢?
这里所谓主系统就是地图服务器。我们会把怪物的 AI 模块加载进去运行。怪物 AI 模块会由玩家的 agent 去被动驱动。就是说,如果没有 agent 触发 AI 的处理流程,AI 是死的,不占用 CPU 时间的。每个怪物在生成时,同时通知上述子系统构建一个对象,使它可以在地图中游荡。
怪物由子系统驱动游荡时,通过 AOI 子系统,有可能引发相关的处理逻辑。(一般是进入 agent 的视野,进而触发怪物的 AI 处理)
当怪物 AI 模块接管怪物的控制后,通知子系统删除对应对象,然后进入 AI 控制环节。
这个子系统可以分处于独立进程,独立 CPU 中,并且可以调节控制频率。所以我们可以把这些游荡怪物对系统的负载影响减轻到最小。让系统负荷仅和地图上玩家数量正相关。
对于复杂的怪物逻辑,比如副本中的 BOSS 还是可以以 agent 等价的形式放在一个独立的服务中去处理,这和上面的系统并无矛盾。
Comments
Posted by: nemo | (31) July 3, 2012 10:45 PM
Posted by: 独孤残云 | (30) June 26, 2012 11:36 AM
Posted by: 超性福99 | (29) June 11, 2012 02:38 PM
Posted by: holimion | (28) June 6, 2012 10:19 AM
Posted by: outsky | (27) May 31, 2012 09:22 PM
Posted by: hoddddky | (26) May 31, 2012 12:29 PM
Posted by: hoddddky | (25) May 31, 2012 12:23 PM
Posted by: hoddddky | (24) May 31, 2012 12:22 PM
Posted by: richard | (23) May 31, 2012 11:24 AM
Posted by: richard | (22) May 31, 2012 11:21 AM
Posted by: hoddddky | (21) May 30, 2012 07:29 PM
Posted by: hoddddky | (20) May 30, 2012 06:55 PM
Posted by: hoddddky | (19) May 30, 2012 06:53 PM
Posted by: hoddddky | (18) May 30, 2012 06:52 PM
Posted by: richard | (17) May 30, 2012 05:59 PM
Posted by: hoddddky | (16) May 30, 2012 04:12 PM
Posted by: 杀神 | (15) May 19, 2012 09:27 PM
Posted by: 爱早起 | (14) May 18, 2012 09:32 PM
Posted by: tony | (13) May 17, 2012 03:04 PM
Posted by: Anonymous | (12) May 17, 2012 12:57 PM
Posted by: k | (11) May 16, 2012 07:51 PM
Posted by: crazy | (10) May 16, 2012 07:09 PM
Posted by: jimmy | (9) May 16, 2012 11:24 AM
Posted by: Kevin Lynx | (8) May 16, 2012 10:28 AM
Posted by: Kevin Lynx | (7) May 16, 2012 10:18 AM
Posted by: TT | (6) May 15, 2012 08:41 PM
Posted by: Justin | (5) May 15, 2012 08:33 PM
Posted by: ryou zhang | (4) May 15, 2012 08:02 PM
Posted by: tuer | (3) May 15, 2012 07:42 PM
Posted by: 路人 | (2) May 15, 2012 06:34 PM
Posted by: Anonymous | (1) May 15, 2012 06:18 PM