版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwtbn1/article/details/37961695

最近在做一个移动平台上的MMORPG项目,负责服务器的工作,第一次做这种类型的游戏服务器的开发,准备工作时必须的,综合网上的资料和自己的想法,总结了一下AOI的实现方式,从以下三个方面来谈谈。水平有限,本文提出的实现方式可能会很笨拙,但是应付一般的场景还是可以的。
       1、关于怪物主动攻击玩家的检测
如果场景内有N个怪物,M个玩家,则进行一次检测需要计算N*M次玩家和怪物之间的距离,这种方法很笨。一种新的方式是:首先对游戏的场景进行一下划分,如下图,将场景划分成若干个格子,每个网格拥有唯一编号gridId,白色星代表当前玩家的位置,红色网格代表玩家所在的网格区域黄色的为8个临近区域,服务器为每个网格对象维护两个列表:monsterList和playerList,这两个列表记录了在当前网格中的怪物和玩家。

当玩家进入场景后,将玩家当前所在的网格id(curGridId)设置为红色网格的gridId,将周围的8个黄色网格的gridId放入玩家的adjacentGridList中。具体的怪物攻击检测流程:

 

这样处理的好处有:

(1)    只有当玩家移动时才会进行怪物主动攻击玩家的检测。避免了不必要的检测;

(2)    减少了计算怪物和玩家距离的次数,如一开始所述,如果场景内有N个怪物,M个玩家,则进行一次检测需要计算N*M次距离。该方法首先在场景更新线程中判断玩家是否从网格g1进入网格g2,判断时会与周围8个格子的中心点计算,最差的情况是计算8次,但是此处也可以优化,如果知道玩家的移动向量,则只进行一次计算就可以确定玩家是否跨越了格子。怪物攻击玩家检测线程中,只计算玩家当前所在的格子中的怪物与玩家的距离,计算次数为(假设每个格子中怪物和玩家平均分布):(N/格子数量)*(M/格子数量)。

2、怪物移动控制
     游戏中会单独启动一个线程(T_MonsterMove)去执行怪物移动的操作,该线程属于定时线程,以1秒或更短的频率根据怪物的类型更新怪物的位置。并将移动后怪物的坐标信息发送给客户端,T_MonsterMove线程并不需要和主逻辑线程进行同步操作,因为T_MonsterMove线程中移动的怪物都是处于服务器托管的,怪物主动攻击线程检测到玩家进入怪物攻击范围后,会将该怪物从服务器托管列表中移除,交由客户端托管。
     3、怪物和玩家移动等信息的广播范围
在游戏中,我们把格子的大小定义为玩家360度视野的范围。adjacentGridList保存的是玩家相邻的8个格子id和curGridId保存的是当前玩家所在的格子的id。以玩家移动信息为例,只需要将消息发送给这9个格子中的玩家即可。将信息发送给相邻的8个格子的玩家可以避免玩家突然闪进视野的情况发生。

MMORPG服务器场景中的aoi算法思考的更多相关文章

  1. 游戏中的AOI(Area of Interest)算法

    游戏中的AOI(Area of Interest)算法 游戏的AOI算法应该算作游戏的基础核心了,许多逻辑都是因为AOI进出事件驱动的,许多网络同步数据也是因为AOI进出事件产生的.因此,良好的AOI ...

  2. [转]MMORPG服务器架构

    MMORPG服务器架构 一.摘要 1.网络游戏MMORPG整体服务器框架,包括早期,中期,当前的一些主流架构2.网络游戏网络层,包括网络协议,IO模型,网络框架,消息编码等.3.网络游戏的场景管理,A ...

  3. MMORPG服务器架构

    MMORPG服务器架构 一.摘要 1.网络游戏MMORPG整体服务器框架,包括早期,中期,当前的一些主流架构2.网络游戏网络层,包括网络协议,IO模型,网络框架,消息编码等.3.网络游戏的场景管理,A ...

  4. 网络游戏MMORPG服务器架构

    转载于:http://justdo2008.iteye.com/blog/1936795 1.网络游戏MMORPG整体服务器框架,包括早期,中期,当前的一些主流架构 .关键词 网络协议 网络IO 消息 ...

  5. 分布式数据库中的Paxos 算法

    分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...

  6. 京东云罗玉杰:OpenResty 在直播场景中的应用

    2019 年 3 月 23 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·北京站,京东云技术专家罗玉杰在活动上做了< OpenResty ...

  7. 在WebGL场景中管理多个卡牌对象的实验

    这篇文章讨论如何在基于Babylon.js的WebGL场景中,实现多个简单卡牌类对象的显示.选择.分组.排序,同时建立一套实用的3D场景代码框架.由于作者美工能力有限,所以示例场景视觉效果可能欠佳,本 ...

  8. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程

    简述C#中IO的应用   在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...

  9. 超大地图MMORPG的场景管理

    目前在做一个超大地图MMORPG的场景管理部分,客户端通过动态预读解决了超大图量的动态加载,但是在做人物行走的时候遇到了一些问题: 一张地图上的PLAYER和NPC等是存放在一个list中的,地图超大 ...

随机推荐

  1. [LeetCode] 18. 4Sum 四数之和

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...

  2. ABP vNext中使用开源日志面板 LogDashboard

    ABP vNext 使用 logdashboard 本文示例源码:https://github.com/liangshiw/LogDashboard/tree/master/samples/abpvn ...

  3. 【08月02日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2019年08月02日 之间,滚动市盈率历史新低排名. 上市三年以上的公司,2019年08月02日市盈率在300以下的公司. 1 - XD栖霞建(SH600533) - 历 ...

  4. 视觉融合定位github

    1. obr_slam有关的非常有用的github链接: https://github.com/Ewenwan/MVision/tree/master/vSLAM/oRB_SLAM2 2. gnss, ...

  5. ISO C语言新标准(C11)

    新特性[2]有些和C++11是对应的,如线程和UTF-8: 对齐处理(Alignment)的标准化(包括_Alignas标志符,alignof运算符, aligned_alloc函数以及<std ...

  6. vue-v-xxx基于 Vue拓展的 v-xxx 库

    君问归期未有期,巴山夜雨涨秋池. 何当共剪西窗烛,却话巴山夜雨时. 作为vue轻车熟路的老司机,经常会用到一些指令,vue官方提供的指令又太少,无法满足旺盛的欲望,而每次要写一遍,终日郁郁寡欢,从小就 ...

  7. Sitecore 营销分类

    分类法是一种分层结构,可用于识别和组织信息.在Sitecore体验平台中,您可以使用分类法对营销活动进行分类,例如广告,目标和活动.您可以在市场营销控制面板中将分类标签应用于这些项目. 营销分类的四种 ...

  8. WPF Adorner 弹出式工具栏 例子

    源于MSDN 一个问题. 问:如何做出类似word的文字选中后工具栏弹出和动画效果. 我用的是adorner,其实用popup也是可以的. 效果图: 中间黑色部分代表真正的工具栏. xaml代码: & ...

  9. 详解Go变量类型的内存布局

    定义 每当我们编写任何程序时,我们都需要在内存中存储一些数据/信息.数据存储在特定地址的存储器中.内存地址看起来像0xAFFFF(这是内存地址的十六进制表示). 现在,要访问数据,我们需要知道存储它的 ...

  10. CLOS : Common Lisp 的面向对象支持

    1.  defclass   ( :accessor/reader/writer ;   :initarg  ;  :initform 2. defgeneric 3. defmethod ----- ...