服务器消息的广播
MMO 的 engine 中,需要解决的最重要的问题之一,就是如何把游戏世界中的状态改变消息正确的通知给需要知道这条信息的玩家。
通常,我们会设定每个玩家的 AOI ( Area Of Interest )。当一个对象发生改变时,它会把消息广播出去;那些 AOI 覆盖到它的玩家会收到这些广播消息。
但是,在我们现在的游戏系统中,简单的 AOI 系统是不够用的。比如,类似 wow 中的盗贼隐身,明明已经离你很近,但是你的 client 却看不见他。诚然,我们可以在 client 判断这个逻辑,对盗贼不于显示,而 engine 依然广播盗贼移动的消息。对于不作弊的 client ,这是个简单的解决方案。但在理论上却提供了看见隐身人的可能性,所以,我期望有更好的方法让 engine 可以只将消息广播到那些必须接收这些消息的 client 。但是,在实现这个同时,又不能让底层 engine 牵扯太多逻辑信息。
这里提出一个简单的方案:
基本的 AOI 系统中,对象只有方位坐标是为 AOI 模块所知的。如果希望让每个玩家的视野有所不同,对于观察者(玩家)可能还需要多设定一个视野半径的参数。如上面举出的盗贼隐身一例,解决那种逻辑这些数据是不够的。
我所构想的系统中,观察者有两个参数,雷达半径和雷达强度;而被观察者除了坐标外,还有一个信号半径的参数。(这里,玩家通常既是观察者又是被观察者;而 npc 是纯粹的被观察者)
雷达半径就是前面所说的视野半径;而雷达强度决定了在离目标一定距离时,可以分辨的最大尺寸的物体。这个尺寸当然不是指对象的模型大小,而是指被观察者的信号半径。
有了这几组数据,我们就可以决定被观察者是否为观察者所见。通常,雷达半径、强度,和物体的信号半径都是不变的。但是,游戏逻辑可以根据需要来改变它们;比如通过装备、升级、战斗时 buffer 等等。不过底层 engine 不需要了解这些逻辑的细节,只需要把基本参数拿出来算一下就可以确定了。
我们把这些属性绑定在对象上,由 engine 决定对象的远程方法应该发给哪些人。进一步的,我们可以给对象的每个远程方法加一个权值,以优化网络通讯。比如,人物对象可以有一些诸如挥手一类的 emote 行为,可以有一个较低的信号半径权值。当一个玩家可以看见 500m 外的一个人物时,或许这个人物正在做的挥手动作他还看不见;直到他们接近到 250m 时才能收到挥手的消息。
这样的系统,对于 3d 第一人称的 mmo 或许会有用。了解过我们公司另一个项目没能很好的解决这个问题,写此文将自己的想法记录之。
Comments
多谢云风大哥,把如此宝贵的开发经验无偿的分享给大家~
Posted by: 独孤残云 | (11) June 7, 2010 09:21 AM
对此我们一般采用如下设计
多种索敌能力和索敌半径
假设角色具备正常视觉,隐身视觉,昏暗视觉,嗅觉,听觉等多项索敌能力,
根据周围其他角色的行为旗标来使用相应的索敌半径
也就是说,可以设计一些能被嗅觉或者听觉能力才能探查到的角色状态
目前FF11在线版中的三消能力,就是这一逻辑做法的具体实现.
Posted by: 榊 | (10) July 5, 2007 02:09 PM
楼下的vast.sourceforge.net也很有启发,居然一直不知道这个项目
Posted by: Mandi Zu | (9) March 24, 2007 10:34 PM
This topic is great, yes not only MMOG , almost EVERY 3d game with multi-player support would have to face this challenge, if we did it well, bandwidth saved, delay reduced, if not thing would be pretty bad....In my own implementation I used a priority list structure at server-side for each player, sort it frequenty, send server/client replication based on that priority list, some 3d-space visibility is also helpful to decide which player is relevant and which is not....
Posted by: Mandi Zu | (8) March 24, 2007 10:31 PM
http://vast.sourceforge.net/
从另一个角度讲解AOI.
Posted by: ro4tub | (7) October 27, 2006 12:36 PM
这个方法在很多游戏的NPC AI中都有使用,只不过这里用在消息广播上面,主意不错.
http://www.aiseek.com 一个硬件加速游戏AI的东东,用于网游也是不错的,可以减轻CPU负担,只是还处于开发阶段.
Posted by: wangdali | (6) October 17, 2006 05:06 PM
在没有念到强度这个概念之前,我想到了用view mask来解决盗贼隐身时候的显示问题.
不过看过强度这个概念后,觉得更妙,有点网络通讯LOD的意思
Posted by: LOGOLS | (5) October 9, 2006 06:42 PM
呵呵,因为玩 eve 比较多,所以借用了 eve 里的名词。原理也是类似的,只是 eve 用于游戏系统,我们用于 engine 设计了。
Posted by: Cloud | (4) October 4, 2006 10:12 AM
In fact, it is more or less the same as EVE's setting.
Posted by: Felix | (3) October 4, 2006 09:35 AM
very interesting idea!
Posted by: Li Zhuang | (2) October 4, 2006 02:58 AM
学习了。
Posted by: Anonymous | (1) October 3, 2006 09:44 AM