Ascent代码分析4-World之地图管理及实现结构
Wow世界中的地图有两种:场景地图和副本地图.
场景地图只有一个实体,一般比较大。如东部王国、卡里姆多和外域分别是一个整张的地图(各个地图间传送的港口也是单独的地图)。
副本地图是同样的地图场景,但却有多个不同的实体。比如各种副本和战场,都属于副本地图。
InstanceMgr:将负责整个世界的地图创建和保持。每个地图(以及每个副本)将以MapMgr的形式创建,MapMgr主要负责地图中玩家和npc怪物的逻辑管理和运算。世界地图的MapMgr放在m_singleMaps中,副本的MapMgr则在每个Instance:: m_mapMgr中(也就是说每个副本都会有一个MapMgr,但是当没有副本存在时也不会有副本的MapMgr。而世界地图则固定有一个MapMgr)。 Map中的_terrain则加载了地图文件中的地形信息,包括水体深度和地面高度信息等。而Map也将主要负责地图信息和地形信息的管理。下面分别描述:
注:如上图,MapMgr派生自CThread,也就是说每个地图和副本都会有一个线程。这样使不同的地图的运算分离,也能充分利用多cpu的性能,但是当用户量大的时候可能会产生大量的线程,不太确定这种方法的优劣。不过如果线程在可以承受的范围内的话,这样也可以避免一个玩家操作卡时导致整个服务器都卡的情况,至多也就是当前地图副本的玩家卡。
MapMgr:
MapMgr派生自CThread和CellHandler<MapCell>,在创建时会加入到线程池中运行,当终止线程时,MapMgr会删除自己释放内存。父类CellHandler是个模板类,把地图分为多个单元格MapCell,将地图上的npc和玩家划分为多个小子集分别处理.当当前单元格和相邻的单元个都没有玩家的时候,会将单元格设置一个
延迟unload事件:
sEventMgr.AddEvent(_mapmgr, &MapMgr::UnloadCell,(uint32)_x,(uint32)_y,MAKE_CELL_EVENT(_x,_y),sWorld.map_unload_time * 1000,1,0);
在一定时间后如果还没有玩家进入就unload该单元格以及其中的npc,以节省资源。
MapMgr则在Do函数(实际上是运行在run()函数执行线程中)中循环调用_PerformObjectDuties()函数,以间隔时间刷新该地图中所有对象(npc,宠物,玩家,gameObject,session等)的状态和逻辑运算。
Map:
成员TerrainMgr同样将地图的地形分为单元格(成员CellInformation),实现了地形的动态加载和卸载(这个与MapCell的加载和卸载是一起的,但是没有设置延时,是立即释放的。当玩家在两个格子间频繁切换时会影响性能。)
Map本身则负责了怪物刷新点(spawns)的载入和维护管理。
InstanceMgr:
InstanceMgr初始化时将为每一个地图创建一个Map,为每一个非副本地图创建一个MapMgr:
void InstanceMgr::_CreateMap(uint32 mapid)
{
if( mapid >= NUM_MAPS )
return;
MapInfo * inf;
inf = WorldMapInfoStorage.LookupEntry(mapid);
if(inf==NULL)
return;
if(m_maps[mapid]!=NULL)
return;
//初始化一个map,并将指针放入数组
m_maps[mapid] = new Map(mapid, inf);
if(inf->type == INSTANCE_NULL)
{
//如果不是副本地图则创建世界地图副本(实际的实现是为其创建一个MapMgr并放入线程池执行)
_CreateInstance(mapid, GenerateInstanceID());
}
}
副本的MapMgr将在创建副本对象时动态创建,
//跟创建世界地图副本的函数是不同的两个重载函数
MapMgr * InstanceMgr::_CreateInstance(Instance * in)
{
in->m_mapMgr = new MapMgr(m_maps[in->m_mapId], in->m_mapId, in->m_instanceId);
in->m_mapMgr->pInstance = in;
in->m_mapMgr->iInstanceMode = in->m_difficulty;
in->m_mapMgr->InactiveMoveTime = 60+UNIXTIME;
ThreadPool.ExecuteTask(in->m_mapMgr);
return in->m_mapMgr;
}
Instance的创建在InstanceMgr::GetInstance(Object* obj)时动态创建,当instance绑定到一个MapMgr以后,就以MapMgr的形式单独运行,直到_DeleteInstance时,将设置MapMgr终止线程。
Ascent代码分析4-World之地图管理及实现结构相关推荐
- MS08067 第一期 “恶意代码分析”实战班 正式开班~
文章来源|MS08067安全实验室 恶意代码分析实战班 恶意代码分析的分类: 恶意代码分析也可作为单独的安全专业类别来看待,不过总体是偏逆向方向的,希望的受众是逆向相关的就行了,比如以前只会逆向但是不 ...
- 管理Discuz!代码分析的收集整理
管理Discuz!代码分析的收集整理 1.后台结构 @�L^SD+k#G0 后台首页提供了常用操作:用户(组)编辑,论坛基本备份等. k XS7]+mB8H0 2.PHPChina 开源社区门户&qu ...
- 【Linux 内核 内存管理】物理分配页 ⑨ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | retry 标号代码分析 )
文章目录 一.retry 标号代码分析 二.retry 标号完整代码 在 [Linux 内核 内存管理]物理分配页 ② ( __alloc_pages_nodemask 函数参数分析 | __allo ...
- 控制台RPG开发教程8: 代码分析和调整
本次教程的内容: 隐藏光标 代码分析练习 c++中的名字 数组越界的分析 上次课程最后代码的运行效果,在我看来至少还有两个明显的不合理之处,不知道你发现没有? 1 英雄移动过程中,身边始终跟着一个闪烁 ...
- cartographer 代码分析
相关注释代码链接为:cartographer代码注释 代码主要分为两个部分,其一为cartographer的核心实现,另一个为cartographer的ros封装壳.首先介绍其ros封装,可以看到大概 ...
- 使用Hadoop和ELK进行业务代码分析!分分钟捉到Bug!
大数据是计算领域的新高地,它有望提供一种方法来应对二十一世纪不断增长的数据生成.越来越多的大数据爱好者正在涌现,越来越多的公司正在采用各种大数据平台,并希望提出以客户为中心的解决方案,帮助他们在竞争激 ...
- 20155317《网络对抗》Exp4 恶意代码分析
20155317<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用 ...
- 模块加载过程代码分析1
一.概述 模块是作为ELF对象文件存放在文件系统中的,并通过执行insmod程序链接到内核中.对于每个模块,系统都要分配一个包含以下数据结构的内存区. 一个module对象,表示模块名的一个以null ...
- kernel 3.10代码分析--KVM相关--虚拟机创建\VCPU创建\虚拟机运行
分三部分:一是KVM虚拟机创建.二是VCPU创建.三是KVM虚拟机运行 第一部分: 1.基本原理 如之前分析,kvm虚拟机通过对/dev/kvm字符设备的ioctl的System指令KVM_CREAT ...
最新文章
- 在MAPGIS中,怎么投影多条线段?
- java中对JVM的深度解析、调优工具、垃圾回收
- 物料信息记录中几个常见的数据表
- Python 购物车
- linux目录操作函数
- Flask-1-05-CookieSession
- 数学国里有座天才云集的“疯人院”
- python获取文件夹名_python基础之获取文件目录及名称
- html2canvas截图只截取当前可视区域的问题
- 关于java通过反射 获取/修改 对象属性值的一些注意事项
- 洛谷 P2261 [CQOI2007]余数求和 解题报告
- 使用Hystrix守护应用(1)
- 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——1.2 S5PV210处理器
- Warning:mailcious javascript detected on this domain来由
- x10ti怎么禁用核显_笔电多显卡切换解决方案浅谈(ver2.2)
- Python中文分词库jieba用法代码示例
- 金色传说:SAP-FICO-COPA:创建销售订单时,获利能力段不自动带出,报错消息号KE0C133:特性值 2720000100000001对于特性 EXTWG 不存在 (外部物料组)
- 零基础计算机入门,分享人人可以参考的路线,私藏的干货视频和书单,为你的程序员生涯助力,呐喊!
- AJAX 聊天室实现原理终极解析
- [UE4C++程序]GameModule与Plugin
热门文章
- MY-I.MX6-DEMO Android4.4.2环境搭建
- View控件获得焦点,TextView获得焦点(focusable),自定义TextView使得其获得焦点,View的onFocusChange()
- 小红伞(antivir)无法更新 校验和与控制文件中的说明不匹配 解决方法
- 力扣18. 四数之和
- 基于MATLAB的数字滤波器设计
- 2022年危险化学品经营单位主要负责人复训题库及模拟考试
- Excel计算傅里叶变化FFT
- crazy的比较级最高级_形容词比较级和最高级more, most
- C语言编程>第二十五周 ① 给定程序中,函数fun的功能是:在形参s所指字符串中的每个非数字字符之后插入一个“*”号。
- 软件测试市场前景怎么样,软件测试的发展前景怎么样?