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之地图管理及实现结构相关推荐

  1. MS08067 第一期 “恶意代码分析”实战班 正式开班~

    文章来源|MS08067安全实验室 恶意代码分析实战班 恶意代码分析的分类: 恶意代码分析也可作为单独的安全专业类别来看待,不过总体是偏逆向方向的,希望的受众是逆向相关的就行了,比如以前只会逆向但是不 ...

  2. 管理Discuz!代码分析的收集整理

    管理Discuz!代码分析的收集整理 1.后台结构 @�L^SD+k#G0 后台首页提供了常用操作:用户(组)编辑,论坛基本备份等. k XS7]+mB8H0 2.PHPChina 开源社区门户&qu ...

  3. 【Linux 内核 内存管理】物理分配页 ⑨ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | retry 标号代码分析 )

    文章目录 一.retry 标号代码分析 二.retry 标号完整代码 在 [Linux 内核 内存管理]物理分配页 ② ( __alloc_pages_nodemask 函数参数分析 | __allo ...

  4. 控制台RPG开发教程8: 代码分析和调整

    本次教程的内容: 隐藏光标 代码分析练习 c++中的名字 数组越界的分析 上次课程最后代码的运行效果,在我看来至少还有两个明显的不合理之处,不知道你发现没有? 1 英雄移动过程中,身边始终跟着一个闪烁 ...

  5. cartographer 代码分析

    相关注释代码链接为:cartographer代码注释 代码主要分为两个部分,其一为cartographer的核心实现,另一个为cartographer的ros封装壳.首先介绍其ros封装,可以看到大概 ...

  6. 使用Hadoop和ELK进行业务代码分析!分分钟捉到Bug!

    大数据是计算领域的新高地,它有望提供一种方法来应对二十一世纪不断增长的数据生成.越来越多的大数据爱好者正在涌现,越来越多的公司正在采用各种大数据平台,并希望提出以客户为中心的解决方案,帮助他们在竞争激 ...

  7. 20155317《网络对抗》Exp4 恶意代码分析

    20155317<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用 ...

  8. 模块加载过程代码分析1

    一.概述 模块是作为ELF对象文件存放在文件系统中的,并通过执行insmod程序链接到内核中.对于每个模块,系统都要分配一个包含以下数据结构的内存区. 一个module对象,表示模块名的一个以null ...

  9. kernel 3.10代码分析--KVM相关--虚拟机创建\VCPU创建\虚拟机运行

    分三部分:一是KVM虚拟机创建.二是VCPU创建.三是KVM虚拟机运行 第一部分: 1.基本原理 如之前分析,kvm虚拟机通过对/dev/kvm字符设备的ioctl的System指令KVM_CREAT ...

最新文章

  1. 在MAPGIS中,怎么投影多条线段?
  2. java中对JVM的深度解析、调优工具、垃圾回收
  3. 物料信息记录中几个常见的数据表
  4. Python 购物车
  5. linux目录操作函数
  6. Flask-1-05-CookieSession
  7. 数学国里有座天才云集的“疯人院”
  8. python获取文件夹名_python基础之获取文件目录及名称
  9. html2canvas截图只截取当前可视区域的问题
  10. 关于java通过反射 获取/修改 对象属性值的一些注意事项
  11. 洛谷 P2261 [CQOI2007]余数求和 解题报告
  12. 使用Hystrix守护应用(1)
  13. 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——1.2 S5PV210处理器
  14. Warning:mailcious javascript detected on this domain来由
  15. x10ti怎么禁用核显_笔电多显卡切换解决方案浅谈(ver2.2)
  16. Python中文分词库jieba用法代码示例
  17. 金色传说:SAP-FICO-COPA:创建销售订单时,获利能力段不自动带出,报错消息号KE0C133:特性值 2720000100000001对于特性 EXTWG 不存在 (外部物料组)
  18. 零基础计算机入门,分享人人可以参考的路线,私藏的干货视频和书单,为你的程序员生涯助力,呐喊!
  19. AJAX 聊天室实现原理终极解析
  20. [UE4C++程序]GameModule与Plugin

热门文章

  1. MY-I.MX6-DEMO Android4.4.2环境搭建
  2. View控件获得焦点,TextView获得焦点(focusable),自定义TextView使得其获得焦点,View的onFocusChange()
  3. 小红伞(antivir)无法更新 校验和与控制文件中的说明不匹配 解决方法
  4. 力扣18. 四数之和
  5. 基于MATLAB的数字滤波器设计
  6. 2022年危险化学品经营单位主要负责人复训题库及模拟考试
  7. Excel计算傅里叶变化FFT
  8. crazy的比较级最高级_形容词比较级和最高级more, most
  9. C语言编程>第二十五周 ① 给定程序中,函数fun的功能是:在形参s所指字符串中的每个非数字字符之后插入一个“*”号。
  10. 软件测试市场前景怎么样,软件测试的发展前景怎么样?