最近在做一个MMO+SLG的游戏,记录一下大地图实体管理策略。
用的是最基础的“划格子”方法,考虑原因是SLG游戏的地图基本来说实体分布还是比较均匀的,适合把大地图划成规整的格子,另外上下左右滑屏也适合做“9屏”的实体数据同步方式(据说服务器框架原来做的是MMORPG,莫非划格子也适合MMORPC?待验证)。
具体实现方法:
客户端:
1.取一点为“焦点”(图中五角星),一般为屏幕中心点或者左下角的unity position;
2.拖动屏幕时,检测焦点所在的“屏”是否发生变化;
3.若发生变化,把当前焦点坐标发给服务器(如果前后端坐标和格子转换关系一致,也可以发格子索引)。
服务器:
1.整个地图按照均匀格子划分;
2.所有的实体先分类(建筑/部队/NPC/怪物/...),再把实体的id索引到各个格子里;
3.当实体的位置发生改变,或者新增/删除实体时,维护各个格子里的实体索引;
4.当收到客户端发来的焦点坐标,转换算出中心格子,及周围共9个格子,跟当前的9个格子做对比,新的格子遍历里面的实体发送“同步实体数据”协议,旧的格子发送“删除实体”协议,使客户端一直维持9屏范围内的实体数据。
使用“划格子”划分区域的优劣势。
优势:
1.实现比较简单;
2.SLG游戏相对是比较规正的地图,各个格子里维护的实体数不会相差太大。
劣势:
1.相比四叉树和BVH,每个格子里可能维护的实体很多,如果有场景碰撞检测的需求,寻找碰撞实体开销略大,比如一个箭塔发射一个范围技能,打到的位置刚好在4个格子的交接处,便要遍历4个格子里的所有实体做碰撞检测;
2.如果实体移动频繁且有碰撞检测需求,比如假设部队有“光环”,移动到的实体附近会影响实体,则用BVH消耗会更低(物体每次移动只需要改变1~2个节点)。
标签:格子,管理策略,实体,地图,碰撞检测,MMO,SLG From: https://www.cnblogs.com/alphaGo/p/17053833.html