您的位置:首页 > 其它

天龙八部服务器端共享内存的设计(2/3)

2012-05-12 15:49 246 查看

六、样例分析——玩家角色数据的存储和共享

服务器端玩家角色对于的类型是class
Obj_Human,里面有角色数据库存储接口的定义:

protected:

//存放所有关于Obj_Human的、从数据库里读取的信息

HumanDB
m_DB;

class HumanDB中拥有内存共享对象指针,以及角色需要存储的数据定义。

private:

//共享内存相关数据

HumanSMU*
m_HumanSMU;
//共享内存数据

HUMAN_DB_ATTR_FLAG*
m_AttrFlag;
//角色属性刷新控制数据

private:

_HUMAN_DB_LOAD*
m_dbHuman
; //角色基本信息

_BAG_DB_LOAD*
m_dbBag
; //角色背包物品信息

_EQUIP_DB_LOAD*
m_dbEquip
; //角色装备信息

_BANK_DB_LOAD*
m_dbBank
; //角色银行物品信息

_SKILL_DB_LOAD*
m_dbSkill
; //角色身上拥有的技能信息

_COOLDOWN_DB_LOAD_FOR_HUMAN*
m_dbCooldown ;
//角色身上的冷却信息

_RELATION_DB_LOAD*
m_dbRelation;
//角色联系人(好友、黑名单)

_ABILITY_DB_LOAD*
m_dbAbility;
//角色学会的生活技能信息以及配方表

_XINFA_DB_LOAD*
m_dbXinFa
; //角色学会的心法信息

_IMPACT_DB_LOAD*
m_dbImpact
; //角色身上所施加的附加效果信息

_MISSION_DB_LOAD*
m_dbMission;
//任务列表

_SETTING_DB_LOAD*
m_dbSetting
; //设置数据

_PRIVATE_INFO_DB_LOAD*
m_dbPrivateInfo;//私人信息

上面这些xxx_LOAD很眼熟,其实在struct
HumanSMU里面有类似定义:

struct
HumanSMU

{

SMUHead
m_SMUHead;

HUMAN_DB_ATTR_FLAG
m_AttrFlag;
//角色属性标志位

_HUMAN_DB_LOAD
m_HumanSM
; //角色基本信息

_BANK_DB_LOAD
m_BankSM
; //角色银行物品信息

_SKILL_DB_LOAD
m_SkillSM
; //角色身上拥有的技能信息

_COOLDOWN_DB_LOAD_FOR_HUMAN
m_CooldownSM ;
//角色身上的冷却信息

_XINFA_DB_LOAD
m_XinFaSM
; //角色学会的心法信息

_IMPACT_DB_LOAD
m_ImpactSM
; //角色身上所施加的附加效果信息

_ABILITY_DB_LOAD
m_AbilitySM;
//角色学会的生活技能信息以及配方表

_MISSION_DB_LOAD
m_MissionSM;
//任务列表

_SETTING_DB_LOAD
m_SettingSM;
//任务列表

_PET_DB_LIST_LOAD
m_PetListSM;
//宠物列表

_BAG_DB_LOAD
m_BagSM;
//角色背包物品信息

_EQUIP_DB_LOAD
m_EquipSM;
//角色装备信息

_RELATION_DB_LOAD
m_RelationSM;
//角色联系人(好友、黑名单)

_PRIVATE_INFO_DB_LOAD
m_PrivateInfoSM;//私人信息

};

再看看HumanDB如何初始化的,看其构造函数(代码太多,删除了一些):

HumanDB::HumanDB(
)

{

//这里获取共享内存存储单元

HumanSMU*
pSMU =
g_HumanSMUPool.NewObj();

m_HumanSMU
=
pSMU;

m_AttrRegSM
=
new
HUMAN_DB_ATTR_REG;

m_AttrReg
=
new
HUMAN_DB_ATTR_REG;

m_AttrFlag
=
new
HUMAN_DB_ATTR_FLAG;

m_dbHuman
=
new
_HUMAN_DB_LOAD ;

//...略过一些对象内存分配

//属性表和DB数据的挂接,用于脏数据判断和数据位置对接

_RegisterDBAttributes();

//属性表和内存共享对象挂接,用于脏数据判断和数据位置对接

_RegisterSMAttributes();

}

1.
Human数据的加载是通过DBCharFullData进行的,检查了一下代码,加载的地方只有两个地方,一个是创建角色的消息响应,另外一个地方是角色登录消息响应,这些都是LonginServer(登录服务器)处理的。

Server\Login\Packets\CLAskCreateCharHander.cpp

Server\Login\Packets\WLRetCharLoginHandler.cpp

角色数据被加载后,发给了WorldServer,又通过WorldServer发送给GameServer。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: