游戏服务器之网格屏索引

本文详细介绍了游戏服务器中屏的概念,每屏大小通常设置为屏幕的1/4,并以9屏为视野范围。文章重点讲解了场景服务器的屏索引管理,包括屏索引的说明、容器类型,以及如何添加、刷新和同步有效屏。同时,还讨论了网关服务器的屏索引处理,用于处理玩家的屏信息并广播9屏数据。
摘要由CSDN通过智能技术生成

所谓的屏是指在一定范围内的实体的总称,一般是使用9屏(屏的单位大小是网格)。使用9屏意思是视野范围是9屏,每个屏是1/2屏幕的宽高的大小,别人看到的和自己看到的都是各自9屏内的数据,包括其内的各种实体,如npc 、怪物、场景道具等(特殊的话还有些特效和动态的阻挡如机关)。


 

 1、屏大小

每屏的大小一般设置为4分之1的整个屏幕的大小,就是一半的整屏幕的长和宽。

所以对于页游来说的话,对于一般屏幕是1440*768的显示屏,使用的每个小格子为32*32 像素,一个屏的大小可以设置成屏幕大小的1/4,即23(1440/32/2=22.5)*14(900/32/2=14)格子。

地图的大小一般可以设置成1024 * 1024 个格子的大小(要修改成屏格子大小的整数,宽是24整数,高是13整数)。


地图大小限制:

const nPos MAP_MAX_POS(1024,1024);
//x轴最大的格子坐标
const uint16 MAP_SCREEN_X = (MAP_MAX_POS.x + SCREEN_GRID_WIDTH -1)/SCREEN_GRID_WIDTH;
//y轴最大的格子坐标
const uint16 MAP_SCREEN_Y = (MAP_MAX_POS.y + SCREEN_GRID_HEIGHT -1)/SCREEN_GRID_HEIGHT;
//格子数最大的总数
const uint32 MAP_SCREEN_MAX = MAP_SCREEN_X * MAP_SCREEN_Y + 1;


2、场景服务器屏索引

功能:

使用场景屏索引的有场景玩家、场景npc、场景道具。

数据结构:

所有类型物件的索引(SceneEntrySet all[SceneObject_MAX],所有类型物件的数组,SceneObject_MAX 是所有类型的枚举,)

所有类型物件的按屏索引的物件集合的关联容器(screenMapIndex _posi_index[SceneObject_MAX];  typedef std::map<uint32, SceneEntrySet> screenMapIndex; )

(方便唯一性检查)

所有类型物件的按屏索引的物件序列的关联容器  (screenMapVec _posi_index_vec[SceneObject_MAX];//typedef std::map<uint32, SceneObject_Vec> screenMapVec;) (方便遍历)

具体实现:

(1)屏索引的说明

屏索引可以查找到该索引对应的实体,视野同步时把场景服务器屏索引的数据同步到网关,再发到客户端。


场景索引类nIndexScene ,可以让场景类继承场景索引类。

索引的场景物件类型,SceneObjectType是所有的实体类型的枚举。

 物件类型:

enum SceneObjectType
{
SceneObject_Invalid,/**< 无效类型 */
SceneObject_Player,/**< 玩家角色 */
SceneObject_NPC,/**< NPC */
SceneObject_Item,/**< 场景道具 */
SceneObject_MAX
};

(2)屏索引的容器类型

(2-1)根据屏(坐标哈希值)的屏索引容器(stl的map)的数组

容器1

screenMapVec _posi_index_vec[SceneObject_MAX];//typedef std::map<uint32, SceneObject_Vec> screenMapVec; (其中screen就是场景的屏坐标,类型是uint16(unsigned short))
容器2

screenMapIndex _posi_index[SceneObject_MAX];//typedef std::map<uint32, SceneEntrySet> screenMapIndex; 这个容器的作用只是为了保证_posi_index_vec数据的唯一性

其中:

SceneEntrySet 是实体集合(使用stl的set实现),因为每个实体都是指针,为了避免重复。

SceneObject_Vec 是实体列表(使用stl的vector实现),为的是遍历的效率。使用时会使用SceneObject_Vec


屏相关的实体集合就组成了某种实体的屏索引容器(screenMapIndex _posi_index[SceneObject_MAX])。

为了遍历的效率,使用了SceneObject_Vec 这个stl的vector实现的容器来实现的容器,实际上是SceneEntrySet里面的数据的数据冗余。


容器3

还有实体集合all(SceneEntrySet all[SceneObject_MAX])来冗余一张地图上的所有的类型的实体,主要用来全地图实体处理&

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值