版权声明:本文为博主原创文章,未经博主允许不得转载。 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] 416. Partition Equal Subset Sum 相同子集和分割

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...

  2. [LeetCode] 344. Reverse String 翻转字符串

    Write a function that reverses a string. The input string is given as an array of characters char[]. ...

  3. [LeetCode] 62. Unique Paths 不同的路径

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  4. Eclipse JAX-RS (REST Web Services) 2.0 requires Java 1.6 or newer

    pom.xml文件中添加: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins&l ...

  5. 《Interest Rate Risk Modeling》阅读笔记——第五章:久期向量模型

    目录 第五章:久期向量模型 思维导图 久期向量的推导 久期向量 广义久期向量 一些想法 第五章:久期向量模型 思维导图 久期向量的推导 \[ V_0 = \sum_{t=t_1}^{t_n} CF_t ...

  6. 用Java编程能给物联网(IoT)带来什么优势与不同?

    用Java编程能给物联网(IoT)带来什么优势与不同? 这是一个不太容易回答的问题,也是一个适合拿出来与大家讨论的一个话题~首先需要聊聊物联网硬件与嵌入式设备有什么不同.嵌入式设备通常是一个软件一体的 ...

  7. [sonarqube的使用] sonarlint在idea&eclipse中安装与使用

    介绍 ​ 代码质量管理的开源平台,用于管理源代码的质量 通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管 ...

  8. python利用ThreadPoolExecutor实现有任务异常,就终止线程池中的所有剩余任务

    先描述一下场景: 我有一批任务需要放入线程池中去处理,但是一旦线程池中有1个任务出现了异常(抛了Exception)就将线程中尚未开始的任务全部取消不执行. 需要说明的是正在执行的任务因为无法撤销,所 ...

  9. SublimeText3安装Markdown插件

    由于Webstrom对md文件的预览效果并不理想(与实际网页编译效果差别较大),所以我又改用Sublime进行本地编辑,下面介绍一下怎么搭建环境. 插件安装 整套环境我们就需要两个插件:Markdow ...

  10. 前端学习:JS面向对象知识学习(图解)

    前端学习:JS面向对象知识学习(图解) 前端学习:JS(面向对象)代码笔记 JS面向对象图解知识全览 创建类和对象 方式1:使用Object()函数 方式2:使用自变量 方式3:使用工厂函数 创建多个 ...